以Spring Boot工程为例

基本使用
  • 引入Spring Boot Starter 等依赖包
  • maven添加依赖
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus</artifactId>
    <version>最新版本</version>
</dependency>
  • 在application.yml配置数据库配置
# DataSource Config
spring:
  datasource:
    driver-class-name: org.h2.Driver
    schema: classpath:db/schema-h2.sql
    data: classpath:db/data-h2.sql
    url: jdbc:h2:mem:test
    username: root
    password: test
  • 在启动类中添加@MapperScan注解
@SpringBootApplication
@MapperScan("com.baomidou.mybatisplus.samples.quickstart.mapper")
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}
  • 编写实体类
  • 编写UserMapper接口
public interface UserMapper extends BaseMapper<User> {

}
  • 使用
@SpringBootTest
public class SampleTest {

    @Autowired // 引入userMapper
    private UserMapper userMapper;

    @Test
    public void testSelect() {
        System.out.println(("----- selectAll method test ------"));
        List<User> userList = userMapper.selectList(null);
        Assert.assertEquals(5, userList.size());
        userList.forEach(System.out::println);
    }

}
注解
  • @TableName(“表名注解”) 对应实体类使用
    • value 表名
    • schema
    • keepGlobalPrefix 是否使用全局的tablePrefix值
    • resultMap 对应mpper.xml中的resultMap
    • autoResultMap 是否自动构建resultMap并使用
    • excludeProperty 需要排除的属性
  • @TableId 主键注解
    • value: 主键字段名
    • type: 主键类型 IdType
@TableName("sys_user")
public class User {
    @TableId
    private Long id;
    private String name;
    private Integer age;
    private String email;
}
  • @TableField 非主键注解
    • value:数据库字段名
    • exist:是否是数据库表字段
  • @Version 乐观锁 字段上
    • 乐观锁 每次对比版本号
    • 需要springboot 在中配置
    • 可以用while 当失败时重新修改
  • @Enum枚举类型 枚举字段上
  • @TableLogic 表字段 逻辑删除
  • value逻辑未删除值
  • delval逻辑删除值
  • @SqlParser
  • @KeySequence
  • @Interceptorlgnore
  • @OrderBy 默认排序
    • isDesc 是否倒序
    • sort 数字越小越靠前
  • @EnumValue 将枚举中某个属性存储到数据库中
    • 需要在spring 配置文件中 type-enums-package
CRUD接口

分页功能 需要加载分页插件

Service Crue

mybatis-plus自身封装数据操作方法

// 使用时 可继承ServiceImpl 实现接口implements
extends ServiceImpl<UserMapper, User> implements IService<User>
  • save
/*
    entity: 实体类
    entityList: 实体类集合
    batchSize: 插入批次数量 
*/
// 插入一条记录(选择字段,策略插入)
boolean save(T entity);
// 插入(批量)
boolean saveBatch(Collection<T> entityList);
// 插入(批量)
boolean saveBatch(Collection<T> entityList, int batchSize);
  • saveOrUpdate
/*
    entity: 实体类
    entityList: 实体类集合
    batchSize: 插入批次数量 
    updateWrapper: 实体对象操作类
*/
// TableId 注解存在更新记录,否插入一条记录
boolean saveOrUpdate(T entity);
// 根据updateWrapper尝试更新,否继续执行saveOrUpdate(T)方法
boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper);
// 批量修改插入
boolean saveOrUpdateBatch(Collection<T> entityList);
// 批量修改插入
boolean saveOrUpdateBatch(Collection<T> entityList, int batchSize);
  • Remove
// 根据 entity 条件,删除记录
boolean remove(Wrapper<T> queryWrapper);
// 根据 ID 删除
boolean removeById(Serializable id);
// 根据 columnMap 条件,删除记录
boolean removeByMap(Map<String, Object> columnMap);
// 删除(根据ID 批量删除)
boolean removeByIds(Collection<? extends Serializable> idList);
  • Update
// 根据 UpdateWrapper 条件,更新记录 需要设置sqlset
boolean update(Wrapper<T> updateWrapper);
// 根据 whereWrapper 条件,更新记录
boolean update(T updateEntity, Wrapper<T> whereWrapper);
// 根据 ID 选择修改
boolean updateById(T entity);
// 根据ID 批量更新
boolean updateBatchById(Collection<T> entityList);
// 根据ID 批量更新
boolean updateBatchById(Collection<T> entityList, int batchSize);
  • get
