MyBatis源码分析(一):从JDBC到MyBatis 介绍MyBatis的背景,为什么要用MyBatis
一、介绍JDBC
JDBC全称Java Database Connectivity,是Java语言规范客户端访问数据库的应用程序接口,所面向的数据库类型为关系型数据库。
JDBC的三层架构图:
JDBC 的 API 提供了以下接口和类:
DriverManager :这个类管理一系列数据库驱动程序。匹配连接使用通信子协议从 JAVA 应用程序中请求合适的数据库驱动程序。识别 JDBC 下某个子协议的第一驱动程序将被用于建立数据库连接。
Driver : 这个接口处理与数据库服务器的通信。你将很少直接与驱动程序互动。相反,你使用 DriverManager 中的对象,它管理此类型的对象。它也抽象与驱动程序对象工作相关的详细信息。
Connection : 此接口具有接触数据库的所有方法。该连接对象表示通信上下文,即,所有与数据库的通信仅通过这个连接对象进行。
Statement : 使用创建于这个接口的对象将 SQL 语句提交到数据库。除了执行存储过程以外,一些派生的接口也接受参数。
ResultSet : 在你使用语句对象执行 SQL 查询后,这些对象保存从数据获得的数据。它作为一个迭代器,让您可以通过它的数据来移动。
SQLException : 这个类处理发生在数据库应用程序的任何错误。
以下是直接使用JDBC的Java代码:
1 public class JdbcTest {
2 public static void main(String[] args) {
3 //数据库连接
4 Connection connection = null;
5 //预编译的Statement,使用预编译的statement的可以提高性能,使用statement操作数据库
6 PreparedStatement preparedStatement = null;
7 //结果集
8 ResultSet resultSet = null;
9
10 try {
11 //加载数据库驱动
12 Class.forName("com.mysql.jdbc.Driver");
13 //通过数据驱动管理类获取数据库链接
14 connection =DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatisdata?characterEncoding=utf-8","root","root");
15 //定义sql语句,其中?标识占位符
16 String sql = "select * from user where id = ?";
17 //获取预处理statement
18 preparedStatement = connection.prepareStatement(sql);
19 //设置参数,第一个参数为sql中参数的序号,第二个参数为设置的参数值
20 preparedStatement.setInt(1,1);
21 //向数据库发出sql查询,查询出数据集
22 resultSet = preparedStatement.executeQuery();
23 //遍历查询结果
24 while(resultSet.next()){
25 System.out.println(resultSet.getString("id")+"->"+resultSet.getString("username")+"->"+resultSet.getString("sex"));
26 }
27 } catch (Exception e) {
28 e.printStackTrace();
29 } finally {
30 //释放资源
31 if(resultSet != null){
32 try {
33 resultSet.close();
34 } catch (SQLException e) {
35 e.printStackTrace();
36 }
37 }
38 if(preparedStatement!=null){
39 try {
40 preparedStatement.close();
41 } catch (SQLException e) {
42 e.printStackTrace();
43 }
44 }
45 if(connection != null){
46 try {
47 connection.close();
48 } catch (SQLException e) {
49 e.printStackTrace();
50 }
51 }
52 }
53 }
54 }
可以看出JDBC的一些缺点:
1. 每次访问数据库都需要创建数据库连接,最后不需要使用还得释放连接,频繁地连接释放连接会造成系统资源浪费,从而影响系统性能;
2. 需要在Java代码里面编写SQL语句,SQL语句发生改动,需要重新编译Java代码,就种硬编码的方式造成代码不易维护的缺点;
3. Preparedstatement中设置的参数要与占位符在数量上一一对应,而且查询的条件不确定,参数或多或少,这就能引起很多麻烦;
4. ResultSet中遍历结果时,需要对应相应数据库字段,这些字段属于硬编码,也不利于系统的维护。
二、介绍Mybatis
Mybatis的前身是iBATIS,是Clinton Begin在2001年发起的一个开源项目,最初侧重于密码软件的开发,后来发展为一款基于Java的持久层框架。2004年Clinton 将iBATIS捐给Apache软件基金会,2010年iBATIS改名Mybatis,算算Mybatis的前后历史也有10多年了。
Mybatis是一款优秀支持自定义SQL查询、存储过程和高级映射的持久层框架,消除了几乎所有的JDBC代码和参数的手动设置以及结果集的检索。Mybatis可以使用XML或者注解进行配置和映射,通过将参数映射到配置中的SQL,形成最终执行的SQL语句,最终将执行SQL语句的结果映射到Java对象返回。
与其他映射框架不同,Mybatis 不是把 Java对象 直接和数据库联系起来,而是把 Java对象 与 SQL语句 联系起来,把对象传进SQL语句来设置参数。
而 Hibernate 这款ORM映射框架是直接将 Java对象 和 数据库表字段 联系起来。
Hibernate 优点
- Hibernate 使用 XML 文件来处理映射 Java 类别到数据库表格中,并且不用编写任何代码。
- 为在数据库中直接储存和检索 Java 对象提供简单的 APIs。
- 如果在数据库中或任何其它表格中出现变化,那么仅需要改变 XML 文件属性。
- 抽象不熟悉的 SQL 类型,并为我们提供工作中所熟悉的 Java 对象。
- Hibernate 不需要应用程序服务器来操作。
- 操控你数据库中对象复杂的关联。
- 最小化与访问数据库的智能提取策略。
- 提供简单的数据询问。
Hibernate的缺点
- 全表映射带来的不便,比如更新时需要发送所有的字段。
- 无法根据不同的条件组装不同的SQL。
- 对多表关联和复杂的sql查询支持较差,需要自己写sql,返回后,需要自己将数据封装为pojo。
- 不能有效的支持存储过程。
- 虽然有HQL,但是性能较差,大型互联网系统往往需要优化sql,而hibernate做不到。
Mybatis 优点
- 易于上手和掌握。
- sql写在xml里,便于统一管理和优化。
- 解除sql与程序代码的耦合。
- 提供映射标签,支持对象与数据库的orm字段关系映射
- 提供对象关系映射标签,支持对象关系组建维护
- 提供xml标签,支持编写动态sql。
Mybatis 缺点
- sql工作量很大,尤其是字段多、关联表多时,更是如此。
- sql依赖于数据库,导致数据库移植性差。
- 由于xml里标签id必须唯一,导致DAO中方法不支持方法重载。
- 字段映射标签和对象关系映射标签仅仅是对映射关系的描述,具体实现仍然依赖于sql。
- DAO层过于简单,对象组装的工作量较大。
- 不支持级联更新、级联删除。
- 编写动态sql时,不方便调试,尤其逻辑复杂时。
- 提供的写动态sql的xml标签功能简单,编写动态sql仍然受限,且可读性低。
- 若不查询主键字段,容易造成查询出的对象有“覆盖”现象。
- 参数的数据类型支持不完善。
- 多参数时,使用不方便,功能不够强大。
- 缓存使用不当,容易产生脏数据。
Hibernate 与 Myabtis 的共同点
- 从配置文件(通常是 XML 配置文件中)得到 sessionfactory.
- 由 sessionfactory 产生 session
- 在 session 中完成对数据的增删改查和事务提交等.
- 在用完之后关闭 session 。
- 在 Java 对象和 数据库之间有做 mapping 的配置文件,也通常是 xml 文件。
Mybatis应用场景:
需求多变的互联网项目,例如电商项目。
Hibernate应用场景:
需求明确、业务固定的项目,例如OA项目、ERP项目等。
总 结:
Hibernate是一个标准的ORM映射框架,程序员无需配置SQL语句,只需要配置好Java对象与数据库的映射文件.hbm.xml,但是对SQL的优化和修改是比较困难的;Mybatis是一个不完整的ORM映射框架,需要程序员编写SQL语句,这很考验程序员的能力,对SQL语句的优化和修改是比较方便的。面对需求量变化比较多的项目来说,选用Myabtis是比较适合的。
MyBatis源码分析(一):从JDBC到MyBatis 介绍MyBatis的背景,为什么要用MyBatis的更多相关文章
- MyBatis 源码分析系列文章导读
1.本文速览 本篇文章是我为接下来的 MyBatis 源码分析系列文章写的一个导读文章.本篇文章从 MyBatis 是什么(what),为什么要使用(why),以及如何使用(how)等三个角度进行了说 ...
- MyBatis源码分析-MyBatis初始化流程
MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简 ...
- MyBatis源码分析-SQL语句执行的完整流程
MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简 ...
- MyBatis源码分析(5)——内置DataSource实现
@(MyBatis)[DataSource] MyBatis源码分析(5)--内置DataSource实现 MyBatis内置了两个DataSource的实现:UnpooledDataSource,该 ...
- MyBatis源码分析(4)—— Cache构建以及应用
@(MyBatis)[Cache] MyBatis源码分析--Cache构建以及应用 SqlSession使用缓存流程 如果开启了二级缓存,而Executor会使用CachingExecutor来装饰 ...
- 【MyBatis源码分析】select源码分析及小结
示例代码 之前的文章说过,对于MyBatis来说insert.update.delete是一组的,因为对于MyBatis来说它们都是update:select是一组的,因为对于MyBatis来说它就是 ...
- MyBatis源码分析之环境准备篇
前言 之前一段时间写了[Spring源码分析]系列的文章,感觉对Spring的原理及使用各方面都掌握了不少,趁热打铁,开始下一个系列的文章[MyBatis源码分析],在[MyBatis源码分析]文章的 ...
- Mybatis源码分析-StatementHandler
承接前文Mybatis源码分析-BaseExecutor,本文则对通过StatementHandler接口完成数据库的CRUD操作作简单的分析 StatementHandler#接口列表 //获取St ...
- 【MyBatis源码分析】环境准备
前言 之前一段时间写了[Spring源码分析]系列的文章,感觉对Spring的原理及使用各方面都掌握了不少,趁热打铁,开始下一个系列的文章[MyBatis源码分析],在[MyBatis源码分析]文章的 ...
- MyBatis 源码分析系列文章合集
1.简介 我从七月份开始阅读MyBatis源码,并在随后的40天内陆续更新了7篇文章.起初,我只是打算通过博客的形式进行分享.但在写作的过程中,发现要分析的代码太多,以至于文章篇幅特别大.在这7篇文章 ...
随机推荐
- RabbitMQie消息列队整理
使用方法过程,这儿只做了windows平台教程 先安装Erlang 编程软件,然后设置环境变量,在安装RabbimMQ ,这儿我下载了一个版本不行,后来换了最新版就好了,以后在使用过程 中如果有问题 ...
- vue-自定义指令(directive )的使用方法
前言 在vue项目中我们经常使用到 v-show ,v-if,v-for等内置的指令,除此之外vue还提供了非常方便的自定义指令,供我们对普通的dom元素进行底层的操作.使我们的日常开发变得更加方便快 ...
- 使用Java操作Excel表格
目录 一.配置第三方库 二.使用Apache POI API 1. 打开Excel文件 2. 选择对应的sheet 3. Sheet接口的基本使用 3.1 获取开头行和结束行 3.2 获取Row对象 ...
- Orchar Core 创建一个模块化的ASP.NET Core应用程序
您将构建什么?您将构建一个模块化的ASP.NET Core MVC Web应用程序,类似于Orchard Core附带的示例"Hello World"应用程序.它包括一个Web应用 ...
- 告别Kafka Stream,让轻量级流处理更加简单
一说到数据孤岛,所有技术人都不陌生.在 IT 发展过程中,企业不可避免地搭建了各种业务系统,这些系统独立运行且所产生的数据彼此独立封闭,使得企业难以实现数据共享和融合,并形成了"数据孤岛&q ...
- Java基础系列(20)- while循环
循环结构 while循环 do-循环 for循环 在java5中引入了一种主要用于数组的增强型for循环 while循环 while是最基本的循环,它的结构为 while(布尔表达式){ //循环内容 ...
- 鸿蒙内核源码分析(忍者ninja篇) | 都忍者了能不快吗 | 百篇博客分析OpenHarmony源码 | v61.02
百篇博客系列篇.本篇为: v61.xx 鸿蒙内核源码分析(忍者ninja篇) | 都忍者了能不快吗 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙 ...
- P7443-加边【博弈论】
正题 题目链接:https://www.luogu.com.cn/problem/P7443?contestId=41429 题目大意 \(n\)个点的一棵有根树,两个人从一号点开始进行有向图博弈. ...
- JVM堆内存泄露分析
一.背景 公司有一个中间的系统A可以对接多个后端业务系统B,一个业务系统以一个Namespace代表, Namespace中包含多个FrameChannel(用holder保存),表示A连接到业务 ...
- Dapr + .NET Core实战(十三)跨语言开发
因为基于Dapr的服务架构是不限语言的,我们来看看Dapr的跨语言开发.我们使用golang,python,.NET来实现跨语言的服务调用,拓扑如下 我们继续使用.NET 5的fontend和back ...