我们都说实践出真知,对于计算机行业更是一句真理,我们将先概要讲解一些基本概念,然后动手快速实现一个Mybatis独立项目(不与SpringMVC、SpringBoot结合)。本文参照 mybatis3文档 ,并添加了一些更通俗的讲解。

基础概念

什么是mybatis?

一个持久层框架

mybatis的核心?

三个核心对象,分别是SqlSessionFactoryBuilderSqlSessionFactorySqlSession
他们之间的关系就像祖孙三代。SqlSessionFactoryBuilder是爷爷,SqlSessionFactory是爸爸,SqlSession是儿子。因此可以得知SqlSessionFactoryBuilder是为了创造SqlSessionFactory,SqlSessionFactory是为了创造SqlSession。最终的核心是SqlSession

实践

有可能你对mybatis核心还有一些不理解,不过没关系,有了以上的基础概念,我们一起实践使用mybatis,才能更好地理解mybatis核心,等到实践完毕再回过头来查看以上的概念,或许你会有不一样的想法。

使用maven安装

新建maven工程,创建完的工程如下图所示:
image.png
并在pom.xml文件中添加如下的依赖:

  1. <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
  2. <dependency>
  3. <groupId>org.mybatis</groupId>
  4. <artifactId>mybatis</artifactId>
  5. <version>3.5.6</version>
  6. </dependency>

创建核心对象

爷爷生爸爸

我们使用xml文件让爷爷生出爸爸,首先要创建xml文件。那么文件放在哪里呢?我们放在maven工程的resources文件夹下。在resources文件夹下创建核心配置文件mybatis.xml,并且添加如下代码:

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <!--核心配置-->
  6. <configuration>
  7. <environments default="development"> <!--多环境,默认环境选择development-->
  8. <environment id="development"> <!--具体某一环境,名叫development-->
  9. <transactionManager type="JDBC"/> <!--事务管理器使用JDBC-->
  10. <dataSource type="POOLED"> <!--development的连接池配置-->
  11. <property name="driver" value="com.mysql.jdbc.Driver"/>
  12. <property name="url" value="jdbc:mysql://localhost:3306/blog?useSSl=true&amp;useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimeZone=GMT"/>
  13. <property name="username" value="root"/>
  14. <property name="password" value="root"/>
  15. </dataSource>
  16. </environment>
  17. </environments>
  18. </configuration>

xml都是一些语义型的标签,我们可以读出在configuration标签中包含一个environments标签,通过语义我们知道environments可以配置多个环境,默认的是development,我们再看environment标签中一个transactionManager(事务管理器)一个dataSource(数据连接池),这个对于使用JDBC的我们就比较熟悉了。将上述数据连接池的配置修改为自己的数据库连接即可。这样mybatis就可以连接上数据库啦!

好了,说了这么多,这只是工具而已,我们还没有找到爷爷,也还没有生出爸爸呢!只需三句代码即可:

  1. String resource = "mybatis-config.xml";//相对于resource路径
  2. InputStream resourceAsStream = Resources.getResourceAsStream(resource);
  3. SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(resourceAsStream);

第一句告诉刚刚我们写的工具在哪里,第二句就是通过文件流的方式读入文件,第三句就是使用SqlSessionFacotryBuilder创建SqlSessionFactory。是不是很简单?

爸爸生儿子

爸爸生儿子就更简单了,代码如下:

  1. SqlSession session = factory.openSession();

SqlSession执行SQL语句

我们的mybatis是一个半自动的ORM持久层框架,ORM(Object Relational Mapping)是指关系对象映射,简单来说就是把 编程语言对象 与 数据库库表 映射起来,达到操作对象就可实现操作数据库的目的。本来ORM框架是不需要写SQL语句的,我们只要映射过来,在数组中插入就是往数据库插入,从数组删除就是从数据库删除,修改对象就是修改数据库。半自动就是我们还需要写一些SQL语句,这样能提高灵活性。

ORM静态对应

