MyBatisPlus对sql多条件查询+函数流处理

先说说近期使用mybatis-plus踩的坑:

坑点一:mybatis-plus会默认不更新字段为null的字段,但是当必须将某个字段设置为null时(尤其在日期/时间上),需要在对应的实体类的属性上上添加注释: 例如表单字段 DEMO_ID

@TableField(value = "DEMO_ID", strategy = FieldStrategy.IGNORED)
private String demoId;

坑点二:当添加了上述注释后,尤其在做某些操作(比如区块链上链-更新),后端默认只将前端传过来的数据(部分数据)——区块链信息进行数据上链-更新,在本地库更新数据时,会直接用丢失添加注释的数据,此时解决办法是重新在本地库查询一条或多条数据重新赋值再更新。

例:数据库进行操作 1:sql语句  2:通过Dao接口继承BaseMapper<Xxx>(构造器导入)

       对于使用mybatis plus对数据库以每个实例为单位进行操作时:但实体类属性没有对应的数据库字段问题

@TableName("user")           //该注解在实体类上指定映射数据库表名 数据库名与实体类名一样时可以不写
public class userEntity{
@TableField("name")          //注解是指定非字段名映射 字段名不相同时使用
private String name;
@TableField(exist=false)     //exist默认为true(对应数据库字段) false为数据库中未有与之对应的字段,仅是后端操作便利
private static String remake;

}
Service层利用mybatis-plus操作:   

新增(基础):

   User user = new User();

  user.setId(null).setName("张三").setAge(23).setSex("男");
   int rows = userMapper.save(user);

 if(rows >0) {

    System.out.println("用户入库成功!");
}

  

 删除(基础):

/**
* 删除数据
* 1. 删除Id=53 54
*/
@SuppressWarnings("rawtypes")
@Test
public void deleteUsers() {
//1.根据主键删除数据
  userMapper.deleteById(53);
  userMapper.deleteById(54);

//2.批量删除(前端传过来批量删除数据的id是通过",'拼接的字符串ids)
   List list = Arrays.asList(ids.split(","));
   userMapper.deleteBatchIds(list);
}

 

修改(基础):

/**
* 修改操作 要求将55号数据改为 name=A班 age=10 sex="男"
*/
@Test
public void updateUser() {
User user = new User();
user.setId(55)
.setName("A班")
.setAge(10)
.setSex("男");
userMapper.updateById(user);
}

/**
* 修改name为null的元素,name=张三age=18 sex="女"
* entity: 要修改后的数据
* updateWrapper: 修改条件构造器
*/
@Test
public void updateUser2() {
User user = new User();
user.setName("张三").setAge(18).setSex("女");
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
updateWrapper.isNull("name");
userMapper.update(user, updateWrapper);
}

修改和新增一般用:saveOrUpdate(demoEntity);   

    1)当有主键时默认执行修改操作,demoEntity里为null的字段不修改 ;

    2)当没有主键ID则执行新增操作

  

查询(基础):

   /**
   * 1.根据主键Id查询
   */
@Test
public void findById() {
    User user = userMapper.selectById(12);
    System.out.println(user);
}

 

   /* 2.按照name属性查询 A班

   * QueryWrapper条件构造器:
   * 目的:利用对象中不为null的属性充当where条件构建
   */
@Test
public void findByName() {
   User user = new User();
   user.setName("A班");
   QueryWrapper<User> queryWrapper = new QueryWrapper<User>(user);
   List<User> userList = userMapper.selectList(queryWrapper);
  System.out.println(userList);
}

 

  /**
   *   多条件查询
   * name=1907班 and age < 20
   * = (等于用“eq”)  

   * > (大于用“gt”)   

   * <(小于用" lt")

   * >=(大于等于用"ge")

   * <=(小于等于用"le")
   */
@Test
public void findByMore() {
QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
queryWrapper.eq("name", "A班").lt("age", 20);
List<User> userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}

 

   /**
   * name=A班 or age < 20
   */
@Test
public void findByOr() {
QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
queryWrapper.eq("name", "A班")
.or()
.lt("age", 20);

List<User> userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}

