SpringBoot - 整合mybatis、TkMybatis和MyBatis Plus(零基础整合无压力~!)

零、前言

本文提到的内容,都只是最基础的应用,个人学习的同时,记录下来,忘记之后还可查看此文档快速回忆。

参看:

  • Mybatis:https://mybatis.org/mybatis-3/zh/getting-started.html
  • Mybatis plus:https://mp.baomidou.com

环境:
JDK1.8+,MAVEN,IDEA,internet,… …

文章目录

  • 零、前言
  • 一、Mybatis
    • 1.SpringBoot整合Mybatis
    • 2.动态SQL
    • 3.注意的点
  • 二、tkmybatis
    • 1.SpringBoot整合tkmybatis
      • 1.1 tkmybatis启动器
      • 1.2 实体类
      • 1.3 Mapper接口
    • 2.自定义映射文件
    • 3.注意的点
  • 三、mybatis plus
    • 1.SpringBoot整合mp
    • 2.注意的点
    • 3.更多功能
  • 四、结语


在SpringBoot中,使用各种持久层工具都非常的方便,这是基于它的 自动装配原理 而实现。

SpringBoot中实现持久化的步骤

SpringBoot - 整合mybatis、TkMybatis和MyBatis Plus(零基础整合无压力~!)_第1张图片

先约定一下SQL,之后所有的操作都是基于此SQL执行后的表:

DROP TABLE IF EXISTS `user_db`;
CREATE TABLE `user_db` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `username` varchar(32) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1;

INSERT INTO `user_db`(id,username) values
(1,'张三'),
(2,'李四'),
(3,'王二'),
(4,'麻子'),
(5,'王三'),
(6,'李三');

一、Mybatis

配置文件都使用YAML文件。并且Mybatus的是很多公司都在用的框架,虽然需要配置XML文件的CURD。

1.SpringBoot整合Mybatis

目录结构图(提供此图后,对应的文件应该放在对应的包目录下,可千万别放错了哟~)

SpringBoot - 整合mybatis、TkMybatis和MyBatis Plus(零基础整合无压力~!)_第2张图片

SpringBoot官方并没有提供Mybatis的启动器,所以得引入启动器:

如果连接数据库,当然还得引入MySQL的依赖。


<dependency>
    <groupId>org.mybatis.spring.bootgroupId>
    <artifactId>mybatis-spring-boot-starterartifactId>
    <version>1.3.2version>
dependency>

之后就是在application.yml配置文件中编写简单的配置即可

server:
  port: 8080

spring:
  # 标注项目现在环境 dev-开发 test-测试 pro-上线
  profiles:
    active: dev
  # 配置数据源
  datasource:
    username: root
    password:
    url: jdbc:mysql://localhost:3306/test # 我的库是test

#mybatis配置
mybatis:
  type-aliases-package: com.pdh.entity
  mapper-locations: classpath:/mybatis/*.xml # mapper位置,默认扫描这里

之后就是创建实体类User

实体类需要与数据表对应,如果有不对应的字段,需要在mybatis.xml文件中指定表示出来。(映射文件是mybatis.xml)

public class User {
    private int id;
    private String username;
    // 生成getter,setter,构造等方法
}

编写Mapper接口,并加入一个方法find()方法

可以加上@Mapper注解加载Mpper类,但是能够直接在启动类上加@MapperScan(“com.pdh.mapper”)注解扫描指定的包,后者更加简约。

public interface UserMapper {

    /**
     * 查询
     * @param user  condition
     * @return
     */
    public List<User> find(User user);

}

编写映射文件UserMapper.xml

还可使用注解直接注入到Mapper类中对应的方法上,但是并不灵活,这种方式就低耦合一些,还可以实现动态SQL


        DOCTYPE mapper
                PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.pdh.mapper.UserMapper">

    
    <resultMap id="BaseResultMap" type="com.pdh.entity.User">
        <result column="id" jdbcType="INTEGER" property="id" />
        <result column="username" jdbcType="VARCHAR" property="username" />
        
    resultMap>

    <select id="find" resultType="com.pdh.entity.User" resultMap="BaseResultMap">
        SELECT * FROM user_db
    select>