为了将 java对象数据库库表 对应起来,我们首先需要建立一个java类。如数据库中某个表的结构如下:

  1. -- auto-generated definition
  2. create table t_user
  3. (
  4. id bigint not null primary key,
  5. avatar varchar(255) null,
  6. create_time datetime null,
  7. email varchar(255) null,
  8. nickname varchar(255) null,
  9. password varchar(255) null,
  10. type int null,
  11. update_time datetime null,
  12. username varchar(255) null
  13. );

java类如下:

  1. public class User {
  2. private Long id;
  3. private String nickname;
  4. private String username;
  5. private String password;
  6. private String email;
  7. private String avatar;
  8. private Integer type;
  9. private Date create_time;
  10. private Date update_time;
  11. }

是不是对应的很整齐呢?现在的对应只是静态的对应,我们还没有实现动态的增删改查呢,那么该如何实现呢?

Dao接口

我们想要操作java类到达操作数据库的效果,我们已经静态的将java类与数据库的表对应起来了,现在我们写一些操作方法来操作java类吧。编写Dao接口

  1. public interface UserDao {//等价于mapper
  2. User getUserById(Long id);
  3. }

XML实现接口

过去我们实现接口都是使用java类来实现接口,现在我们使用xml来实现接口。我们一起来实现刚才的getUserById方法吧!

  1. <?xml version="1.0" encoding="UTF8"?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.zhp.dao.UserDao">
  6. <select id="getUserById" resultType="com.zhp.pojo.User" parameterType="Long">select * from blog.t_user where id = #{id}</select>
  7. </mapper>

我们在mapper标签的namespace属性告诉框架我们实现的是哪个接口。select标签的id告诉框架我们实现的哪个方法,resultType告诉框架数据库查询出来的结果对应的是哪个java类,这样框架帮我们将 数据库字段 转换为 java对象。
一个xml文件将静态对象 、 dao接口 、 实现方法都串联了起来。这个xml文件骄傲的说我是集大成者,看我知道SQL语句查询出来数据库字段 对应到User类,我也知道我是实现的SQL语句对应的getUserById方法,我还知道这个getUserById方法是UseDao接口的getUserById方法。以后只要你们调用了UserDao接口的getUserById方法,我就去执行SQL语句,然后将结果转换成User类。

把XML文件告诉Mybatis

到现在为止Mybatis框架还不知道有一个这样的集大成者呢,所以也就不知道User、UserDao等类,害,写了半天mybatis还不知道呢,那么如何让mybatis知道呢?在核心配置文件告诉他。

  1. <configuration>
  2. <environments default="development">
  3. <environment id="development">
  4. <transactionManager type="JDBC"/>
  5. <dataSource type="POOLED">
  6. <property name="driver" value="com.mysql.jdbc.Driver"/>
  7. <property name="url" value="jdbc:mysql://localhost:3306/blog?useSSl=true&amp;useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimeZone=GMT"/>
  8. <property name="username" value="root"/>
  9. <property name="password" value="AaA19980818"/>
  10. </dataSource>
  11. </environment>
  12. </environments>
  13. <mappers>
  14. <mapper resource="com/zhp/dao/UserMapper.xml" />
  15. </mappers>
  16. </configuration>

我们可以看出核心配置文件中加入了一个mappers标签和mapper子标签,现在mybatis框架知道了有一个这样的集大成者了!

使用SqlSession执行SQL语句

  1. @Test
  2. public void getUserByIdTest(){
  3. String resource = "mybatis-config.xml";//相对于resource路径
  4. InputStream resourceAsStream = Resources.getResourceAsStream(resource);
  5. SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(resourceAsStream);
  6. SqlSession sqlSession = factory.openSession();
  7. UserDao mapper = sqlSession.getMapper(UserDao.class);
  8. User userById = mapper.getUserById((long) 1);
  9. System.out.println(userById.toString());
  10. sqlSession.close();
  11. }

上面的三句是老朋友了,下面8-12行也非常容易理解。8行打开会话,9句实现Dao接口,10句调用方法,11句输出结果,12句关闭会话。是不是很简洁?

结束

到此为止我们已经实现了使用mybatis独立项目,赶快动手实现一下吧!