// 根据 ID 查询
T getById(Serializable id);
// 根据 Wrapper,查询一条记录。结果集,如果是多个会抛出异常,随机取一条加上限制条件 wrapper.last("LIMIT 1")
T getOne(Wrapper<T> queryWrapper);
// 根据 Wrapper,查询一条记录
T getOne(Wrapper<T> queryWrapper, boolean throwEx);
// 根据 Wrapper,查询一条记录
Map<String, Object> getMap(Wrapper<T> queryWrapper);
// 根据 Wrapper,查询一条记录
<V> V getObj(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);
  • List 批量查找
// 查询所有
List<T> list();
// 查询列表
List<T> list(Wrapper<T> queryWrapper);
// 查询(根据ID 批量查询)
Collection<T> listByIds(Collection<? extends Serializable> idList);
// 查询(根据 columnMap 条件)
Collection<T> listByMap(Map<String, Object> columnMap);
// 查询所有列表
List<Map<String, Object>> listMaps();
// 查询列表
List<Map<String, Object>> listMaps(Wrapper<T> queryWrapper);
// 查询全部记录
List<Object> listObjs();
// 查询全部记录
<V> List<V> listObjs(Function<? super Object, V> mapper);
// 根据 Wrapper 条件,查询全部记录
List<Object> listObjs(Wrapper<T> queryWrapper);
// 根据 Wrapper 条件,查询全部记录
<V> List<V> listObjs(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);
  • Page 分页查找
// 无条件分页查询
IPage<T> page(IPage<T> page);
// 条件分页查询
IPage<T> page(IPage<T> page, Wrapper<T> queryWrapper);
// 无条件分页查询
IPage<Map<String, Object>> pageMaps(IPage<T> page);
// 条件分页查询
IPage<Map<String, Object>> pageMaps(IPage<T> page, Wrapper<T> queryWrapper);
  • Count 数量
// 查询总记录数
int count();
// 根据 Wrapper 条件,查询总记录数
int count(Wrapper<T> queryWrapper);
  • Chain 链式操作
    • query
    • lambdaQuery()
    • update
    • lambdaUpdate
Mapper CRUD

通过实体类映射 注入内容 自带方法

  • Insert
// 插入一条记录
int insert(T entity);
  • Delete
// 根据 entity 条件,删除记录
int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper);
// 删除(根据ID 批量删除)
int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
// 根据 ID 删除
int deleteById(Serializable id);
// 根据 columnMap 条件,删除记录
int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
  • Update
// 根据 whereWrapper 条件,更新记录
int update(@Param(Constants.ENTITY) T updateEntity, @Param(Constants.WRAPPER) Wrapper<T> whereWrapper);
// 根据 ID 修改
int updateById(@Param(Constants.ENTITY) T entity);
  • Select
// 根据 ID 查询
T selectById(Serializable id);
// 根据 entity 条件,查询一条记录
T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

// 查询(根据ID 批量查询)
List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
// 根据 entity 条件,查询全部记录
List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 查询(根据 columnMap 条件)
List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
// 根据 Wrapper 条件,查询全部记录
List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 根据 Wrapper 条件,查询全部记录。注意: 只返回第一个字段的值
List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

