Mybatis-Plus简介
MyBatis-Plus 简称 MP)是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
MyBatis Plus特性
无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作
集成SpringBoot的yml文件的基本配置
mybatis-plus:
# 如果是放在src/main/java目录下 classpath:/com/yourpackage/*/mapper/*Mapper.xml
# 如果是放在resource目录 classpath:/mapper/*Mapper.xml
mapper-locations: classpath:/mapper/*Mapper.xml
#实体扫描,多个package用逗号或者分号分隔
#typeAliasesPackage: com.*.entity
global-config:
#主键类型 0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
id-type: 3
db-column-underline: true
#逻辑删除配置
logic-delete-value: 1
logic-not-delete-value: 0
sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector
#是否动态刷新mapper
refresh-mapper: true
configuration:
#配置返回数据库(column下划线命名&&返回java实体是驼峰命名),自动匹配无需as(没开启这个,SQL需要写as: select user_id as userId)
map-underscore-to-camel-case: true
#日志打印
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
创建实体类
@Data
@TableName(value = "tbl_user")
public class User {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
private String managerId;
private LocalDateTime createTime;
@TableField(
exist = false
)
public String endTime;
@TableLogic
private int isDelete;
}
- 注解@TableName: 表名注解 实体类与数据库表对应,若表名与实体类名相同,则value不需要书写,若不一致,则需要写进表名
- 注解@TableId:主键注解 value指定主键名,type指主键生成策略,若实体类的属性名与表中相同,则可以省略
- 注解@TableField:字段注解(非主键) value指定字段名,若实体类属性与表名相同,或符合驼峰规则都可省略,当exist = false时,表示当前属性不是数据库的字段,但在项目中必须使用,这样在新增等使用bean的时候,mybatis-plus就会忽略这个,不会报错
- 注解@TableLogic:逻辑删除注解
Mybatis-Plus的CRUD
@Mapper
public interface userMapper extends BaseMapper<User> {
}
1、插入
public void testCommonInsert() {
User user= new User();
user.setName("黄药师");
user.setEmail("hys@qq.com");
user.setAge(10);
int result = userMapper.insert(user);
}
2、更新
public void testCommonUpdate() {
User user= new User();
user.setId(1);
user.setName("wang");
user.setEmail("wang@qq.com");
user.setAge(100);
int result = userMapper.updateById(user);
}
3、查询
public void testQuery() {
//1.根据id查询
User user = userMapper.selectById(1);
//2.查询(根据ID 批量查询)
List<Integer> idList = new ArrayList<>();
for (int i = 1; i < 5; i++) {
idList.add(i);
}
List<User> userlist = userMapper.selectBatchIds(idList);
//3.查询(根据 columnMap 条件)
HashMap<String, Object> columnMap = new HashMap<>();
columnMap.put("age", "10");
List<User> userLists= userMapper.selectByMap(columnMap);
//4、查询全部
List<Employee> users = userMapper.selectList(null);
}
4、删除
public void testDelete() {
//1.根据id批量删除
List<Integer> ids = new ArrayList<>();
for (int i = 8; i < 31; i++) {
ids.add(i);
}
int result = userMapper.deleteBatchIds(ids);
//2.根据id删除
int result = userMapper.deleteById(1);
//3.根据 columnMap 条件,删除记录
Map<String, Object> columnMap = new HashMap<>();
columnMap.put("email", "ouyangfeng@.com");
columnMap.put("age", "10");
int result = userMapper.deleteByMap(columnMap);
}
5、分页查询
分页查询配置:
@Configuration
@ConditionalOnClass(value = {PaginationInterceptor.class})
public class MybatisPlusConfig {
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}
public void selectPage(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.ge("age",20);
//设置当前页和页容量
Page<User> page = new Page<>(1, 2);
IPage<User> userIPage = userMapper.selectPage(page, queryWrapper);
System.out.println("总页数:"+userIPage.getPages());
System.out.println("总记录数:"+userIPage.getTotal());
userIPage.getRecords().forEach(System.out::println);
}
6、模糊查询,in查询,指定列查询
public void selectByWrapper(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like("name","雨").lt("age",40);
// in查询
// queryWrapper.in("age", Arrays.asList(30,31,34,35));
// 指定列查询
// queryWrapper.select("name","age").likeRight("name","王");
List<User> userList = userMapper.selectList(queryWrapper);
}
7、实体作为条件构造方法的参数
public void selectWrapper10(){
User user = new User();
user.setName("wang");
user.setAge(32);
QueryWrapper<User> queryWrapper = new QueryWrapper<>(user);
List<User> userList = userMapper.selectList(queryWrapper);
userList.forEach(System.out::println);
}
条件构造器 :
setSqlSelect | 设置 SELECT 查询字段 |
where | WHERE 语句,拼接 + WHERE 条件 |
and | AND 语句,拼接 + AND 字段=值 |
andNew | AND 语句,拼接 + AND (字段=值) |
or | OR 语句,拼接 + OR 字段=值 |
eq | 等于= |
ne | 不等于<> |
gt | 大于> |
ge | 大于等于>= |
lt | 小于< |
le | 小于等于<= |
like | 模糊查询 LIKE |
in | IN 查询 |
groupBy | 分组 GROUP BY |
having | HAVING 关键词 |
exists | EXISTS 条件语句 |
orderBy | 排序 ORDER BY |
isNotNull | isNotNull 查询不为空 |
orderAsc | ASC 排序 ORDER BY |
orderDesc | DESC 排序 ORDER BY |
between | BETWEEN 条件语句 |
last | 拼接在最后,例如:last(“LIMIT 1”) |