为什么使用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方式,最普通的 ...
随机推荐
- vue3.0+vite+ts项目搭建--vite.config.ts配置(三)
vite.config.ts配置 配置路径处理模块 安装ts的类型声明文件 yarn add @types/node -D 通过配置alias来定义路径的别名 resolve: { alias: { ...
- SSM实现支付宝支付
学习支付宝支付 一.支付宝测试环境代码测试 1.下载电脑网站的官方demo: 下载地址:https://docs.open.alipay.com/270/106291/ 2.下载解压导入eclipse ...
- 安装hadoop2.9.2单机版本 jdk1.8 centos7
安装JDK1.8 查看JDK1.8的安装 https://www.cnblogs.com/TJ21/p/13715749.html 安装hadoop 上传hadoop 下载hadoop 地址h ...
- C# 余一问题 奇偶数求和问题
编写程序,用 while 循环语句实现下列功能:有一篮鸡蛋,不止一个,有人两个两个数,多余一个,三个三个数,多余一个,再四个四个地数,也多余一个,请问这篮鸡蛋至少有多少个. using System; ...
- MySQL环境变量配置方法
MySQL配置方法 下载免安装版本的MySQL数据库,大家根据自己的开发环境下载对应版本的数据库,我在此举例的是Windows系统下的配置方法,下载地址如下: https://dev.mysql.co ...
- java抽象类概述特点
1 package face_09; 2 /* 3 * 抽象类: 4 * 抽象:笼统,模糊,看不懂!不具体. 5 * 6 * *特点: 7 * 1,方法只有声明没有实现时,该方法就是抽象方法,需要被a ...
- cygwin -- 在windows平台上运行的unix模拟环境
cygwin是一个在windows平台上运行的unix模拟环境,是cygnus solutions公司开发的自由软件(该公司开发了很多好东西,著名的还有eCos,不过现已被Redhat收购).它对于学 ...
- 学习Java第9天
今天所作的工作: 反射,枚举类型与泛型 明天工作: 1.线程 2.网络通信 所遇到的问题及解决方法: 反射基本思想,泛型类似于类模板. 理解反射太难了,转悠了好半天,关键是理解反射的思想,才容易学.
- Matplotlib直方图绘制技巧
情境引入 我们在做机器学习相关项目时,常常会分析数据集的样本分布,而这就需要用到直方图的绘制. 在Python中可以很容易地调用matplotlib.pyplot的hist函数来绘制直方图.不过,该函 ...
- 计算机电子书 2017 BiliDrive 备份
下载方式 根据你的操作系统下载不同的 BiliDrive 二进制. 执行: bilidrive download <link> 链接 文档 链接 斯坦福 cs224d 深度学习与自然语言处 ...