这是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冢狐”,获取最新消息
发表回复