MyBatis MyBatis with Springboot
扩展 BaseMapper 通用方法
https://baomidou.com/pages/42ea4a/
- SQL 自动注入器接口
ISqlInjector
public interface ISqlInjector {
/**
* 检查SQL是否注入(已经注入过不再注入)
*/
void inspectInject(MapperBuilderAssistant builderAssistant, Class<?> mapperClass);
}自定义自己的通用方法可以实现接口 ISqlInjector 也可以继承抽象类 AbstractSqlInjector 注入通用方法 SQL 语句 然后继承 BaseMapper 添加自定义方法,全局配置 sqlInjector 注入 MP 会自动将类所有方法注入到 mybatis 容器中。
条件构造器 Wrapper API
https://baomidou.com/pages/10c804/#abstractwrapper
QueryWrapper(LambdaQueryWrapper) 和 UpdateWrapper(LambdaUpdateWrapper) 的父类
用于生成 sql 的 where 条件, entity 属性也用于生成 sql 的 where 条件
LambdaQueryWrapper
QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>()
// eq/ne/gt/lt/ge/le
queryWrapper.eq(UserInfo::getAge,20); // age=20
queryWrapper.ne(UserInfo::getAge,20); // age!=20
queryWrapper.gt(UserInfo::getAge,20); // age>20
queryWrapper.lt(UserInfo::getAge,20); // age<20
// isNull/isnotNUll
queryWrapper.isNull(UserInfo::getAge); // age is null
queryWrapper.isNotNull(UserInfo::getAge); // age is not null
// like/notLike/likeLeft/likeRight
queryWrapper.like(UserInfo::getName,"zhangsan"); //name like 'zhangsan'
queryWrapper.notLike(UserInfo::getName,"zhangsan"); //name not like 'zhangsan'
queryWrapper.likeLeft(UserInfo::getName,"zhangsan"); //name like '%zhangsan'
queryWrapper.likeRight(UserInfo::getName,"zhangsan"); //name like 'zhangsan%'
// orderBy/orderByAsc/orderByDesc
queryWrapper.orderBy(UserInfo::getAge); // order by age
queryWrapper.orderByAsc(UserInfo::getAge); // order by age asc
queryWrapper.orderByDesc(UserInfo::getAge); // order by age desc
// between/notBetween
queryWrapper.between(UserInfo::getAge,20,30); // age between 20 and 30
queryWrapper.notBetween(UserInfo::getAge,20,30); // age not between 20 and 30
// in/notIn
queryWrapper.in(UserInfo::getAge,List.newArrayList(20,25,30));// age in (20,25,30)
queryWrapper.notIn(UserInfo::getAge,List.newArrayList(20,25,30)); // age not in (20,25,30)
//inSql/notInSql
queryWrapper.inSql(User::getRoleId, "select id from role where id = 2") // role_id in (select id from role where id = 2)
queryWrapper.notInSql(User::getRoleId, "select id from role where id = 2") // role_id not in (select id from role where id = 2)
//exist/notExist
queryWrapper.exist("select role_id from tb_role where role_id="+10);
queryWrapper.notExist("select role_id from tb_role where role_id="+10);
// and/or 用法,注意and 和or后面都有括号包裹
queryWrapper.and(i -> i.gt(User::getAge, 20).le(User::getAge,10))) // and (age>20 and age<10)
queryWrapper.or(i -> i.gt(User::getAge, 20).eq(User::getName,'AAA'))) // or (age>20 and name='AAA')
// groupBy/having
queryWrapper.groupBy("cust_Id"); //group by cust_id
queryWrapper.having("count(*) > 1"); //having count(*)>1
//allEq用法
Map<String, Object> params = new HashMap<String, Object>();
params.put("nuserame","xiaojuan");
params.put("age",null);
queryWrapper.allEq((k,v)->!k.equals("name"),params)
// last用法
queryWrapper.last("LIMIT 10");
//apply用法--即实现sql注入
queryWrapper.apply("role_id = 2") // role_id = 2
// nested用法
queryWrapper.nested(i -> i.eq(User::getRoleId, 2L).or().eq(User::getRoleId, 3L)) // (role_id=2 or role_id=3)
// setEntity/nonEmptyOfEntity 用法
UserDO user = new UserDO(1,20,"zhansgan");
queryWrapper.setEntity(user); // id = 1 and age=20 and name=zhangsan
queryWrapper.nonEmptyOfEntity(user); // id = 1 and age=20 and name=zhangsan
// select用法
queryWrapper.select("id,age,name"); //select id,age,name
//使用select insql groupby 实现组合查询
List<Map<String, Object>> maps = this.learnerCourseService.listMaps(new QueryWrapper<LearnerCourseDO>()
.select("schedule_id scheduleId,count(*) count")
.inSql("schedule_id", "279,365,348")
.groupBy("schedule_id"));