MyBaits-plus

  • Post author:
  • Post category:其他


官方文档:

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。



版权声明:本文为qq_38895905原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。