mybatis-plus学习笔记
排除非表字段的三种方式
- private transient String remark; //缺点:不能序列化
- private static String remark;然后get set //mp会自动忽略static字段
- 注解@TableField参数:
- exit=false //exit标记为不是数据库字段;
- condition=SqlCondition.LIKE //condition标记实体查询时查询条件用何种方式;
- strategy=FieldStrategy.NOT_EMPTY //默认更新时 等于null的字段不进行更新。如果配置为not-null,则会为没有值的字段插入null。查询、删除、更新均受影响(慎用)
普通查询(通用Mapper)
条件构造器 AbstractWrapper
QueryWrapper:
- .like(“name”,”雨”)
- .likeRight()
- .likeLeft()
- lt(“age”,40)
- between(“age”,20,40)
- isNotNull(“email”)
- orderByDesc(“age”)
- orderByAsc(“age”)
- or
- isNotNull(“email”)
- applay:拼接sql(
注意存在sql注入
)
- apply(“date_format(dateColumn,’%Y-%m-%d’) = {0}”, “2008-08-08”)
- inSql:sql子查询
- inSql(“maragent_id”,”select id from user where name like ‘王%’ “)
- 特殊查询
- queryWrapper.likeRight(“name”,”王”).and(wq->wq.lt(“age”,40).
or()
.isNotNull
(“email”)) //name like ‘王%’ and (age<40 or email is not null)- nested:正常嵌套 不带 AND 或者 OR
- queryWrapper.nested(wq->wq.lt(“age”,40).or().isNotNull(“email”)).likeRight(“name”,”王”)// (age<40 or email is not null) and name like ‘王%’
- in(“age”,Arrays.asList(1,2,3))
- last: 无视优化规则直接拼接到 sql 的最后,有sql注入风险
- 例:last(“limit 1”)
- .likeLeft()
select查询中字段不全部出现的查询
- queryWrapper.select(“id,name,age”) //查询指定字段
- queryWrapper(User.class,info->!info.getCloumn().equals(“create_time”)&&!info.getCloumn().equals(“manager_id”))//排除指定字段
条件构造器condition
condition作用:(执行条件,表示是否将该条件加入到该查询中 例:like(boolean condition,column,val))
QueryWrapper<User> queryWrapper=new QueryWrapper<User>(); if(StringUtils.isNotEmpty(name)){ queryWrapper.like("name",name); } if(StringUtils.isNotEmpty(emaiI)){ queryWrapper.like("email",email); } queryWrapper.like(StringUtiIs.isN0tEmpty(name),"name",name) .like(StringUtils.isNotEmpty(email),"email",email); List<User>userList=userMapper.selectList(queryWrapper); userList.forEach(System.out::println);
创建条件构造器时传入实体(下面图片查询条件name和age冲突了)
User whereUser=new User(); whereUser.setName("刘红雨"); whereUser.setAge(32); QueryWrapper<User> queryWrapper=new QueryWrapper<User>(whereUser) //queryWrapper.like("name","雨").lt("age",40); List<User>userList=userMapper.selectList(queryWrapper); userList.forEach(System.out:printIn);
@TableField(condition=SqlCondition.LIKE) //结合截图,标注实体查询的方式是等值还是模糊查询
@TableField(condition="%s<#{%s}") //相当于小于查询
```
条件构造器中allEq用法
allEq(Map<R, V> params) allEq(Map<R, V> params, boolean null2IsNull) allEq(boolean condition, Map<R, V> params, boolean null2IsNull) 参数: params : key为数据库字段名,value为字段值 null2IsNull : 在map的value为null时调用isNull方法,boolean为false时则忽略value为null的 QueryWrapper<User> queryWrapper=new QueryWrapper<User>(); Map<String,ObJect> params=new HashMap<String,ObJect>(); params.put("name","王天风"); params.put("age",25); queryWrapper.allEq(params); List<User> userList=userMapper.seIectList(queryWrapper); userList.forEach(System.out.println);
- params.put(“name”,null);//默认转换为 name is null
- queryWrapper.allEq(params,false);
- queryWrapper.allWq((k,v)->!k.equals(“name”),params) //过滤掉name字段去查询
- 聚合查询:
QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
queryWrapper.select("avg(age) avg_age","min(age) min_age","max(age) max_age")
.groupBy("manager_id").having("sum(age)<{0}",500);
List<Map<String, Object>> userList = userMapper.selectMaps(queryWrapper);
userList.forEach(System.out::println);
lambda查询(防误写作用)
创建方式:
1. LambdaQueryWrapper<User> lambda=new QueryWrapper<User>().lambda(); 2. LambdaQueryWrapper<User> lambda=new LambdaQueryWrapper<User>(); 3. LambdaQueryWrapper<User> lambda=Wrappers.<User>lambdaQuery();
使用:
- List
list=new LambdaQueryChainWrapper (userMapper).like(User::getName,”雨”).list(); //list()实现了ChainQuery方法。里面包含 list one count page等方法
- List
使用条件构造器自定义SQL (自定义sql且使用wrapper,需要版本大于等于3.0.7)
- Mapper中
- List
selectAll(@Param(Constants.WRAPPER) Wrapper wrapper); - 在selectAll上加sql注解@Select(“select * from user ${ew.customSqlSegment}”)。
- xml文件配置时,直接将注解中sql配置到xml文件即可。//都不需要加where会自动判断
- List
- Mapper中
MP物理分页插件
配置插件和使用
@Configuration public class MybatisPlusConfig { @Bean public PaginationInterceptor paginationInterceptor() { PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false // paginationInterceptor.setOverflow(false); // 设置最大单页限制数量,默认 500 条,-1 不受限制 // paginationInterceptor.setLimit(500); // 开启 count 的 join 优化,只针对部分 left join paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true)); return paginationInterceptor; } } //方法一:使用(会自动发送两条sql count和详情) Page<User> page=new Page<User>(1,10); IPage<User> iPage=userMapper.selectPage(page,queryWrapper); //返回Map的IPage<Map> iPage=userMapper.selectMapsPage(page,queryWrapper); iPage.getPages(); iPage.geTotal(); //方法二:自定义sql查询 Mapper文件: IPage<User> selectUserPage(Page<User>,@Param(Constants.WRAPPER) Wrapper<User> wrapper);//第一个参数必须是Page对象 xml文件: id=“selectUserPage” resultType="xxx.User" select * from user ${ew.customSqlSegment}
crud操作
select
//查询方式一 QueryWrapper<User> queryWrapper=new QueryWrapper<User>();//方式一 QueryWrapper<User> queryWrapper=Wrappers.<User>query();//方式二 //查询方式二 lambdaChain方式更新 List<User> userList=userServices.lambdaQuery.gt(User::getAge,25),like(User::getName,"雨").list(); selectBatchIds(Arrays.asList(1,2,3));#`in查询` selectByMap(Map<String,Object> map);#key->表字段,value->字段值(`and查询`)
update方法
1.更新方式一 //添加where条件两种方式 //方式一 User whereUser=new User(); whereUser.setName("张三"); whereUser.setAge(20); //UpdateWrapper写法1 UpdateWrapper<User> updateWrapper=new UpdateWrapper<User>(whereUser); //UpdateWrapper写法2 UpdateWrapper<User> updateWrapper=Wrappers.<User>lambdaUpdate(); //方式二 updateWrapper.eq("name","张三").eq("age",28); User user=new User(); user.setAge(20); int rows=userMapper.update(user,updateWrapper); 2.更新方式二 UpdateWrapper<User> updateWrapper=new UpdateWrapper<User>(); updateWrapper.eq("name","张三").eq("id",10).set("age",30); int rows=userMapper.update(null,updateWrapper); 3. lambdaChain方式更新 boolean updateRows=new LambdaUpdateChainWrapper<User>(userMapper) .eq(User::getName,"张三").eq(User::getAget,31).update();
delete方法
参考update boolean removeRows=userServices.lambdaUpdate().eq(User:getId,24).remove();
id生成策略
- 默认主键字段名为id,如果不为id,字段注解加@TableId(name=”user_id”,type=IdType.NONE) 【IdType种类很多,支持自增,uuid,雪花算法等】
- yml可以配置主键自动生成全局策略 mybatis-plus.gloobal-config.db-config.id-type:auto //uuid 局部策略优先全局策略
- 默认主键字段名为id,如果不为id,字段注解加@TableId(name=”user_id”,type=IdType.NONE) 【IdType种类很多,支持自增,uuid,雪花算法等】
基本配置
mybatis-plus: mapper-locations: - com/mp/mappers global-config: db-config: id-type:uuid //主键自动生成全局策略(支持自增,uuid,雪花算法等) config-locayion: classpath:mybatis-config.xml //自定义文件路径 type-aliases-package: com.mp.entity //配置后,在mapper.xml中就不需要写实体全路径了 map-underscore-to-camel-case: true //默认就是true,开启驼峰 field-strategy: not-enpty //默认更新时 等于null的字段不进行更新。如果配置为not-null,则会为没有值的字段插入null。 //实体对象中可以通过strategy=FieldStrategy.NOT_EMPTY配置
通用Services
//接口 public interface UserServices extends IServices<User>{} //实现类 @Services public class UserServicesImpl extends ServicesImpl<UserMapper,User> implements UserServices{}
```