mapper>

此时,各项正常的话就会出现一个 绿色的箭头mybatis.xml里的sql和UserMapper里的方法对应

要在启动类上加上注解:@MapperScan(“com.pdh.mapper”)

之后引入Springboot的测试依赖(有就不用引入)

<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-testartifactId>
    <scope>testscope>
dependency>

测试:在UserMapper类下按快捷键 Alt+Insert 选择新建Test,JUnit4,之后测试类上加上@RunWith(SpringRunner.class)和@SpringBootTest 两个注解:

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserMapperTest {

    @Autowired
    private UserMapper mapper;

    @Test
    void findAll() {
        List<User> list = mapper.find(new User());
        list.forEach(System.out::println); // User类加上toString()方法这里才能看见数据
    }
}

结果:

User{id=1, username=‘张三’}
User{id=2, username=‘李四’}
User{id=3, username=‘王二’}
User{id=4, username=‘麻子’}
User{id=5, username=‘王三’}
User{id=6, username=‘李三’}

测试成功,之后就可以按照步骤搭建Service,Controller了这些模块。


2.动态SQL

在SpringBoot整个Mybatis能运行起来之后,实现动态SQL要怎么做?那你可看好了

前面我们的UserMapper接口中的find()方法需要传入一个User类,就是为了实现动态SQL。实现动态SQL的UserMapper.xml如下:


        DOCTYPE mapper
                PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.pdh.mapper.UserMapper">

    
    <resultMap id="BaseResultMap" type="com.pdh.entity.User">
        <result column="id" jdbcType="INTEGER" property="id" />
        <result column="username" jdbcType="VARCHAR" property="username" />
        
    resultMap>

    <sql id="selectSql">
        SELECT
            *
        FROM
            user_db
    sql>

    <select id="find" resultType="com.pdh.entity.User" resultMap="BaseResultMap">
        <include refid="selectSql"/>
        <where>
            
            <if test="username != null">
                username like '%${username}%'
            if>
        where>
    select>
mapper>

当我们在UserMapper中在此调用find()方法时,在传递的User类中,传递对应的参数即可实现条件查询,不传递参数就查询全部。

测试:

@Test
public void findCondition() {
    //条件查询 username中有 ‘三’ 的
    mapper.find(new User("三")).forEach(System.out::println);
}

测试结果

User{id=1, username=‘张三’}
User{id=5, username=‘王三’}
User{id=6, username=‘李三’}

Mybatis动态sql可以让我们在Xml映射文件内,以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能,Mybatis提供了9种动态sql标签 trim|where|set|foreach|if|choose|when|otherwise|bind


3.注意的点

  1. 手写sql,且手写的SQL必须正确。
  2. 实体类的字段可以由mybatis.xml文件配置与数据库字段对应。
  3. 在启动类上加注解@MapperScan(“com.pdh.mapper”)。

二、tkmybatis

在使用Mybatis的时候要编写大量简单的SQL语句在XML文档中,且数据表结构更改时间,对应的SQL以及实体类都需要更改,对开发人员非常的不友好。为了减轻开发人员的负担,就出现了tkmybatis(通用mybatis)和mybatis plus。

通用Mapper解决了单表增删改查,基于Mybatis的插件。开发人员不需要编写SQL,不需要在DAO中增加方法,只要写好实体类,就能支持相应的增删改查方法。

1.SpringBoot整合tkmybatis

还是创建一个含mysql启动器的SpringBoot项目,再开始之后的整合操作。

1.1 tkmybatis启动器

引入通用mapper之后,就不需要再手动引入mybaits,通用mapper里面已经包含了mybatis的依赖


<dependency>
    <groupId>tk.mybatisgroupId>
    <artifactId>mapper-spring-boot-starterartifactId>
    <version>2.0.3version>
