官方文档:
https://mp.baomidou.com/guide/crud-interface.html#selectbatchids
插入
int insert(T entity)
@TableName("表名")
@TableId 注释于主键上面用来对应表的主键
@TableFileld("name")直接对应表中字段名
对表中没有的字段,就不成为表中数据的属性,解决方法 3 种:
1.加入transient修饰,让它不序列化
2.加static修饰 mp会给忽略掉
3.@TableField(exist=false)
查询:
1.基本查询法 注意点:map查询的时候key存储的是数据库当中的列
1.selectById(id)
2. ..
2.AbstractWrapper:条件构造器
条件查询:QueryWrapper<你要操作的实体> –>AbstractWrapper的子类
例如
QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
或者 = Wrappers.<User>query();
queryWrapper.like("name","as").lt("age",40);
List<User> userList = userMapper.selectList(queryMapper);
表示名字中含有as,年纪小于40的,然后将其作为map查询,
queryWrapper.select("cloumn1","column2"...)
可以设置查询列的数目,或者
.select(User.class,info->!info.getColumn.equals("cloumn name")&&info->..)
通过这种方法排除字段
QueryWrapper<User> queryWrapper = new QueryWrapper<User>(可以带entity参数);
例如:
User u = new User();
user.setName("abc");
QueryWrapper<User> queryWrapper = new QueryWrapper<User>(u) ;
这个时候运行就会将name = “abc”放到where当中运行。并且后面假如有 queryWrapper.like(“namer”,”cd”)这样模糊查询名字中含有cd的,不会发生冲突但两块都会放到where条件中
3.Condition
执行条件:true or false。像lt这样的一般有三个参数,第一个是condition,默认为true,指明这个条件是否假如最后的where语句中。
比如上面的 :
queryWrapper.lt("age",40);
List<User> userList = userMapper.selectList(queryWrapper)
在执行的时候,日志显示就是
select * from User where ?< ?
参数就是age ,40
这个时候condition就是true默认,假如false则不会加入where语句,可以用于判断
queryWrapper.like(StringUtils.isNotEmpty(name),"name","王")
即模糊查询名字中带王的,如果名字为空condition为false就不会写到where条件当中,通过condition控制条件加不加入where语句中
4.AllEq(Map<k,v>map,boolean isnull)
QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
Map<String,Object> params = new HashMap<String,Object>();
params.put("name","abc");
params.put("sex",null);
queryWrapper.allEq(params);
..
编译时就是
..where name = ? AND sex IS NULL
这时候后面boolean的参数默认为true,如果设为false
queryWrapper.allEq(params);
编译时就是
.. where name = ?
null的被忽略了
AllEq(BiPredict,Map<K,V>map)
前面是一个过滤函数式接口,可以用来选择什么不会出现在where中,例如 :
queryWrapper.allEq((k,v)->!k.equals("name"),params)
表示key不等于name的才会被假如到条件当中,就在where中过滤了key=”name”的,当然也可以通过value来写判断条件过滤。value需要注意数据类型。
5.selectMaps(queryWrapper)
返回类型是List<Map<String,Object>> string是数据库列名,object是里面的数据。应用于数据库字段较多不需要查询多少时,就不需要用实体来映射,用map即可
举个例子,选择平均年龄,按照性别分组,总年纪大于500的组
queryWrapper.select("avg(age) avg_age")
.groupBy("sex")
.having("sum(age)<{0}",500)
6.selectObjects(queryWrapper)
返回类型是List<Object>
只返回第一列,其它列不管有没有select都会被舍弃
7.selectCount(queryWrapper)
返回类型是integer
查询总记录数,用这个就不要用select了。默认是select count(1)
8.selectOne(queryWrapper)
返回值类型是实体类型,一条
筛选条件选完后必须只有一条符合,多了会报错
9.Lambda条件构造器
9.1 创建方法
LambdaQueryWrapper<User> lambdaQuery = Wrapppers.<User>lambdaQuery(); 或者
LambdaQueryWrapper<User> lambdaQuery = new LambdaQueryWrapper<User>(); 或者
LambdaQueryWrapper<User> lambdaQuery = new QueryWrapper<User>().lambda();
9.2 使用
例如 选择名字中含王,年纪大于20的
lambdaQuery.like(User::getName(),"王").gt(User::getAge,20);
依然会生成
where name like "%王%" and age>20
然后将用queryWrapper作为参数的改为lambdaQuery用就行。
10.分页(MP提供的是物理分页插件不是逻辑分页)
1.建立一个配置类
@Configuration
public class MyBaitsPlusConfig{
@Bean
public PeginationInterceptor peginationInterceptor(){
return new PeginationInterceptor();
}
}
2.selectPage(Ipage<T> page,Wrapper<T> queryWrapper)
返回值类型是Ipage<T>,两个参数,一个是Ipage类型的对象,一个是构造器
3.selectMapsPage(Ipage<T> page,Wrapper<T> queryWrapper)
返回类型是Ipage<Map<String,Object>>
4.
Page<当前实体> page = new Page<当前实体>(当前页数,每页多少条)
例如:
QueryWrapper queryWrapper...
queryWrapper.lt("age",20);
Page<User> page = new Page<User>(1,2);
IPage<User> iPage = userMapper.selectPage(page,queryWrapper);
sout...(iPage.getPages());//获取总页数
sout...(iPage.getTotal());//获取总记录数
List<User> userList = iPage.getRecords();//查询出的记录
userList。forEach(System.out::println);//迭代输出记录
会执行两句select语句:
select count(1) from user where age < ?
select 字段1...from user where age < ? limit ?,?
或者
…
IPage<Map<String,Object>> iPage =
userMapper.selectMappersPage<page,queryWrapper>
…
SQL语句一样的两句
用不用Map区别和之前的一样
但是每次查询都会有 select count(1) from user where age < ?查询总构造数。这个时候page还有三个参数的构造方法,第三个参数是true或者false
true就是查询总构造数,false就是不查询。
... = new Page<User>(1,2,false);
更新
1.updateById(T entity)
User user = ...
user.setId(..);//这个id会出现在where语句当中
user.setName(...);
..
int rows = userMapper.updateById(user);
返回结果是影响行数
2.update(T entity,Wrapper<T> updateWrapper)
第一个实体设置的条件会出现在set语句中,updateWrapper设置的则是会出现在where条件中
UpdateWrapper<User> updateWrapper = new ...;
updateWrapper.eq("name","abc").eq("age",30);
User user = ...;
user.setId(..);
user.setSex(...);
int rows = userMapper.updateById(user,updateWrapper);
同样返回更新条数。
但是,假如在queryWrapper上面有set,那个set语句一样会出现在where中,如果和queryWrapper当中一样还会有冲突。
3.update(null,updateWrapper)
更新不new实体
UpdateWrapper<User> updateWrapper = new ...;
updateWrapper.eq("name","abc").eq("age",30).set("age",10);
int rows = userMapper.update(null,updateWrapper);
4.LambdaUpdateWrapper
LambdaUpdateWrapper<User> lambdaUpdate = Wrappers. <User>lambdaUpdate();
lambdaUpdate.eq(User::getName,"abc").set(User::getAge,31);
int rows = userMapper.update(null,updateWrapper);
5.Lambda链
boolean update = new LambdaUpdateChainWrapper<User>(userMapper).eq(User::getName,”abc”).set(User::getAge,50);
输出true或者false,判断时更新大于一成功。
删除
1.deleteById(id)
int rows = userMapper.deleteById(id);
返回影响的行数
2.deleteByMap(Map map)
与selectByMap类似
Map<String,Object> map = new HashMap<>();
map.put("name","abc");
map.put("age",30);//会将map中put的放在where条件当中
int rows = userMapper.deleteByMap(map);
3.deleteBatchIds(Collection<? extends Serializable> idList)
//根据id批量删除
int rows
= userMapper.deleteBatchIds(ArrayList.asList(id1,id2,id3));
4.delete(QueryWrapper qwr)
用的是queryWrapper
例如:
.. lambdaQueryWrapper = ...
lambdaQueryWrapper.eq(User::getName,"abc");
int rows = userMapper.delete(lambdaQueryWrapper);
AR(Active Record)
活动记录,领域模型模式。就是直接通过实体类对表进行增删改查。
在mp当中实现AR :
1.实体类需要 extend Model<当前实体类>
2.必须存在Mapper接口继承BaseMapper
例如:
User user = new User();
user.setName("cdb");
...
boolean row = user.insert();
就可以这样直接插入数据库
例如:
User user = ...;
User selectUserById = user.selectById(...);
可以查出数据,但和user不是一个对象而是创建了一个新对象
例如:
User user = new User();
user.setId(....);//此id会出现在where当中
user.setName("csd");//此name会出现在set当中
boolean updateById = user.updateById();
可以正常更新
例如
user.setId(....);//此id会出现在where当中
boolean r = user.deleteById(...);
可以进行删除,还有insertOrUpdate
insertOrUpdate
User user = new User();
user.setName("cdb");
...
boolean rows = user.insertOrUpdate(user);
如果上面没有id,会直接执行insert语句,有的会先查询,查得到update,查不到insert。