mybatis-plus学习笔记


mybatis-plus学习笔记

排除非表字段的三种方式

  1. private transient String remark; //缺点:不能序列化
  2. private static String remark;然后get set //mp会自动忽略static字段
  3. 注解@TableField参数:
    1. exit=false //exit标记为不是数据库字段;
    2. condition=SqlCondition.LIKE //condition标记实体查询时查询条件用何种方式;
    3. strategy=FieldStrategy.NOT_EMPTY //默认更新时 等于null的字段不进行更新。如果配置为not-null,则会为没有值的字段插入null。查询、删除、更新均受影响(慎用)

普通查询(通用Mapper)

  1. 条件构造器 AbstractWrapper

    1. 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”)
  2. select查询中字段不全部出现的查询

    1. queryWrapper.select(“id,name,age”) //查询指定字段
    2. queryWrapper(User.class,info->!info.getCloumn().equals(“create_time”)&&!info.getCloumn().equals(“manager_id”))//排除指定字段
  3. 条件构造器condition

    1. 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);
      
  1. 创建条件构造器时传入实体(下面图片查询条件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&lt;#{%s}") //相当于小于查询
  ```
  1. 条件构造器中allEq用法

    1. 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方法,booleanfalse时则忽略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); 

  1. params.put(“name”,null);//默认转换为 name is null
  2. queryWrapper.allEq(params,false);
  3. queryWrapper.allWq((k,v)->!k.equals(“name”),params) //过滤掉name字段去查询
  4. 聚合查询:
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);
  1. lambda查询(防误写作用)

    1. 创建方式:

      1. LambdaQueryWrapper<User> lambda=new QueryWrapper<User>().lambda();
      2. LambdaQueryWrapper<User> lambda=new  LambdaQueryWrapper<User>();
      3. LambdaQueryWrapper<User> lambda=Wrappers.<User>lambdaQuery();
    2. 使用:

      1. List list=new LambdaQueryChainWrapper(userMapper).like(User::getName,”雨”).list(); //list()实现了ChainQuery方法。里面包含 list one count page等方法
  2. 使用条件构造器自定义SQL (自定义sql且使用wrapper,需要版本大于等于3.0.7)

    1. Mapper中
      1. List selectAll(@Param(Constants.WRAPPER) Wrapper wrapper);
        1. 在selectAll上加sql注解@Select(“select * from user ${ew.customSqlSegment}”)。
        2. xml文件配置时,直接将注解中sql配置到xml文件即可。//都不需要加where会自动判断
  3. MP物理分页插件

    1. 配置插件和使用

      @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}
      
  1. crud操作

    1. select

      1. //查询方式一
        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查询`)
    2. update方法

      1. 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();
        
      2. delete方法

        1.  参考update
            boolean removeRows=userServices.lambdaUpdate().eq(User:getId,24).remove();
  2. id生成策略

    1. 默认主键字段名为id,如果不为id,字段注解加@TableId(name=”user_id”,type=IdType.NONE) 【IdType种类很多,支持自增,uuid,雪花算法等】
      1. yml可以配置主键自动生成全局策略 mybatis-plus.gloobal-config.db-config.id-type:auto //uuid 局部策略优先全局策略
  3. 基本配置

    1. 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配置
  4. 通用Services

    1. //接口 
      public interface UserServices extends IServices<User>{}
      //实现类
      @Services 
      public  class UserServicesImpl  extends ServicesImpl<UserMapper,User> implements UserServices{}
      
      
   ```
  1. 进阶教程


文章作者: zhaolin.long
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 zhaolin.long !
  目录