4.查询
4.1 Map条件
@Test public void testMap(){ Map map = new HashMap(); map.put("cname","测试"); map.put("password","123456"); List list = customerMapper.selectByMap(map); list.forEach(System.out::println); }
4.2 Wrapper条件
4.2.1 wrapper介绍
Wrapper : 条件构造抽象类,最顶端父类
- AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
- QueryWrapper : Entity 对象封装操作类,不是用lambda语法
UpdateWrapper : Update 条件封装,用于Entity对象更新操作
AbstractLambdaWrapper : Lambda 语法使用 Wrapper统一处理解析 lambda 获取 column。
LambdaQueryWrapper :看名称也能明白就是用于Lambda语法使用的查询Wrapper
LambdaUpdateWrapper : Lambda 更新封装Wrapper
- 如果想进行复杂条件查询,那么需要使用条件构造器 Wapper,涉及到如下方法
方法名 | 描述 |
selectOne | |
selectCount |
selectList | |
selectMaps |
selectList | |
selectMaps |
- 拼凑条件相关关键字
查询方式 | 说明 |
setSqlSelect | 设置 SELECT 查询字段 |
where | WHERE 语句,拼接 + WHERE 条件 |
and | AND 语句,拼接 + AND 字段=值 |
andNew | AND 语句,拼接 + AND (字段=值) |
or | OR 语句,拼接 + OR 字段=值 |
orNew | OR 语句,拼接 + OR (字段=值) |
eq | 等于= |
allEq | 基于 map 内容等于= |
ne | 不等于<> |
gt | 大于> |
ge | 大于等于>= |
lt | 小于< |
le | 小于等于<= |
like | 模糊查询 LIKE |
notLike | 模糊查询 NOT LIKE |
in | IN 查询 |
notIn | NOT IN 查询 |
isNull | NULL 值查询 |
isNotNull | IS NOT NULL |
groupBy | 分组 GROUP BY |
having | HAVING 关键词 |
orderBy | 排序 ORDER BY |
orderAsc | ASC 排序 ORDER BY |
orderDesc | DESC 排序 ORDER BY |
exists | EXISTS 条件语句 |
notExists | NOT EXISTS 条件语句 |
between | BETWEEN 条件语句 |
notBetween | NOT BETWEEN 条件语句 |
addFilter | 自由拼接 SQL |
last | 拼接在最后,例如:last(“LIMIT 1”) |
4.2.2 条件查询
- 基本多条件查询
@Test public void testWrapper(){ // 拼凑条件 QueryWrapper<Customer> queryWrapper = new QueryWrapper(); // 1)模糊查询 queryWrapper.like("cname","测试"); // 2)等值查询 queryWrapper.eq("password","777"); // 3)批量查询 queryWrapper.in("cid",1,2,3,4); // 4) 范围 queryWrapper.ge("money", 800); queryWrapper.le("money" , 1500); // 查询 List<Customer> list = customerMapper.selectList(queryWrapper); list.forEach(System.out::println); }
- 条件判断
@Test public void findCondition2() { Customer customer = new Customer(); customer.setPassword("777"); customer.setCname("888"); customer.setIdList(Arrays.asList(2,3,4)); customer.setCid(3); //条件查询 QueryWrapper<Customer> queryWrapper = new QueryWrapper<>(); // 1) 等值查询 queryWrapper.eq( customer.getPassword()!=null ,"password", customer.getPassword()); // 2) 模糊查询 queryWrapper.like(customer.getCname() != null , "cname",customer.getCname()); // 3) in语句 queryWrapper.in(customer.getIdList() != null , "cid",customer.getIdList()); // 4) 大于等于 queryWrapper.ge(customer.getCid() != null , "cid" , customer.getCid()); //查询 List<Customer> list = customerMapper.selectList(queryWrapper); //list.forEach(customer-> System.out.println(customer)); list.forEach(System.out::println); }
4.3.3 条件更新
- 基本更新
@Test public void testWrapperUpdate(){ //1 更新数据 Customer customer = new Customer(); customer.setVersion(1); //2 更新条件 UpdateWrapper<Customer> updateWrapper = new UpdateWrapper<>(); updateWrapper.in("cid", 1,2,3); //3 更新 int update = customerMapper.update(customer, updateWrapper); System.out.println(update); }
4.3 分页
4.3.1 内置插件
主体插件: MybatisPlusInterceptor,该插件内部插件集:
- 分页插件: PaginationInnerInterceptor
- 多租户插件: TenantLineInnerInterceptor
- 动态表名插件: DynamicTableNameInnerInterceptor
- 乐观锁插件: OptimisticLockerInnerInterceptor
- sql性能规范插件: IllegalSQLInnerInterceptor
- 防止全表更新与删除插件: BlockAttackInnerInterceptor
4.3.2 配置类
package com.czxy.mp.config; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MybatisPlusConfig { /** * 配置插件 * @return */ @Bean public MybatisPlusInterceptor mybatisPlusInterceptor(){ MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor(); // 分页插件 mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return mybatisPlusInterceptor; } /** * 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除) * @return */ @Bean public ConfigurationCustomizer configurationCustomizer() { return configuration -> configuration.setUseDeprecatedExecutor(false); } }
4.3.3 分页
@Test public void testPage(){ // 分页数据 int pageNum = 1; int pageSize = 3; Page<Customer> page = new Page<>(pageNum , pageSize); page.setSearchCount(true); // 查询 customerMapper.selectPage(page, null); // 分页数据 System.err.println("当前页码:" + page.getCurrent()); System.err.println("每页显示记录数:" + page.getSize()); System.err.println("总页数:" + page.getPages()); System.err.println("总记录数:" + page.getTotal()); System.err.println("是否有下一页:" + page.hasNext()); System.err.println("是否有上一页:" + page.hasPrevious()); // 分页数据列表 page.getRecords().forEach(System.err::println); }
5.常见注解
5.1 表名注解:@TableName
属性 | 描述 |
value | 表名 |
keepGlobalPrefix | 是否保持使用全局的 tablePrefix 的值(如果设置了全局 tablePrefix 且自行设置了 value 的值) |
5.2 主键注解:@TableId
属性 | 描述 |
value | 主键字段名 |
type | 主键类型 IdType.ASSIGN_UUID ,分配UUID,MyBatisPlus维护String数据 IdType.ASSIGN_ID ,分配ID(默认使用雪花算法)MyBatisPlus维护Long数据 IdType.AUTO ,自动增长(数据库维护) |
- 测试表:User
CREATE TABLE tmp_user( uid VARCHAR(100), uname VARCHAR(50) );
- JavaBean
package com.czxy.mp.domain; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor public class User { //@TableId(type = IdType.ASSIGN_UUID) //随机一个字符串 @TableId(type = IdType.ASSIGN_ID) //随机一个数字(Long) private String uid; private String uname; }
5.2 字段注解(非主键) : @TableField
属性 | 描述 |
value | 数据库字段名 |
fill | 字段自动填充策略 FieldFill.INSERT 插入时填充字段 FieldFill.UPDATE 更新时填充字段 FieldFill.INSERT_UPDATE 插入和更新时填充字段 |
exist | 是否存储到数据库(是否是临时数据) |
6.常见配置
mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #输出日志 map-underscore-to-camel-case: true #驼峰命名 global-config: db-config: id-type: auto #全局配置,id自动增强 table-prefix: tmp_ #表名前缀 type-aliases-package: com.czxy.mp.domain #别名包扫描路径 mapper-locations: classpath*:/mapper/**/*.xml #映射文件位置
- 整合xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.czxy.mp.mapper.CustomerMapper"> <select id="findAll" resultType="customer"> select * from tmp_customer </select> </mapper>
- CustomerMapper对应的方法
package com.czxy.mp.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.czxy.mp.domain.Customer; import org.apache.ibatis.annotations.Mapper; import java.util.List; @Mapper public interface CustomerMapper extends BaseMapper<Customer> { public List<Customer> findAll(); }