zoukankan      html  css  js  c++  java
  • MyBatisPlus对sql多条件查询

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

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

    @TableField(value = "DEMO_ID", strategy = FieldStrategy.IGNORED)

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

    例:

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

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

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

    Service层利用mybatis-plus操作:
    在service层插入操作为insert() 控制层插入:save(Entity)/saveBatch(List<Entity>)

    新增:

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

    if(rows >0) {

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

     删除:

    /**
    * 删除数据
    * 1. 删除Id=53 54
    */
    @SuppressWarnings("rawtypes")
    @Test
    public void deleteUsers() {
    //1.根据主键删除数据
    //userMapper.deleteById(53);
    //userMapper.deleteById(54);
    Integer[] ids = {53,54};
    //2.批量删除
    List list = Arrays.asList(ids);
    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);
    }


    对于修改的总结:
    如果已经主键,一般使用updateById.
    如果获取的是其他属性字段,则使用update
    Demo:      //User对象(40个属性) 修改id=10号元素.
                            User user = userMapper.selectById(10);
                    //修改bir的生日改为今天 date
                           user.setBir(new Date);
                           userMapper.updateById(user);
                   //修改了除id之外的所有字段.
                          User userTemp = new User();
                          userTemp.setBir(new Date());
                          userTemp.setId(10);
                          userMapper.updateById(userTemp);
                注意:只修改1个字段的原则是:
                                 如果利用Mybatisplus的操作过于繁琐时.则使用sql语句方式操作更快

    查询:

    /**
    * 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    

    举例说明:校验新增的数据的id是否已存在

    //假定insertDemoEntity 为前端传递过来的数据
    DemoEntity insertDemoEntity = new DemoEntity();  
    DemoEntity demoEntity = demoMapper.selectOne(Wrappers.<DemoEntity>query().lambda()
    .eq(DemoEntity::getId,insertDemoEntity.getId()));
    if(null!=demoEntity){
    return Result(false,"插入数据的ID已存在!");
    }

    备注: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);
    
    
  • 相关阅读:
    ASP.NET Core 2.2 : 二十七. JWT与用户授权(细化到Action)
    ASP.NET Core 2.2 : 二十六. 应用JWT进行用户认证及Token的刷新
    ASP.NET Core 发布到Linux需要注意的地方
    小程序根据数字做for循环
    Visual Studio 2019 正式版 更新内容
    CodeSmith 二、多模板按目录树批量自动生成代码
    CodeSmith 一、连接Mysql
    ASP.NET Core 2.2 十九. Action参数的映射与模型绑定
    ASP.NET Core 2.2 十八.各种Filter的内部处理机制及执行顺序
    ASP.NET Core 2.2 : 十七.Action的执行(Endpoint.RequestDelegate后面的故事)
  • 原文地址:https://www.cnblogs.com/pureray-hui/p/12378379.html
Copyright © 2011-2022 走看看