欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring Boot 使用 Mybatis plus

程序员文章站 2022-07-15 10:14:11
...

一、添加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方式进行配置