我们都说实践出真知,对于计算机行业更是一句真理,我们将先概要讲解一些基本概念,然后动手快速实现一个Mybatis独立项目(不与SpringMVC、SpringBoot结合)。本文参照 mybatis3文档 ,并添加了一些更通俗的讲解。
一个持久层框架
三个核心对象,分别是SqlSessionFactoryBuilder、SqlSessionFactory和SqlSession。 他们之间的关系就像祖孙三代。SqlSessionFactoryBuilder是爷爷,SqlSessionFactory是爸爸,SqlSession是儿子。因此可以得知SqlSessionFactoryBuilder是为了创造SqlSessionFactory,SqlSessionFactory是为了创造SqlSession。最终的核心是SqlSession
有可能你对mybatis核心还有一些不理解,不过没关系,有了以上的基础概念,我们一起实践使用mybatis,才能更好地理解mybatis核心,等到实践完毕再回过头来查看以上的概念,或许你会有不一样的想法。
新建maven工程,创建完的工程如下图所示:  并在pom.xml文件中添加如下的依赖:
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.6</version> </dependency>我们使用xml文件让爷爷生出爸爸,首先要创建xml文件。那么文件放在哪里呢?我们放在maven工程的resources文件夹下。在resources文件夹下创建核心配置文件mybatis.xml,并且添加如下代码:
<?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> <environments default="development"> <!--多环境,默认环境选择development--> <environment id="development"> <!--具体某一环境,名叫development--> <transactionManager type="JDBC"/> <!--事务管理器使用JDBC--> <dataSource type="POOLED"> <!--development的连接池配置--> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/blog?useSSl=true&useUnicode=true&characterEncoding=utf-8&serverTimeZone=GMT"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> </configuration>xml都是一些语义型的标签,我们可以读出在configuration标签中包含一个environments标签,通过语义我们知道environments可以配置多个环境,默认的是development,我们再看environment标签中一个transactionManager(事务管理器)一个dataSource(数据连接池),这个对于使用JDBC的我们就比较熟悉了。将上述数据连接池的配置修改为自己的数据库连接即可。这样mybatis就可以连接上数据库啦!
好了,说了这么多,这只是工具而已,我们还没有找到爷爷,也还没有生出爸爸呢!只需三句代码即可:
String resource = "mybatis-config.xml";//相对于resource路径 InputStream resourceAsStream = Resources.getResourceAsStream(resource); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(resourceAsStream);第一句告诉刚刚我们写的工具在哪里,第二句就是通过文件流的方式读入文件,第三句就是使用SqlSessionFacotryBuilder创建SqlSessionFactory。是不是很简单?
爸爸生儿子就更简单了,代码如下:
SqlSession session = factory.openSession();我们的mybatis是一个半自动的ORM持久层框架,ORM(Object Relational Mapping)是指关系对象映射,简单来说就是把 编程语言对象 与 数据库库表 映射起来,达到操作对象就可实现操作数据库的目的。本来ORM框架是不需要写SQL语句的,我们只要映射过来,在数组中插入就是往数据库插入,从数组删除就是从数据库删除,修改对象就是修改数据库。半自动就是我们还需要写一些SQL语句,这样能提高灵活性。
为了将 java对象 和 **数据库库表 **对应起来,我们首先需要建立一个java类。如数据库中某个表的结构如下:
-- auto-generated definition create table t_user ( id bigint not null primary key, avatar varchar(255) null, create_time datetime null, email varchar(255) null, nickname varchar(255) null, password varchar(255) null, type int null, update_time datetime null, username varchar(255) null );java类如下:
public class User { private Long id; private String nickname; private String username; private String password; private String email; private String avatar; private Integer type; private Date create_time; private Date update_time; }是不是对应的很整齐呢?现在的对应只是静态的对应,我们还没有实现动态的增删改查呢,那么该如何实现呢?
我们想要操作java类到达操作数据库的效果,我们已经静态的将java类与数据库的表对应起来了,现在我们写一些操作方法来操作java类吧。编写Dao接口
public interface UserDao {//等价于mapper User getUserById(Long id); }过去我们实现接口都是使用java类来实现接口,现在我们使用xml来实现接口。我们一起来实现刚才的getUserById方法吧!
<?xml version="1.0" encoding="UTF8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.zhp.dao.UserDao"> <select id="getUserById" resultType="com.zhp.pojo.User" parameterType="Long">select * from blog.t_user where id = #{id}</select> </mapper>我们在mapper标签的namespace属性告诉框架我们实现的是哪个接口。select标签的id告诉框架我们实现的哪个方法,resultType告诉框架数据库查询出来的结果对应的是哪个java类,这样框架帮我们将 数据库字段 转换为 java对象。 一个xml文件将静态对象 、 dao接口 、 实现方法都串联了起来。这个xml文件骄傲的说我是集大成者,看我知道SQL语句查询出来数据库字段 对应到User类,我也知道我是实现的SQL语句对应的getUserById方法,我还知道这个getUserById方法是UseDao接口的getUserById方法。以后只要你们调用了UserDao接口的getUserById方法,我就去执行SQL语句,然后将结果转换成User类。
到现在为止Mybatis框架还不知道有一个这样的集大成者呢,所以也就不知道User、UserDao等类,害,写了半天mybatis还不知道呢,那么如何让mybatis知道呢?在核心配置文件告诉他。
<configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/blog?useSSl=true&useUnicode=true&characterEncoding=utf-8&serverTimeZone=GMT"/> <property name="username" value="root"/> <property name="password" value="AaA19980818"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/zhp/dao/UserMapper.xml" /> </mappers> </configuration>我们可以看出核心配置文件中加入了一个mappers标签和mapper子标签,现在mybatis框架知道了有一个这样的集大成者了!
上面的三句是老朋友了,下面8-12行也非常容易理解。8行打开会话,9句实现Dao接口,10句调用方法,11句输出结果,12句关闭会话。是不是很简洁?
到此为止我们已经实现了使用mybatis独立项目,赶快动手实现一下吧!