SpringBoot整合Mybatis,看这篇文章就够了

引言

在国内大部分Java项目的持久层使用的还是Mybatis,是国内的主流持久层技术框架。与Hibernate相比,它是一个半自动化的框架,容易上手,学习成本低,最重要的是方便开发人员实现定制化的sql。

笔者即将要学习的SpringCloud开源开源项目的持久层使用的ORM框架也是Mybatis,所以有必要整几篇有关Mybatis的文章帮助小伙伴们在SpringBoot项目的基础上快速整合Mybatis持久层框架。

1 Mybatis 简介

  • My Batis 官方定义为 MyBatis 是支持定制化SQL 、存储过程以及高级映射的优秀的持久层框架, Mybatis 避免了几乎所有的 JDBC 代码和于动设置 参数以及获取结果集。 MyBatis 可以对配置 和原生Map使用简单的XML或注解 api 使用简单的 XML 或注解,将接口和Java POJO ( Plain Old Java Object,普通的 Java 对象)映射成数据库中的记录

  • 从官方定义可以看出, MyBatis 是基于 SQL到 POJO 的模型,它需要我们提供 SQL 映射关系( XML 或者注解 ,目前以 XML 主)。但是,对于 SQL 和POJO 映射关系 它提供了自动映射和驼峰映射等。 使开发者的工作量大大减少;由于没有屏蔽 SQL ,这对于追求高响应和性能的互联网系统是十分 重要的。此我们可以尽可能地通过 SQL 去优化性能,也可以做少的改变以适应灵活多变的互联网应用。

  • 与此同时,Mybatis还能支持动态 SQL,以适应需求的变化。这样一个灵动的、高性能的持久层框架就呈现在我们面前,这些很符合当前互联网的需要 。因此,MyBatis 成为了国内市场的主流持久层框架。

  • My Batis 的配置文件包括两个大的部分,一个是基础配文件,另一个是映射文件。在MyBatis 中也可以使用注解来实现映射,但是由于功能和可读性的限制,在实际的企业中使用得较少,因此本文不介绍使用注解配置 SQL 方式。

2 Mybatis配置
`

MyBatis是一 个基于SqlSessionFactory 构建的框架 。对于SqlSessionFactory `,它的作用 是生

SqISession 接口对象,这个接口对象是 MyBatis 操作的核心,而在 MyBatis Spring 的结合中甚至可

以“擦除”这个对象,使其在代码中“消失”,这样做的意义是重大的,因为 SqSession 是个功能 性的代码,“擦除”它之后,就剩下了业务代码,这样就可以使得代码更具可读性 因为 SqlSessionFactory的作用是单一 的,只是为了创建核心接口 SqI Session ,所以在 MyBatis 应用的生命 周期中理当只存 SqlSessionFactory 对象,并且往往会使用单例模式 而构建 SqlSessionFactory是通过配置类(Configuration )来完成的,因此对于 mybatis-spring-boot-starter ,它会给予我们在配置 文件( application.properties`` )进行 Configuration配置的相关内容 下面先来看看 Configuration 可以 配置哪些内容,如下图所示:

SpringBoot整合Mybatis,看这篇文章就够了_第1张图片

  • properties(属性): 属性文件在实际应用中一般采用 Spring 进行配置,而不是Mybatis,所以此处不再介绍

  • settings(设置): 它的配置将改变

    MyBatis 的底层行为 ,可以配 映射规则,如自动映射和 驼峰映射、执行器( Executor )类型、缓存等内容,比较复杂,具体配置项可参考 MyBatis 官方网站,链接如下:

    http://www.mybatis.org/mybatis-3/zh/ configuration.html#settings

    在没有与Spring集成时,需要在项目中引入mybatis的jar包

    <dependency>
         <groupId>org.mybatisgroupId>
         <artifactId>mybatisartifactId>
         <version>x.x.xversion>
    dependency>
    

    2.1 使用XML配置获取SqlSessionFactory实例

    String resource = "org/mybatis/example/mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    

  `mybatis-config.xml`配置文件的一个简单示例如下:

  ```xml
  
  
  
   
   
   
   
   
   
   
   
   
   
   
   
   
   
  

以上数据源属性值使用了占位符,注意configuration标签上的文档声明为mybatis配置文件的统一验证文档格式

2.2 使用Java代码获取SqlSessionFactory实例

  //获取数据源
  DataSource dataSource = new DruidDataSource();
  dataSource.configFromPropety(properties);
  //构建事务工厂
  TransactionFactory transactionFactory =
   new JdbcTransactionFactory();
  //构建Environmen
  Environment environment =
   new Environment("development", transactionFactory, dataSource);
  //构建配置类Configuration实例
  Configuration configuration = new Configuration(environment);
  //添加映射类
  configuration.addMapper(BlogMapper.class);
  //获取SqlSessionFactory实例
  SqlSessionFactory sqlSessionFactory =
   new SqlSessionFactoryBuilder().build(configuration);

2.3 从SqlSessionFactory中获取SqlSession

  SqlSession session = sqlSessionFactory.openSession();
  try {
   Blog blog = session.selectOne(
   "org.mybatis.example.BlogMapper.selectBlog", 101);
  } finally {
    //每次操作完必须关闭数据库会话
      session.close();
  }

Mapper文件内容如下:



<mapper namespace="org.mybatis.example.BlogMapper">
 <select id="selectBlog" resultType="Blog">
 	select * from Blog where id = #{id}
 select>
mapper>

Mybatis3使用命名空间namespace来区分不同的dao接口,注意mapper标签上的文档声明为mybatis3映射文件的统一文档验证格式

SqlSession#selectOne是通过SqlSession直接操作Dao接口对应的数据库查询方法,第一个参数必须是带全类名的dao方法,后面的参数为dao方法参数

也可间接通过Mapper类操作,示例如下:

//先通过SqlSession拿到映射类BlogMapper(这个类是通过JDK动态代理增强接口后的类),
//然后再通过BlogMapper调用对应的查询方法
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);

映射文件中查询也可以通过再Mapper接口上对应的方法上添加注解的方式替换,只是这种方式无法满足复杂的sql查询

package org.mybatis.example;
public interface BlogMapper {
 @Select("SELECT * FROM blog WHERE id = #{id}")
 Blog selectBlog(int id);
}

2.4 Mybatis映射文件中常用的标签

  • : 插入标签,代表一条insert sql语句

  • : 更新标签,代表一条update sql语句