signed

QiShunwang

“诚信为本、客户至上”

Spring Boot 使用 Mybatis plus

2021/3/21 0:30:25   来源:

一、添加pom依赖(pom.xml)

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.2</version>
</dependency>

二、修改配置文件(application.yml)

spring:
    datasource:
        # 数据库链接URL
        url: jdbc:mysql://localhost:3306/db_xxx
        # 数据库用户名密码
        username: xxx
        password: xxx
        # 数据源 ps:可不配置,使用默认数据源
        type: com.alibaba.druid.pool.DruidDataSource

mybatis-plus:
    # mapper文件的路径
    mapper-locations: classpath:mapper/*xml
    # 实例类的包路径
    type-aliases-package: com.example.xx.pojo
    configuration:
        # 字段名映射为表字段大小写 eg: 实体类中有 userName 对应表中的 user_name 列
        map-underscore-to-camel-case: true

三、创建实体类(User.java)

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
// 对应数据库中的表名
@TableName(value = "user")
// 表示在json序列化时忽略 密码 字段
@JsonIgnoreProperties({"passWord"})
public class User implements Serializable {
    //  标识id为表中主键,并且自增
    @TableId(type = IdType.AUTO)
    private Long id;
    private String userName;
    private String passWord;
    private String phoneNumber;
    private String realName;
    private String email;
    private String note;
    //  mybatis自动填充时间,FieldFill.INSERT 表示插入时更新该字段
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    // 表示插入、修改时更新该字段
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
}

实体类当中使用了Lombok插件,自行导入

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

四、编写mapper接口 (UserMapper.java)

@Mapper
@Repository
public interface UserMapper extends BaseMapper<User> {

}

UserMapper中不需要写任何代码,继承BaseMapper<T>就可继承常用API。泛型T为实体类。

源码如下:

package com.baomidou.mybatisplus.core.mapper;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import org.apache.ibatis.annotations.Param;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;


/**
 * Mapper 继承该接口后,无需编写 mapper.xml 文件,即可获得CRUD功能
 * <p>这个 Mapper 支持 id 泛型</p>
 *
 * @author hubin
 * @since 2016-01-23
 */
public interface BaseMapper<T> extends Mapper<T> {

    /**
     * 插入一条记录
     *
     * @param entity 实体对象
     */
    int insert(T entity);

    /**
     * 根据 ID 删除
     *
     * @param id 主键ID
     */
    int deleteById(Serializable id);

    /**
     * 根据 columnMap 条件,删除记录
     *
     * @param columnMap 表字段 map 对象
     */
    int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);

    /**
     * 根据 entity 条件,删除记录
     *
     * @param queryWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)
     */
    int delete(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * 删除(根据ID 批量删除)
     *
     * @param idList 主键ID列表(不能为 null 以及 empty)
     */
    int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);

    /**
     * 根据 ID 修改
     *
     * @param entity 实体对象
     */
    int updateById(@Param(Constants.ENTITY) T entity);

    /**
     * 根据 whereEntity 条件,更新记录
     *
     * @param entity        实体对象 (set 条件值,可以为 null)
     * @param updateWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)
     */
    int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);

    /**
     * 根据 ID 查询
     *
     * @param id 主键ID
     */
    T selectById(Serializable id);

    /**
     * 查询(根据ID 批量查询)
     *
     * @param idList 主键ID列表(不能为 null 以及 empty)
     */
    List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);

    /**
     * 查询(根据 columnMap 条件)
     *
     * @param columnMap 表字段 map 对象
     */
    List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);

    /**
     * 根据 entity 条件,查询一条记录
     *
     * @param queryWrapper 实体对象封装操作类(可以为 null)
     */
    T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * 根据 Wrapper 条件,查询总记录数
     *
     * @param queryWrapper 实体对象封装操作类(可以为 null)
     */
    Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * 根据 entity 条件,查询全部记录
     *
     * @param queryWrapper 实体对象封装操作类(可以为 null)
     */
    List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * 根据 Wrapper 条件,查询全部记录
     *
     * @param queryWrapper 实体对象封装操作类(可以为 null)
     */
    List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * 根据 Wrapper 条件,查询全部记录
     * <p>注意: 只返回第一个字段的值</p>
     *
     * @param queryWrapper 实体对象封装操作类(可以为 null)
     */
    List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * 根据 entity 条件,查询全部记录(并翻页)
     *
     * @param page         分页查询条件(可以为 RowBounds.DEFAULT)
     * @param queryWrapper 实体对象封装操作类(可以为 null)
     */
    <E extends IPage<T>> E selectPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * 根据 Wrapper 条件,查询全部记录(并翻页)
     *
     * @param page         分页查询条件
     * @param queryWrapper 实体对象封装操作类
     */
    <E extends IPage<Map<String, Object>>> E selectMapsPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
}

 从源码可以看到这个和JPA很类似,甚至比JPA更加强大,常用的方法有:

  • int insert(T entity); 插入一条记录
  • int deleteById(Serializable id); 根据 ID 删除一条记录
  • int deleteBatchIds(Collection<? extends Serializable> idList); 删除(根据ID 批量删除)
  • int updateById(T entity); 根据 ID 修改
  • T selectById(Serializable id); 根据 ID 查询
  • List<T> selectBatchIds(Collection<? extends Serializable> idList); 查询(根据ID 批量查询)

其中还有分页插件,非常的银杏

五、测试

@SpringBootTest
public class MybatisPlusTest {
    @Resource
    private UserMapper userMapper;

    @Test
    void test() {
        User user = User.builder()
                .userName("张三")
                .passWord("passWord")
                .id(999L)
                .build();
        userMapper.insert(user);
        user.setPassWord("1234");
        userMapper.updateById(user);
        User user1 = userMapper.selectById(999L);
        System.out.println("user = " + user);
        userMapper.deleteById(999L);
        System.out.println("userMapper.selectById(999L) = " + userMapper.selectById(999L));
    }
}

 运行结果如下

user = User(id=999, userName=张三, passWord=1234, phoneNumber=null, email=null, note=null, createTime=Sun Mar 21 00:23:33 CST 2021, updateTime=Sun Mar 21 00:23:33 CST 2021)
userMapper.selectById(999L) = null

以上为mybatisplus的基本使用,如有复杂业务,仍可用xml方式进行配置