以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