为什么使用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方式,最普通的 ...
随机推荐
- jQuery里的mouseover与mouseenter事件类型区别
JQ里面有mouseover和mouseenter 2个事件类型干着差不多的活,用不好经常出现些小问题. 今天我解释一下原理: 事件类型翻译: mouseover 鼠标移上 mouseenter 鼠 ...
- Zookeeper介绍一
Zookeeper是什么 ZooKeeper是一个开放源码的分布式协调服务,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作.最终,将简单易用的接口和性能高效.功能稳定 ...
- pycharm常用设置项和快捷键
python开发工具pycharm非常人性化,使用方便,功能强大,可以做到与项目配置库结合使用.初次使用,一些设置项和快捷键不那么容易被发现和设置,那么给大家下面总结pycharm常用的设置项和快捷键 ...
- Linux 安装 MySQL 8.0.26 超详细图文步骤
1.MySQL 8.0.26 下载 官方网站下载 MySQL 8.0.26 安装包,下载地址: https://downloads.mysql.com/archives/community/ 需要注意 ...
- 聊聊dubbo协议2
本文已收录 https://github.com/lkxiaolou/lkxiaolou 欢迎star. 在<聊聊dubbo协议>中介绍了attachments在consumer和prov ...
- 在linux下编译android下的opencv,使用cmake的方法
#前一篇帖子实验了build_sdk.py来编译opencv,失败了.#本篇尝试使用cmake来编译#感谢这篇帖子提供的指导:https://www.cnblogs.com/jojodru/p/100 ...
- 安卓无法访问Azure服务器和微软API
Azure服务器保护机制限制移动端访问 必须使用移动app服务来转接api,才可以访问.
- elasticsearch算法之词项相似度算法(一)
一.词项相似度 elasticsearch支持拼写纠错,其建议词的获取就需要进行词项相似度的计算:今天我们来通过不同的距离算法来学习一下词项相似度算法: 二.数据准备 计算词项相似度,就需要首先将词项 ...
- python文档2-unittest单元测试之mock.patch
介绍mock里面另一种实现方式,patch装饰器的使用,patch() 作为函数装饰器,为您创建模拟并将其传递到装饰函数 patch简介 1.unittest.mock.patch(target,ne ...
- MySQL环境变量配置方法
MySQL配置方法 下载免安装版本的MySQL数据库,大家根据自己的开发环境下载对应版本的数据库,我在此举例的是Windows系统下的配置方法,下载地址如下: https://dev.mysql.co ...