本篇主要介绍 SpringBoot集成MyBatis框架,以及使用mybatis框架进行简单的增删改查
 
1.ORM介绍     通俗点说”ORM思想”就是将关系数据库中表中的记录映射成为对象,以对象的形式展现,程序员可以把对数据库的操作转化为对对象的操作,因此ORM的目的是为了方便开发人员以面向对象的思想来实现对数据库的操作。目前最常用的ORM框架是Hibernate和Mybatis,SpringBoot默认集成Hibernate,如果需要集成Mybatis需要额外配置。
2.Mybatis介绍 ##简介    
    MyBatis是一款优秀的支持自定义SQL查询、存储过程和高级映射的持久层框架,消除了几乎所有的JDBC代码和参数的手动设置以及结果集的检索。MyBatis可以使用XML或者注解进行配置和映射,MyBatis通过将参数映射到配置的SQL形式最终执行的SQL语句,最后将执行的SQL的结果映射成Java对象放回。
    与其他的ORM框架不同,MyBatis并没有将Java对象与数据库表关联起来,而是将Java方法与SQL语句关联。MyBatis允许用户充分利用数据库的各种功能,例如存储过程、视图、各种复杂的查询以及某数据库的专有特性。如果要对遗留数据库、不规范的数据库进行操作,或者要完全控制SQL的执行,MyBatis将会是一个不错的选择。
##MyBatis优点
    1.SQL被统一提取出来,便于统一惯例和优化
    2.SQL 和代码解耦,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试
    3.提供映射标签,支持对象与数据库的 ORM 字段关系映射
    4.提供对象关系映射标签,支持对象关系组件维护
    5.灵活书写动态 SQL,支持各种条件来动态生成不同的 SQL
MyBatis缺点     1.编写 SQL 语句时工作量很大,尤其是字段多、关联表多时,更是如此
    2.SQL 语句依赖于数据库,导致数据库移植性差
3.快速上手 3.1创建实体类User 1 2 3 4 5 6 7 public class User  {     private Integer id;     private String name;     private String address;     private String sex;  	..省略方法    } 
 
3.2创建数据库 1 2 3 4 5 6 7 8 9 10 USE  `test` ;DROP  TABLE  IF  EXISTS  `user` ;CREATE  TABLE  `user`  (  `id`  int (11 ) NOT  NULL  AUTO_INCREMENT,   `name`  varchar (32 ) NOT  NULL ,   `address`  varchar (32 ) NOT  NULL ,   `sex`  varchar (8 ) NOT  NULL ,   PRIMARY KEY  (`id` ) ) ENGINE =InnoDB  AUTO_INCREMENT=3  DEFAULT  CHARSET =utf8; insert   into  `user` (`id` ,`name` ,`address` ,`sex` ) values  (1 ,'jack' ,'BeiJing' ,'nv' ),(2 ,'tom' ,'Xi\' an',' na'); 
 
3.3引入相关包 1.MyBatis-Spring-Boot-Starter (依赖上面两个包)
    mybatis-spring-boot-starter主要提供了两种解决方案,一种是简化后的 XML 配置版,一种是使用注解解决一切问题。
1 2 3 4 5 6 <dependency > 	<groupId > org.mybatis.spring.boot</groupId >  	<artifactId >  		mybatis-spring-boot-starter</artifactId >  	<version > 1.3.1</version >  </dependency > 
 
