Springboot整合Mybatis-Plus使用总结(mybatis 坑补充)

前言

mybatis在持久层框架中还是比较火的,一般项目都是基于ssm。虽然mybatis可以直接在xml中通过SQL语句操作数据库,很是灵活。但正其操作都要通过SQL语句进行,就必须写大量的xml文件,很是麻烦。mybatis-plus就很好的解决了这个问题。

一、mybatis-plus简介:

Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。这是官方给的定义,关于mybatis-plus的更多介绍及特性,可以参考mybatis-plus官网。那么它是怎么增强的呢?其实就是它已经封装好了一些crud方法,我们不需要再写xml了,直接调用这些方法就行,就类似于JPA。

二、SpringBoot 整合 Mybatis-plus

在SpringBoot的特性下,整合Mybatis-plus也尤为简单。接下来看具体操作:
1、pom.xml:
核心依赖如下:


<dependency>
      <groupId>com.baomidougroupId>
      <artifactId>mybatis-plus-boot-starterartifactId>
      <version>3.3.0version>
 dependency>
 
<dependency>
    <groupId>com.baomidougroupId>
    <artifactId>mybatis-plus-generatorartifactId>
    <version>3.3.0version>
dependency>
 
<dependency>
  <groupId>mysqlgroupId>
  <artifactId>mysql-connector-javaartifactId>
dependency>

注意 这里使用的数据库为mysql ,还运用到了日志slf4j、lombok等,可以自行了解

2、application.yml: springboot 启动配置 - 数据源配置

# [] 内需要自己修改
spring:
  datasource:
    username: [数据库账户]
    password: [数据库密码]
    url: jdbc:mysql://[url]/[dbbase]?useUnicode=true&characterEncoding=utf8
    driver-class-name: com.mysql.cj.jdbc.Driver

3、 数据表 User表

id name age email
1 Jone 18 [email protected]
2 Jack 20 [email protected]
3 Tom 28 [email protected]
4 Sandy 21 [email protected]
5 Billie 24 [email protected]

对应 schema-user.sql

DROP TABLE IF EXISTS user;

CREATE TABLE user
(
	id BIGINT(20) NOT NULL COMMENT '主键ID',
	name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
	age INT(11) NULL DEFAULT NULL COMMENT '年龄',
	email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
	PRIMARY KEY (id)
);

对应 data-user.sql

DELETE FROM user;

INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, '[email protected]'),
(2, 'Jack', 20, '[email protected]'),
(3, 'Tom', 28, '[email protected]'),
(4, 'Sandy', 21, '[email protected]'),
(5, 'Billie', 24, '[email protected]');

建立好数据,接下来就是java类的配置,可以通过mybatis-plus的代码生成器generator生成,generator生成自行了解;

4 、 entity 对应数据表结构实体类,

@Data 
@TebleName(value = "user")
public class user implements Serializable {
     
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @TableField(value = "name",exist = true)
    private String userName;
    private String age;
    private String email;
}

@Data : lombok(需要安装lombok插件) 自动设置 getter setter toString 保证代码整洁
@TebleName:对应表名,可以不写,默认以驼峰命名法进行表名匹配,还有其他前缀、后缀等匹配方式可以去自行了解,一般直接使用标准驼峰就行
@TableId :id 列,type = IdType.AUTO 当主键为自增时,insert(user) 时,user.id会自动赋值
@TableField:表字段,若没有开启驼峰命名,或者表中列名不符合驼峰规则,可通过该注解指定数据库表中的列名,exist标明数据表中有没有对应列
5、分页插件、mapper扫描配置

@Configuration
@MapperScan({
     "com.exmple.*.dao"})//扫描dao层接口
public class MybatisPlusConfig {
     

    //分页插件
    @Bean
    public PaginationInterceptor paginationInterceptor() {
     
        // 设置sql的limit为无限制,默认是500
        return new PaginationInterceptor().setLimit(-1);
    }

}

分页组件

Page<User> page = new Page<>(current,size);//当前页与页面数量

6、dao 持久层

public interface UserDao extends BaseMapper<User> {
     
	@Select("select u.id as `id` .... from user u left join .. where..")
	@ResultType(UserVo.class)
	public UserVo getOne();

	public UserInfo selectUserInfo(@Param("query")User user);
}

在dao层可以进行多种方式定义sql操作,

  1. 直接使用@Select、@Insert、@Update等标签直接写入使用拼接,用 包裹可以使用如xml里写法的等标签
  2. 原始的写法用映射Mapper.xml的方式进行使用
  3. 定义sql拼接的方法类进行处理,这里不做演示

BaseMapper里 定义了大量CRUD的方法,可直接使用,不用再去定义基础CRUD的sql

public interface BaseMapper<T> extends Mapper<T> {
     
    int insert(T entity);

    int deleteById(Serializable id);

    int deleteByMap(@Param("cm") Map<String, Object> columnMap);

    int delete(@Param("ew") Wrapper<T> wrapper);

    int deleteBatchIds(@Param("coll") Collection<? extends Serializable> idList);

    int updateById(@Param("et") T entity);

    int update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper);

    T selectById(Serializable id);

    List<T> selectBatchIds(@Param("coll") Collection<? extends Serializable> idList);

    List<T> selectByMap(@Param("cm") Map<String, Object> columnMap);

    T selectOne(@Param("ew") Wrapper<T> queryWrapper);

    Integer selectCount(@Param("ew") Wrapper<T> queryWrapper);

    List<T> selectList(@Param("ew") Wrapper<T> queryWrapper);

    List<Map<String, Object>> selectMaps(@Param("ew") Wrapper<T> queryWrapper);

    List<Object> selectObjs(@Param("ew") Wrapper<T> queryWrapper);

    <E extends IPage<T>> E selectPage(E page, @Param("ew") Wrapper<T> queryWrapper);

    <E extends IPage<Map<String, Object>>> E selectMapsPage(E page, @Param("ew") Wrapper<T> queryWrapper);
}

6、Mapper.xml 映射文件



<mapper namespace="com.exmple.admin.dao.UserDao">
	<resultMap id="userInfoMap" type=".....UserInfo">
        <id column="id" property="userId" />
        .....
    resultMap>