// 根据 entity 条件,查询全部记录(并翻页)
IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 根据 Wrapper 条件,查询全部记录(并翻页)
IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 根据 Wrapper 条件,查询总记录数
Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
Wrapper 条件构造类(抽象类)
AbstractWrapper 生成where条件类
  • allEq
    allEq(Map<R,V> params)
    allEq(Map<R,V> params,boolean null2IsNull)
    allEq(boolean condition,Map<R,V> params,boolean null2IsNull)
    例1: allEq({id:1,name:”老王”,age:null}) —> id = 1 and name = ‘老王’ and age is null
    例2: allEq({id:1,name:”老王”,age:null}, false) —> id = 1 and name = ‘老王’
  • eq 单个
    eq(R column, Object val)
    eq(boolean condition, R column, Object val)
  • ne 不等于
    ne(R column, Object val)
    ne(boolean condition, R column, Object val)
  • gt 大于
  • ge 大于等于
  • lt 小于
  • le 小于等于
  • between 两者之间
    between(R column, Object val1, Object val2)
    between(boolean condition, R column, Object val1, Object val2)
  • notBetween 不在两者之间
  • like 模糊查询 是否包含
    like(R column, Object val)
    like(boolean condition, R column, Object val)
  • notLike 不包含
  • likeLeft %xx 在右侧
  • likeRight xx% 在左侧
  • isNull 值为null的
    isNull(R column)
    isNull(boolean condition, R column)
  • isNotNull 值不为null
  • in 包含在
    • in(R column, Collection<?> value) 集合形式
    • in(boolean condition, R column, Collection<?> value)
    • in(R column, Object… values) 多参形式
    • in(boolean condition, R column, Object… values)
  • notIn 不包含
  • inSql 包含在查询的语句中
  • notInSql 不包含在查询的语句中
  • groupBy groupBy分组
  • orderByAsc orderByDesc 排序
  • orderBy
    • orderBy(boolean condition, boolean isAsc, R… columns)
  • having
  • func
  • or 或条件
  • and 和条件 默认
  • nested
  • apply
  • last
  • exists
  • notExists
QueryWrapper

继承AbstractWrapper

  • select 通过实体类生成where
UpdateWrapper

继承AbstractWrapper,用于修改

  • set
    • set(String column, Object val) 修改条件
  • setSql set部分sql语句
  • lambda 获取LambdaWrapper
myBatis-plus 插件

新建一个配置类 MybatisPlus 3.4 以后的写法

@Configuration
public class myBatisConfig {
    @Bean
    public MybatisPlusInterceptor myBatisConfigs() {
        MybatisPlusInterceptor config = new MybatisPlusInterceptor();
        // 添加分页插件
        config.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return config;
    }
}
IPage
  • records 返回分页结果 ArrayList
  • total 总数
  • size 数量
  • current
page

IPage 子类 当前页码,和数量

配置
  • configLocation: mybastis配置文件位置
  • mapperLocations:xml文件位置 引入xml
    • 默认值 [“classpath*:/mapper/**/*.xml”]
  • typeAliasesPackage: 给包设置别名
  • typeAliasesSuperType:如果设置了该值则只会扫描路径下以该类作为父类的域对象
  • typeHandlersPackage:如果配置了该属性,SqlSessionFactoryBean 会把该包下面的类注册为对应的 - TypeHandler
  • spring 专有配置
    • checkConfigLocation:启动时是否检查mybatis xml文件存在
    • executorType
  • configurationProperties
  • configuration mybatis原生配置
    • mapUnderscoreToCamelCase:是否开启驼峰命名映射
    • defaultEnumTypeHandler
    • autoMappingBehavior 自动映射策略
      • AutoMappingBehavior.NONE:不启用自动映射
      • AutoMappingBehavior.PARTIAL:只对非嵌套的 resultMap 进行自动映射
      • AutoMappingBehavior.FULL:对所有的 resultMap 都进行自动映射
    • autoMappingUnknownColumnBehavior:自动映射未知属性处理策略
      • AutoMappingUnknownColumnBehavior.NONE:不做任何处理 (默认值)
      • AutoMappingUnknownColumnBehavior.WARNING:以日志的形式打印相关警告信息
      • AutoMappingUnknownColumnBehavior.FAILING:当作映射失败处理,并抛出异常和详细信息
    • localCacheScope:mybatis一级缓存
    • cacheEnabled:是否开启二级缓存
    • callSettersOnNulls
    • configurationFactory
    • aggressiveLazyLoading
  • globalConfig mybatis全局策略
    • banner :控制台是否打印logo
    • enableSqlRunner
    • sqlInjector
    • superMapperClass
    • metaObjectHandler
    • identifierGenerator(since 3.3.0)
    • dbConfig
代码生成器

需要引入依赖

lombok

实体类简化包

  • @NoArgsConstructor 无参构造
  • @AllArgsConstructor 有参构造
  • @Getter 生成get
  • @Setter 生成set
  • @EqualsAndHashCode 重写Equals 和 HashCode
  • @Data 生成上面所有
  • @Accessors
    • fluent默认false,设置为true 对应的set get 前面没有set、get
    • chain默认false,设置为true set返回当前对象
    • 忽略字段前缀 getaName -> 忽略a后 -> getName
MyBatisX 插件
  • 自动生成文件
  • 自动生成方法 alt+enter