//查询年龄 age大于18 age<45 sex="男"
@Test
public void findByBet() {
QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
queryWrapper.eq("sex","男").between("age", 18, 45);
List<User> userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}

   /**
   * 模糊查询 名称中包含 乔字
   */
@Test
public void findByLike() {
QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
queryWrapper.like("name", "%乔%");
List<User> userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}

   /**
   * 查询 名称为null的数据
   */
@Test
public void findByNull() {
QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
queryWrapper.isNull("name");
List<User> userList = userMapper.selectList(queryWrapper);
System.out.println(userList);
}

  

mybatis-plus与mybatis相比最核心点是-------------lambda表达式

举例说明:校验新增的数据的某一个必填字段是否已存在(例如用户表的username 例如:张三、李四、王五:zhangs、lis、wangw)

例1 //假定userInsertEntity 为前端传递过来的数据

UserEntity userEntity = new UserEntity();
UserEntity checkEntity = userMapper.selectOne(Wrappers.<UserEntity>query().lambda()
.eq(UserEntity::getUsername,userInsertEntity.getUsername()));
if(null!=demoEntity){
return Result(false,"插入数据的ID已存在!");
}

 

 例2 //查询未处理且在证书有效期的数据

   List<DemoInfo> demoInfoList = demoInfoService.list(Wrappers.lambdaQuery(DemoInfo.class)
    .eq(DemoInfo::getHamdleStatus,0)                         //数据状态为未处置
    .ge(DemoInfo::getLicenseDate,new Date())            //在证书有效期内
   );

 

例3://查询本月的告警数据

  DateFormat df = new SimpleDateFormat(pattern);
  TimeZone timeZoneCN = TimeZone.getTimeZone("Asia/Shanghai");
  df.setTimeZone(timeZoneCN);
  df.setLenient(false);

  String currentMonth =df.format(new Date());

  List<DemoAlarmInfo> DemoAlarmInfoList = demoAlarmInfoService.list(Wrappers.lambdaQuery(DemoAlarmInfo.class)
       .apply("date_format(create_time,'%Y-%m') ={0} " ,currentMonth)); //本月的告警数据

 

例4://查询在某一时间端的数据(一般用在条件查询 时间范围值都封装在entity里)

   QueryWrapper<DemoAlarmInfo> qw=new QueryWrapper<>();
     if(StringUtils.isNotEmpty(entity.getStartTime())){
    qw.apply("DATE_FORMAT(demo_time,'%Y-%m-%d')>={0}",entity.getStartTime());
 }
if(StringUtils.isNotEmpty(entity.getEndTime())){
    qw.apply("DATE_FORMAT(demo_time,'%Y-%m-%d')<={0}",entity.getEndTime());
}

 

备注:BaseMapper<T>接口方法

int insert(T entity);

int deleteById(Serializable id);

int deleteByMap(@Param("cm") Map<String, Object> columnMap);

int delete(@Param("ew") Wrapper<T> wrapper);

int deleteBatchIds(@Param("coll") Collection<? extends Serializable> idList);

int updateById(@Param("et") T entity);

int update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper);

T selectById(Serializable id);

List<T> selectBatchIds(@Param("coll") Collection<? extends Serializable> idList);

List<T> selectByMap(@Param("cm") Map<String, Object> columnMap);

T selectOne(@Param("ew") Wrapper<T> queryWrapper);

Integer selectCount(@Param("ew") Wrapper<T> queryWrapper);

List<T> selectList(@Param("ew") Wrapper<T> queryWrapper);

List<Map<String, Object>> selectMaps(@Param("ew") Wrapper<T> queryWrapper);

List<Object> selectObjs(@Param("ew") Wrapper<T> queryWrapper);

IPage<T> selectPage(IPage<T> page, @Param("ew") Wrapper<T> queryWrapper);

IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param("ew") Wrapper<T> queryWrapper);

posted @ 2020-02-28 18:13  唯恐不及  阅读(22859)  评论(0编辑  收藏  举报