dependency>

之后就是在application.yml配置文件中编写简单的配置即可

server:
  port: 8080

spring:
  # 标注项目现在环境 dev-开发 test-测试 pro-上线
  profiles:
    active: dev
  # 配置数据源
  datasource:
    username: root
    password:
    url: jdbc:mysql://localhost:3306/test # 我的库是test

#mybatis配置
mybatis:
  type-aliases-package: com.pdh.entity
  mapper-locations: classpath:/mybatis/*.xml # mapper位置,默认扫描这里

之后就是创建实体类User

1.2 实体类

实体类与数据库表对应策略:

tkmybatis注解使用JPA注解,这里针对@GeneratedValue注解会简单提及到用法

  1. 默认表名=类名,字段名=属性名(支持下划线转驼峰

  2. @Table(name = "tableName") 指定表名

  3. @Column(name = "fieldName") 指定属性名

  4. @Transient表示此字段不进行映射

  5. @Id标注主键

  6. @GeneratedValue指定主键策略

    @GeneratedValue(strategy = GenerationType.IDENTITY)注解中,GenerationType是枚举类,它有四种类型(以及解释):

    1. TABLE:使用一个特定的数据库表格来保存主键。
    2. SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。
    3. IDENTITY:主键由数据库自动生成(主要是自动增长型)
    4. AUTO(默认):主键由程序控制。

还是使用上面约定的数据表进行实体类的创建

@Table(name = "user_db")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 主键策略使用IDENTITY
    private int id;

    @Column(name = "username")
    private String username;
    
    // 生成getter,setter,构造等方法
}

1.3 Mapper接口

在启动类上添加Mapper扫描@MapperScan("com.pdh.mapper")注解的时候,添加的应该是tk.mybatis的MapperScan。不要误添加mybatis的MapperScan。会出现Error invoking SqlProvider method。

一旦继承了Mapper,继承的Mapper就拥有了Mapper所有的通用方法:

public interface UserMapper extends Mapper<User> {
    // Mapper接口继承Mapper后,可以调用它的诸多方法
}

Mapper方法一览:

SpringBoot - 整合mybatis、TkMybatis和MyBatis Plus(零基础整合无压力~!)_第3张图片

之后就不编写任何映射文件,就能进行使用,但是针对于复杂的SQL还是需要开发人员自行实现的。

这里就直接先不添加映射文件,直接先进行一次接口测试:

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserMapperTest {

    @Resource
    private UserMapper mapper;

    @Test
    public void findAll() {
        mapper.selectAll().forEach(System.out::println);
    }

    @Test
    public void findById(){
        // 查询id=2的数据(只有一个约束)
        User user = mapper.selectByPrimaryKey(2);
        System.out.println(user.toString());
    }

    @Test
    public void findDynamic(){
        // 动态查询 字段有数据就加入条件,没有就不加入条件
        mapper.select(new User("张三")).forEach(System.out::println);
    }

    @Test
    public void findByExample() {
        // 测试一下这种操作 实现reg查询
        Example example = new Example(User.class);
        // example.createCriteria() 有诸多条件实现,这里暂且使用and like条件
        // 可实现链式添加条件
        example.createCriteria().andLike("username","%三%");
        mapper.selectByExample(example).forEach(System.out::println);
    }
}

findAll()得到的结果是:

User{id=1, username=‘张三’}
User{id=2, username=‘李四’}
User{id=3, username=‘王二’}
User{id=4, username=‘麻子’}
User{id=5, username=‘王三’}
User{id=6, username=‘李三’}

findById()得到的结果是:

User{id=2, username=‘李四’}

… …


2.自定义映射文件

可选,不定义也能使用Mapper提供的方法。如果有复杂的SQL需求,就必须自定义。这里我添加一个动态的条件查询SQL。注意,简单的动态SQL,Mapper里面有对于的select方法就能实现,但是我不满足于此,我要实现的是 动态SQL+查询username中带有我指定的字符 的数据,这样的SQL相对复杂些,如果直接使用Mapper的方法的话,使用selectByExample()也可以实现,但是非常的麻烦,使用XML配置文件就简单很多:

映射复杂方法 resources/mappers/UserMapper.xml


        DOCTYPE mapper
                PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.pdh.mapper.UserMapper">

    <sql id="selectSql">
        SELECT
            *
        FROM
            user_db
    sql>

    <select id="find" resultType="com.pdh.entity.User">
        <include refid="selectSql"/>
        <where>
            <if test="username != null">
                username like '%${username}%'
            if>
        where>
    select>


mapper>

之后,需要在UserMapper接口中添加此方法find()(此方法必须与xml映射文件中的对应上)

/**
     * 条件查询
     * @param user  condition
     * @return
     */
