这是MyBatis系列第1篇。大概会用十三篇的篇幅来说解MyBatis,喜欢这个系列的欢迎关注公众号【Java冢狐】获取最新文章。那么废话很少说,让咱们开始吧!java
要提及MyBatis,那要从尚未MyBatis的时代的时候提及。那个时候咱们进行数据库开发的,大多使用jdbc来进行。可是JDBC的操做数据库用起来真的是头大。十分的繁琐和无聊,很容易出现问题和错误。其中具体的状况以下所示:mysql
上面这些操做都是咱们使用jdbc链接数据库的时候必须通过的过程。能够看出步骤十分的繁琐,关键是这些步骤中不少都不是咱们程序员真正关心的,咱们程序员真正关心的只有拼接sql、执行sql和解析结果。程序员
可是基于JDBC得框架下,其余的操做又不得不去编写和操做,使得咱们在代码编写上十分的吃力和冗余,对于程序员来讲不是特别的友好。spring
正如上面所说的,JDBC有着一些很致命的缺点,整体来讲有一下几个方面:sql
正是由于JDBC有着一些致命的缺点才致使咱们使用其余的框架来完成与数据库的交互,诸如Hibernate和MyBatis就是其中比较好的表明。数据库
介绍hibernate以前,咱们先了解一下什么是ORM?编程
ORM:对象关系映射,简单点说就是将数据库中的表和java中的对象创建映射关系,可让咱们操做对象来间接的操做数据库。session
ORM最好的框架就是hibernate,hibernate可让你经过java对象来间接的操做数据库。对于开发者来讲更加容易上手,也隐藏了底层jdbc和db的交互过程,对于程序员来讲兼容了不一样的数据库,可是对程序员来讲是无感的。只须要像操做对象同样操做数据库便可mybatis
其甚至方便到了即便你不会sql也能经过它来操做数据库,能够说是十分的友好了,尤为是对于初入职场和工做经验差的小伙伴来讲。app
总结起来优势就是:
正所谓有的就有失,咱们得到了这些方便,那也有一些相应的缺点和不足。
因此说Hibernate只适合作一些简单的系统,或者是开发周期比较紧张的系统,对sql优化不高的项目。
而mybatis将sql交由开发者去控制,因此开发者来讲比较自由自在,没有过多的限制,能够尽情的实现各类公司各类奇奇怪怪的业务和逻辑,在SQL优化方面,也是可以发挥程序员的能力,可谓是好坏皆有本身定。而Mybatis只是帮咱们把重复性的工做优化到了极致,例如操做db的过程、动态sql的拼接,结果和对象的映射都帮咱们处理完成了,不须要咱们过多的操心和关注。让咱们把更多的精力放在sql的编写上,因此这也受到了国内不少大厂的青睐,因此要想年后进入大厂那必需要掌握起来。
言而总之MyBatis:
上面说的这么好,总归是骡子是马要拉出来遛一遛,那么接下来咱们就一块儿搭建一个Mybatis项目的架子,在下一篇文章中会将其填充完成。并进行演示
首先第一步就是要引入mybatis
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency>
上面的myba.ve.version版本,你们能够在maven仓库中寻找最新的,或者公司要求的版本。
当咱们引入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元素用来配置数据源,数据源中就须要指定数据库的一些配置信息;在这里我就设置了我使用到的数据库的连续信息,你们能够根据本身的数据库更改这个代码。
如今对于代码并非很了解没有关系,后续的文章会逐步进行讲解和分析。
这个文件中表示咱们全部对表的操做。完成后而后再由上面的mybatis的配置文件来引入,以下所示
<mappers> <mapper resource="mapper/user.xml"/> </mappers>
mappers元素中能够有多个mapper文件,咱们开发的项目中可能有不少表须要操做,那么对应会有不少mapper xml文件,咱们都须要在mappers元素中进行引入,而后mybatis才会使用到。通常来讲一个表对应一个mapper文件。
上面咱们建立了mybatis的配置文件和表操做文件,后面咱们就须要用一个Mapper接口来和咱们上面一步中的mapper.xml来创建映射关系。
后续当咱们调用Mapper接口中的方法的时候,会间接的调用到mapper xml中的各类数据的sql操做。
上面咱们建立了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动态代理实现的。
上面咱们说了,咱们能够经过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中的核心组件,咱们具体来看一下。
这个是一个构建器,是用来构建SqlSessionFactory对象的,SqlSessionFactoryBuilder能够经过读取mybatis的配置文件,而后构建一个SqlSessionFactory对象。
SqlSessionFactoryBuilder将mybatis配置文件、mapper xml文件、mapper xml文件和Mapper 接口的映射关系,这些都先给解析好,而后放在java对象中,java对象存在于内存中,内存中访问会很是快的,那么咱们每次去用的时候就不须要从新去解析xml了,SqlSessionFactoryBuilder解析配置以后,生成的对象就是SqlSessionFactory,这个是一个重量级的对象,建立他是比较耗时的,因此通常一个db咱们会建立一个SqlSessionFactory对象,而后在系统运行过程当中会一直存在,而SqlSessionFactoryBuilder用完了就能够释放了。
经过名字能够知道,这个是一个工厂,是用来建立SqlSession的工厂。
如上面所说SqlSessionFactory是一个重量级的对象,通常一个db对应一个SqlSessionFactory对象,系统运行过程当中会一直存在。
SqlSessionFactory是一个接口,这个接口有2个实现DefaultSqlSessionFactory和SqlSessionManager,通常都是经过SqlSessionFactoryBuilder来建立SqlSessionFactory对象。
经过SqlSessionFactoryBuilder来建立SqlSessionFactory对象主要有2种方式,一种经过读取mybatis配置文件的方式,另一种是硬编码的方式。
咱们经过jdbc操做数据库须要先获取一个Connection链接,而后拿着这个链接去对db进行操做,在mybatis中SqlSession就相似于jdbc中Connection链接对象,在mybatis中叫作Sql会话对象,通常咱们一个db操做使用一个SqlSession对象,因此这个对象通常是方法级别的,方法结束以后,这个对象就销毁了,这个对象能够调用sqlSessionFactory.openSession的方法来进行获取。
咱们能够直接经过SqlSession对象来调用mapper xml中各类db操做,须要指定具体的操做的id,id的格式为namespace.操做的id。
咱们能够经过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冢狐”获取最新消息