2.commons-lang3(提供了很多工具类具体可参照文章https://blog.csdn.net/u012240455/article/details/79014224 )
1 2 3 4 5 <dependency >     <groupId > org.apache.commons</groupId >      <artifactId > commons-lang3</artifactId >      <version > 3.6</version >  </dependency > 
 
3.4修改application.xml配置 添加:
1 2 3 mybatis.config-locations=classpath:mybatis/mybatis-config.xml mybatis.mapper-locations=classpath:mybatis/mapper/*.xml mybatis.type-aliases-package=com.neo.entity 
 
mybatis.config-locations:配置 mybatis-config.xml 路径,mybatis-config.xml 中配置 MyBatis 基础属性。
mybatis.mapper-locations:配置 Mapper 对应的 XML 文件路径
mybatis.type-aliases-package:配置项目中实体类包路径
##3.5配置启动类
Spring Boot 启动时数据源会自动注入到 SqlSessionFactory 中,使用 SqlSessionFactory 构建 SqlSessionFactory,再自动注入到 Mapper 中,最后我们直接使用 Mapper 即可。
配置方式:
添加注解@MapperScan
1 2 3 4 5 6 7 8 9 10 @SpringBootApplication @EntityScan (basePackages="cn.itcast.sprintBootDemo.domain" )@EnableJpaRepositories (basePackages = {"cn.itcast.sprintBootDemo.repository" })@MapperScan ("cn.itcast.sprintBootDemo.mapper" )public  class  SprintBootDemoApplication   {   public  static  void  main (String[] args)   {       SpringApplication.run(SprintBootDemoApplication.class , args ) ;    } } 
 
 或者直接在 Mapper 类上面添加注解@Mapper,建议使用上面那种,不然每个 Mapper 加个注解会很麻烦。 
3.6在resource目录添加Mybatis.xml 1 2 3 4 5 6 7 8 9 10 11 12 <?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 >     <typeAliases >          <typeAlias  alias ="Integer"  type ="java.lang.Integer"  />          <typeAlias  alias ="Long"  type ="java.lang.Long"  />          <typeAlias  alias ="HashMap"  type ="java.util.HashMap"  />          <typeAlias  alias ="LinkedHashMap"  type ="java.util.LinkedHashMap"  />          <typeAlias  alias ="ArrayList"  type ="java.util.ArrayList"  />          <typeAlias  alias ="LinkedList"  type ="java.util.LinkedList"  />      </typeAliases >  </configuration > 
 
3.7在mapper包下创建UserMapper接口 1 2 3 4 public  interface  UserMapper   {    List<User> findAll ()  ;     User findUserById (Integer id)  ; } 
 
3.8创建UserMapper.xml 该文件的路径必须和对应的UserMapper.java文件在同一目录下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper  PUBLIC  "-//mybatis.org//DTD Mapper 3.0//EN"  "http://mybatis.org/dtd/mybatis-3-mapper.dtd"  > <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper  PUBLIC  "-//mybatis.org//DTD Mapper 3.0//EN"  "http://mybatis.org/dtd/mybatis-3-mapper.dtd"  > <mapper  namespace ="cn.itcast.sprintBootDemo.mapper.UserMapper"  >     <resultMap  id ="BaseResultMap"  type ="cn.itcast.sprintBootDemo.domain.User"  >          <id  column ="id"  property ="id"  jdbcType ="BIGINT"  />          <result  column ="name"  property ="name"  jdbcType ="VARCHAR"  />          <result  column ="address"  property ="address"  jdbcType ="VARCHAR"  />          <result  column ="sex"  property ="sex"  jdbcType ="VARCHAR" />      </resultMap >      <select  id ="findAll"  resultMap ="BaseResultMap" >        SELECT  *  FROM `user`;     </select >      <select  id ="findUserById"  resultMap ="BaseResultMap"  parameterType ="java.lang.Integer" >          SELECT  *  from `user` where id = #{id};     </select >  </mapper > 
 
4.查询全部 刚才快速上手中的UserMapper接口中定义了两个查询功能,直接测试
1 2 3 4 5 6 7 8 9 10 11 12 13 @RunWith (SpringRunner.class ) @EntityScan (basePackages  ="cn.itcast.sprintBootDemo.domain" )@MapperScan ("cn.itcast.sprintBootDemo.mapper" )@SpringBootTest public  class  UserMapperTest   {    @Autowired      private  UserMapper userMapper;     @Test      public  void  testUser ()    {         List<User> users = userMapper.findAll();         System.out.println(users.size());     } } 
 
这块的注解经常会报“could not autowire”,Eclipse 却没有问题,其实代码是正确的,这是 Idea 的误报。可以选择降低 Autowired 检测的级别,不要提示就好。
单击 File | Settings | Editor | Inspections 命令,使用搜索功能找到 Autowiring for Bean Class 选项,将 Severity 的级别由之前的 error 改成 warning 即可。
#5.根据条件查询
1 2 3 4 5 6 7 8 9 10 11 12 13 @RunWith (SpringRunner.class ) @EntityScan (basePackages  ="cn.itcast.sprintBootDemo.domain" )@MapperScan ("cn.itcast.sprintBootDemo.mapper" )@SpringBootTest public  class  UserMapperTest   {    @Autowired      private  UserMapper userMapper;     @Test      public  void  testUser ()    {         User user = userMapper.findUserById(1 );         System.out.println(user);     } } 
 
#6.添加/删除/修改
添加接口
 
添加配置文件
1 2 3 4 5 6 7 <insert  id ="save"  parameterType ="cn.itcast.sprintBootDemo.domain.User"  >     INSERT INTO `user`     (name, address, sex)     VALUES     (#{name}, #{address}, #{sex}) </insert > 
 
测试类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 @RunWith (SpringRunner.class ) @EntityScan (basePackages  ="cn.itcast.sprintBootDemo.domain" )@MapperScan ("cn.itcast.sprintBootDemo.mapper" )@SpringBootTest public  class  UserMapperTest   {    @Autowired      private  UserMapper userMapper;     @Test      public  void  testSave ()    {         User u = new  User();         u.setAddress("河北" );         u.setSex("nan" );         u.setName("张三" );         userMapper.save(u);     } } 
 
7.注意事项 1.UserMapper.xml和UserMapper.java必须在同一目录中
2.UserMaper.xml的namespace的值是UserMapper接口的全路径
3.UserMapper.xml中的id值必须和UserMapper的接口中的方法对应