为什么使用Mybatis对JDBC进行包装探究
一、原生JDBC在实际生产中使用存在的影响性能的问题
首先分析使用JDBC的代码:
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try{
//加载数据库驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//通过驱动获取链接
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC", "root", "root");
//定义SQL语句?表示占位符
String sql = "select * from user where username=?";
//获取预处理语句
preparedStatement = connection.prepareStatement(sql);
//设置参数
preparedStatement.setString(1, "张三");
//获取结果
resultSet = preparedStatement.executeQuery();
//遍历结果
while (resultSet.next()){
int id = resultSet.getInt("id");
String username = resultSet.getString("username");
//封装User实例
User.setId(id);
User.setUsername(username);
}
}catch (Exception e){
e.printStackTrace();
}finally {
//释放资源
resultSet.close();
preparedStatement.close();
connection.close();
}
这段代码中存在的问题:
1)数据库在使用频繁链接,释放容易造成系统资源浪费,从而影响系统的性能。
2)从sql,到预处理语句,到结果集的处理都存在硬编码的情况。实际生产中业务sql的变动可能性还是比较大的,频繁修改代码将导致系统不容易维护。
二、如何解决上面的问题使生产上的系统更加有效率
1、对于数据库频繁链接释放,采用数据库连接池初始化的方式解决。
2、对于sql语句的硬编码问题,采用xml配置文件的方式解决。即将sql语句从业务逻辑代码中分离。
3、对于结果集的硬编码,使用java的反射、自省的技术,实现数据库表字段与实例类属性的自动映射。
三、Mybatis解决JDBC效率问题的实现
1、数据库链接及释放:mybatis提供非池化及池化的数据源,在xml配置文件中datasource type可以指定。具体实现在datasource包中。
2、sql语句的硬编码:与实体类对应mapper下XXXmapper.xml文件解决。
以上二个具体实现逻辑为:mybatis提供保存配置文件的缓存Configuration和MappedStatement,其中MappedStatement作为Configuration的属性。
MappedStatement保存mapper.xml映射文件解析后的sql语句,Configuration保存datasource、mappedstatement等其他信息。
具体解析由ConfigurationBuilder和MappedStatementBuilder完成。
3、对于结果集由ResulMap等相关类使用反射或内省实现。
总结:mybatis封装JDBC的大致逻辑为:客户端将数据源、sql语句、返回结果类型等信息保存在xml文件中(也可以是注解),mybatis将这些信息读取到Configuration中保存,
然后通过Executor执行sql,并将返回结果集映射回实体对象。客户端就可以直接使用实体对象即可。总之即客户端需要完成的工作仅为配置即获取结果后使用,
其他中间工作均交由mybatis完成。
如果mybatis是一颗树,那么可以认为mybatis封装JDBC的逻辑即为mybatis的树干。后续分析这颗树干的具体实现。
为什么使用Mybatis对JDBC进行包装探究的更多相关文章
- Mybatis解决jdbc编程的问题
1.1.1 Mybatis解决jdbc编程的问题 1. 数据库链接创建.释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题. 解决:在SqlMapConfig.xml中配置 ...
- Mybatis与JDBC批量插入MySQL数据库性能测试及解决方案
转自http://www.cnblogs.com/fnz0/p/5713102.html 不知道自己什么时候才有这种钻研精神- -. 1 背景 系统中需要批量生成单据数据到数据库表,所以采用 ...
- JavaWeb_(Mybatis框架)JDBC操作数据库和Mybatis框架操作数据库区别_一
系列博文: JavaWeb_(Mybatis框架)JDBC操作数据库和Mybatis框架操作数据库区别_一 传送门 JavaWeb_(Mybatis框架)使用Mybatis对表进行增.删.改.查操作_ ...
- MyBatis、JDBC相关知识
引言 在mybatis的基础知识中我们已经可以对mybatis的工作方式窥斑见豹.但是,为什么还要要学习mybatis的工作原理?因为,随着mybatis框架的不断发展,如今已经越来越趋于自动化,从代 ...
- MyBatis与JDBC的对比
//JDBC的步骤,1.加载驱动.2.获取连接.3.执行sql语句.4.处理结果集.5.关闭资源 Class.forName("com.mysql.jdbc.Driver").ne ...
- MyBatis通过JDBC生成的执行语句问题
我们编程的过程中大部分使用了很出色的ORM框架,例如:MyBatis,Hibernate,SpringJDBC,但是这些都离不开数据驱动JDBC的支持.虽然使用起来很方便,但是碰到一些问题确实很棘手, ...
- MyBatis知多少(17)MyBatis和JDBC
有了MyBatis,就不再需要编写JDBC代码了.像JDBCT这样的API的确非常强大,但使用起来总不免觉得太过繁琐.代码清单给出了一个使用JDBC的示例. 从这个例子中很容易看出,JDBC API会 ...
- MySQL 存储过程实例 与 ibatis/mybatis/hibernate/jdbc 如何调用存储过程
虽然MySQL的存储过程,一般情况下,是不会使用到的,但是在一些特殊场景中,还是有需求的.最近遇到一个sql server向mysql迁移的项目,有一些sql server的存储过程需要向mysql迁 ...
- 关于 MyBatis MyBatis-Spring Jdbc 批量插入的各种比较分析
因为目前SME项目中编写了一套蜘蛛爬虫程序,所以导致插入数据库的数据量剧增.就项目中使用到的3种DB插入方式进行了一个Demo分析: 具体代码如下: 1: MyBatis 开启Batch方式,最普通的 ...
随机推荐
- JAVA-JDK1.7-ConCurrentHashMap-测试和验证
概述 上次记录了关于ConCurrentHashMap的原理以及源码,现在我对其进行有关功能的测试,下面就讲解一下我测试的内容和代码.这些测试主要针对JDK1.7版本. GET安全测试 上一篇写过ge ...
- echart实现实时疫情图
直接上代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> </h ...
- 《剑指offer》面试题55 - II. 平衡二叉树
问题描述 输入一棵二叉树的根节点,判断该树是不是平衡二叉树.如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树. 示例 1: 给定二叉树 [3,9,20,null,null, ...
- Docker 与 K8S学习笔记(十八)—— Pod的使用
Pod 是一组紧密关联的容器集合,它们共享IPC.Network和UTS namespace,是 Kubernetes 调度的基本单元.Pod 的设计理念是支持多个容器在一个 Pod 中共享网络和文件 ...
- 聊聊HTTPS和SSL协议
本文为转载,原文链接http://www.techug.com/https-ssl-tls,作者不详. 要说清楚 HTTPS 协议的实现原理,至少需要如下几个背景知识. 1. 大致了解几个基本术语(H ...
- expect.sh
#!/usr/bin/expect spawn /usr/bin/ssh root@192.168.43.43 -p 22 expect "password:" send &quo ...
- python 小兵(6)函数根据问题详解
_list = []for i in range(3): def func(a): return i+a_list.append(func)for f in _list: print(f(1)) 首先 ...
- 设置redis能远程访问
远程服务器,redis 安装在/opt下redis-4.0.10 cd redis-4.0.10 修改配置文件redis.conf配置文件:(注释掉bind:127.0.0.1)和修改保护模式为no ...
- 你我都会遇到的需求:如何导出MySQL中的数据~ 简单!实用!
目录 你我都有的需求 方式一:tee 方式二:mysql_use_result 推荐阅读 一.给研发同学看的面试指南 二.MySQL-视频 三.进阶MySQL中间件-视频 四.白日梦的云原生-笔记 五 ...
- Serverless Workflow项目
维基百科对工作流的定义是:对工作流程及其各操作步骤之间业务规则的抽象.概括描述.我们认为工作流的主要职责是: 保证结果一致性,提高容错性要求:对错误重试,捕获,执行回滚或补偿逻辑 为长时间运行的流程维 ...