这是 MyBatis 系列第 1 篇。大略会用十三篇的篇幅来解说 MyBatis,喜爱这个系列的欢送关注公众号【Java 冢狐】获取最新文章。那么废话不多说,让咱们开始吧!
没有 MyBatis 的时代
要说起 MyBatis,那要从还没有 MyBatis 的时代的时候说起。那个时候咱们进行数据库开发的,大多应用 jdbc 来进行。然而 JDBC 的操作数据库用起来真的是头大。非常的繁琐和无聊,很容易呈现问题和谬误。其中具体的状况如下所示:
JDBC 时代
连贯应用数据库的过程:
- 加载驱动
- 获取连贯
- 拼接 sql
- 执行 sql
- 获取后果
- 解析后果
- 敞开数据库
下面这些操作都是咱们应用 jdbc 连贯数据库的时候必须通过的过程。能够看出步骤非常的繁琐,要害是这些步骤中很多都不是咱们程序员真正关怀的,咱们程序员真正关怀的只有拼接 sql、执行 sql 和解析后果。
然而基于 JDBC 得框架下,其余的操作又不得不去编写和操作,使得咱们在代码编写上非常的吃力和冗余,对于程序员来说不是特地的敌对。
JDBC 毛病
正如下面所说的,JDBC 有着一些很致命的毛病,总体来说有一下几个方面:
- 反复代码过多
- 每个操作耗时过多
- 调试保护麻烦
- 动静 sql 方面没有标准,难以保护
正是因为 JDBC 有着一些致命的毛病才导致咱们应用其余的框架来实现与数据库的交互,诸如 Hibernate 和 MyBatis 就是其中比拟好的代表。
Hibernate
介绍 hibernate 之前,咱们先理解一下什么是 ORM?
ORM
ORM:对象关系映射,简略点说就是将数据库中的表和 java 中的对象建设映射关系,能够让咱们操作对象来间接的操作数据库。
ORM 最好的框架就是 hibernate,hibernate 能够让你通过 java 对象来间接的操作数据库。对于开发者来说更加容易上手,也暗藏了底层 jdbc 和 db 的交互过程,对于程序员来说兼容了不同的数据库,然而对程序员来说是无感的。只须要像操作对象一样操作数据库即可
其甚至不便到了即便你不会 sql 也能通过它来操作数据库,能够说是非常的敌对了,尤其是对于初入职场和工作教训差的小伙伴来说。
长处
总结起来长处就是:
- 简化了整个 jdbc 操作过程
- 须要去操作对象,不须要关怀 sql,hibernate 能够帮咱们主动生成所须要的 sql
- 代码移植性比拟好,通过 hibernate 操作 db 都是通过操作对象来进行的,如果咱们须要切换 db 的类型,hibernate 会主动适应,对于开发者业务代码来说不须要做任何业务代码上的调整
- 开发效率比拟高
毛病
正所谓有的就有失,咱们取得了这些不便,那也有一些相应的毛病和有余。
- sql 优化比拟艰巨,各种操作最终发给 db 的,而 sql 是由 hibernate 主动生成的,对于开发者来说如果想干涉最终须要执行的 sql,相对来说比拟艰难
- hibernate 入门比拟容易,精通难
- 对于简单的动静 sql,代码中也须要写很多判断进行组装,动静 sql 这块的反对比拟欠缺
所以说 Hibernate 只适宜做一些简略的零碎,或者是开发周期比拟缓和的零碎,对 sql 优化不高的我的项目。
MyBatis
而 mybatis 将 sql 交由开发者去管制,所以开发者来说比拟无拘无束,没有过多的限度,能够纵情的实现各种公司各种奇奇怪怪的业务和逻辑,在 SQL 优化方面,也是可能施展程序员的能力,堪称是好坏皆有本人定。而 Mybatis 只是帮咱们把重复性的工作优化到了极致,例如操作 db 的过程、动静 sql 的拼接,后果和对象的映射都帮咱们解决实现了,不须要咱们过多的操心和关注。让咱们把更多的精力放在 sql 的编写上,所以这也受到了国内很多大厂的青眼,所以要想年后进入大厂那必须要把握起来。
言而总之 MyBatis:
- 是一款优良的长久层框架
- 简直防止了所有的 JDBC 代码和寿佛那个设置参数以及获取后果集的过程。
- 应用简略的 XML 或者正文来配置和映射原生信息,将接口和 Java 的实体类映射成数据库中的记录
mybatis 开发我的项目的具体步骤
下面说的这么好,总归是骡子是马要拉进去遛一遛,那么接下来咱们就一起搭建一个 Mybatis 我的项目的架子,在下一篇文章中会将其填充实现。并进行演示
Spring 我的项目中引入 mybatis maven 配置
首先第一步就是要引入 mybatis
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
下面的 myba.ve.version 版本,大家能够在 maven 仓库中寻找最新的,或者公司要求的版本。
创立 mybatis 配置文件
当咱们引入 Mybatis 后,接下来就是要编写 mybatis 的配置文件。配置文件为 xml 格局,个别放在 resource 目录下。
如下所示:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties>
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatisdemo?characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</properties>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/user.xml"/>
</mappers>
</configuration>
这个文件次要是对 mybatis 进行全局配置,比方数据源、事务的配置,如下面的 datasource 元素用来配置数据源,数据源中就须要指定数据库的一些配置信息;在这里我就设置了我应用到的数据库的间断信息,大家能够依据本人的数据库更改这个代码。
当初对于代码并不是很理解没有关系,后续的文章会逐渐进行解说和剖析。
创立 mapper xml 文件
这个文件中示意咱们所有对表的操作。实现后而后再由下面的 mybatis 的配置文件来引入,如下所示
<mappers>
<mapper resource="mapper/user.xml"/>
</mappers>
mappers 元素中能够有多个 mapper 文件,咱们开发的我的项目中可能有很多表须要操作,那么对应会有很多 mapper xml 文件,咱们都须要在 mappers 元素中进行引入,而后 mybatis 才会应用到。一般来说一个表对应一个 mapper 文件。
创立 Mapper 接口
下面咱们创立了 mybatis 的配置文件和表操作文件,前面咱们就须要用一个 Mapper 接口来和咱们下面一步中的 mapper.xml 来建设映射关系。
后续当咱们调用 Mapper 接口中的办法的时候,会间接的调用到 mapper xml 中的各种数据的 sql 操作。
Mapper 接口与 xml 文件关联
下面咱们创立了 Mapper 接口和 xml 文件,然而这两者又是如何建设关联的呢?
这就须要 uesr.xml 中进行配置,如下所示
<mapper namespace="zhonghu.mybatis.chat01.UserMapper"
留神下面的 namespace 的值,对应的是 UserMapper 这个接口残缺的援用,通过这个 namespace,UserMapper 接口就能够 user.xml 建设了映射关系。
user.xml 中又有很多 db 操作,这些操作会和 UserMapper 接口中的办法建设映射关系,当调用 UserMapper 中的办法的时候,间接的会调用到 user.xml 中对应的操作。
如 user.xml 中有上面一段配置:
<!-- 批量插入 -->
<insert id="insertBatch" parameterType="map">
<![CDATA[ INSERT INTO `user` (`id`, `name`, `age`, `salary`) VALUES ]]>
<foreach collection="list" separator="," item="item">
(#{item.id}, #{item.name}, #{item.age}, #{item.salary})
</foreach>
</insert>
而 UserMapper 中有个 insertBatch 办法和下面这个 insert 批量插入对应,如下:
/**
* 批量插入用户信息
*
* @param userModelList
*/
void insertBatch(List<UserModel> userModelList);
所以当咱们调用 UserMapper 中的 insertBatch 办法的时候,会间接调用到 user.xml 中的 id =”insertBatch” 这个操作。
上面咱们就能够应用 mybatis 来操作 db 了。
接口和 mapper xml 映射起来间接调用,是通过 java 动静代理实现的。
通过 mybatis 获取 Mapper 接口执行对 db 的操作
下面咱们说了,咱们能够通过 mapper 接口来执行对 db 的操作,获取 Mapper 的次要代码如下:
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession(true);
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
下面代码中应用到了 mybatis 中的外围组件,咱们具体来看一下。
Mybatis 外围对象介绍
SqlSessionFactoryBuilder
这个是一个构建器,是用来构建 SqlSessionFactory 对象的,SqlSessionFactoryBuilder 能够通过读取 mybatis 的配置文件,而后构建一个 SqlSessionFactory 对象。
SqlSessionFactoryBuilder 将 mybatis 配置文件、mapper xml 文件、mapper xml 文件和 Mapper 接口的映射关系,这些都先给解析好,而后放在 java 对象中,java 对象存在于内存中,内存中拜访会十分快的,那么咱们每次去用的时候就不须要从新去解析 xml 了,SqlSessionFactoryBuilder 解析配置之后,生成的对象就是 SqlSessionFactory,这个是一个重量级的对象,创立他是比拟耗时的,所以个别一个 db 咱们会创立一个 SqlSessionFactory 对象,而后在零碎运行过程中会始终存在,而 SqlSessionFactoryBuilder 用完了就能够开释了。
SqlSessionFactory
通过名字能够晓得,这个是一个工厂,是用来创立 SqlSession 的工厂。
如下面所说 SqlSessionFactory 是一个重量级的对象,个别一个 db 对应一个 SqlSessionFactory 对象,零碎运行过程中会始终存在。
SqlSessionFactory 是一个接口,这个接口有 2 个实现 DefaultSqlSessionFactory 和 SqlSessionManager,个别都是通过 SqlSessionFactoryBuilder 来创立 SqlSessionFactory 对象。
通过 SqlSessionFactoryBuilder 来创立 SqlSessionFactory 对象次要有 2 种形式,一种通过读取 mybatis 配置文件的形式,另外一种是硬编码的形式。
SqlSession
咱们通过 jdbc 操作数据库须要先获取一个 Connection 连贯,而后拿着这个连贯去对 db 进行操作,在 mybatis 中 SqlSession 就相似于 jdbc 中 Connection 连贯对象,在 mybatis 中叫做 Sql 会话对象,个别咱们一个 db 操作应用一个 SqlSession 对象,所以这个对象个别是办法级别的,办法完结之后,这个对象就销毁了,这个对象能够调用 sqlSessionFactory.openSession 的办法来进行获取。
咱们能够间接通过 SqlSession 对象来调用 mapper xml 中各种 db 操作,须要指定具体的操作的 id,id 的格局为 namespace. 操作的 id。
Mapper 接口
咱们能够通过 SqlSession 间接调用 mapper xml 中的 db 操作,不过更简略的以及举荐的形式是应用 Mapper 接口,Mapper 接口中的办法和 mapper xml 文件中的各种 db 操作建设了映射关系,是通过 Mapper 接口残缺名称 + 办法名称和 mapper xml 中的 namespace+ 具体操作的 id 来进行关联的,而后咱们间接调用 Mapper 接口中的办法就能够间接的操作 db 了,应用想当不便,Mapper 接口须要通过 SqlSession 获取,传入 Mapper 接口对应的 Class 对象,而后会返回这个接口的实例,如:
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
最初
- 如果感觉看完有播种,心愿能关注一下,顺便给我点个赞,这将会是我更新的最大能源,感激各位的反对
- 欢送各位关注我的公众号【java 冢狐】,专一于 java 和计算机基础知识,保障让你看完有所播种,不信你打我
- 求一键三连:点赞、转发、在看。
- 如果看完有不同的意见或者倡议,欢送多多评论一起交换。感激各位的反对以及厚爱。
——我是冢狐,和你一样酷爱编程。
欢送关注公众号“Java 冢狐”,获取最新消息