public List<User> find(User user);

测试

@Test
public void find(){
    // 查找username中含有`四`的数据
  	mapper.find(new User("四")).forEach(System.out::println);
}

结果

User{id=2, username=‘李四’}


3.注意的点

  1. 实体类的编写需要遵守tkmybatis的规定,合理使用注解。
  2. Mapper类需要继承Mapper接口,之后可只有Mapper接口提供的诸多方法。
  3. 扩展方法,编写复杂需要在UserMapper.xml映射文件中编写好对于的SQL逻辑。
  4. 在启动类上加tkmybatis的MapperScan注解。
  5. tkmybatis自动下划线转驼峰(如数据库属性user_id对于Java代码的userId字段)。

三、mybatis plus

官方使用的是H2数据库进行演示,我这里提供了H2数据库

Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

1.SpringBoot整合mp

与整合tkmybatis步骤一样,不同的点是 依赖、继承BaseMapper,mapper对应的方法名不同。

创建一个含mysql启动器的SpringBoot项目,再开始之后的整合操作。

  1. mp启动器

    
    <dependency>
        <groupId>com.baomidougroupId>
        <artifactId>mybatis-plus-boot-starterartifactId>
        <version>3.3.2version> 
    dependency>
    
  2. application.yml编写配置文件(数据库,端口号,mapper映射文件,… …),诸多配置信息还可由xml文件进行配置。

  3. 创建实体类User,在创建实体类的时候,也与tkmybatis有类是的注解(下面是常见注解):

    • @TableName():表名注解,value指定表名。
    • @TableId():主键注解,value绑定主键字段名。
    • @TableField():字段注解(非主键),value指定数据库字段名,数据表中不存在的字段使用@TableField(exist = false)修饰。
  4. 编写Mapper接口。是继承BaseMapper,再添加对应的自定义方法。

  5. 有需要就编写Mapper.xml映射文件,绑定自定义方法的SQL。

  6. 编写测试类,进行测试即可(具体的方法API移步官网)。


2.注意的点

  1. 实体类的编写需要遵守mybatis plus的规定,合理使用注解。
  2. Mapper类需要继承BaseMapper接口。
  3. 扩展方法,编写复杂需要在UserMapper.xml映射文件中编写好对于的SQL逻辑。
  4. 在启动类上加mybatis plus的MapperScan注解。
  5. mybatis plus自动下划线转驼峰。
  6. mybatis plus功能非常的强大,熟练使用会成为开发利器。

3.更多功能

Mybatis-PlusMybatis的增强工具包,Mybatis Plus具有的功能有:

  1. 通用的CURD
  2. 代码生成器(真香)
  3. 条件构造器
  4. 自定义SQL语句
  5. 分页插件、性能分析插件、全局拦截插件等。
  6. 公共字段自动填充。

在之后的学习中,我会总结一下mybatis-plus的这些外挂式的功能,多多益善!


四、结语

SpringBoot持久层操作有很多方式,就目前而言,mybatis plus是使用最多的,自己手里面的项目到底适合那一种,当然的根据自己项目的情况来决定采用谁。关于mp和tkmybatis比较:点击我跳转。

你可能感兴趣的:(SpringBoot,spring,boot,spring,java)