美文网首页
mybatis plus项目中用法小结

mybatis plus项目中用法小结

作者: 墨色尘埃 | 来源:发表于2019-04-23 15:59 被阅读0次

    1. 传入集合参数

    GET方式也可以接收List参数

        /**
         * 报名表打印
         */
        @RequestMapping(value = "/print", method = RequestMethod.GET)
        public ResponseObj<List<SubjectEnrollDetail>> print(@RequestParam List<Long> ids) throws Exception {
            List<SubjectEnrollDetail> list = serviceDetail.selectList(new EntityWrapper<SubjectEnrollDetail>().in("id",
                    ids));
            RetCode retCode = list != null ? RetCode.SUCCESS : RetCode.FAIL;
            return new ResponseObj<>(list, retCode);
        }
    ![image.png](https://img.haomeiwen.com/i1461379/4678bf0a5aa2d85e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    
    

    2、mybatis plus物理删除和逻辑删除

    物理删除时,表对应的类中的字段不要加@TableLogic,application.yml中还存在配置倒是无所谓

    image.png

    3、mybatis-plus自定义分页

    不使用service.selectPage()方法
    mybatis-plus分页查询

    4、resultType映射返回对象问题

    当需要返回对象时,使用resultMap能成功,但是resultType不成功
    FileModel类

    5、批量查找问题

    mybatis批量插入、批量更新和批量删除

    @Mapper
    public interface FileMapper extends BaseMapper<FileModel> {
        List<FileModel> downPhoto(String[] array);
    
        List<FileModel> downPhotoList(List<String> list);
    }
    

    传数组

        <select id="downPhoto" parameterType="java.lang.String"
                resultMap="BaseResultMap">
    
            SELECT
            a.*, e.idcard
            FROM
            t_attachment a
            LEFT JOIN t_auth_enroll e ON a.approval_id = e.id
            WHERE
            a.approval_id IN
            <foreach collection="array" item="approvalId" open="(" separator="," close=")">
                #{approvalId}
            </foreach>
        </select>
    

    传集合

        <select id="downPhotoList" parameterType="java.lang.String"
                resultMap="BaseResultMap">
    
            SELECT
            a.*, e.idcard
            FROM
            t_attachment a
            LEFT JOIN t_auth_enroll e ON a.approval_id = e.id
            WHERE
            a.approval_id IN
            <foreach collection="list" item="approvalId" open="(" separator="," close=")">
                #{approvalId}
            </foreach>
        </select>
    

    6、参数接收问题

    mybatis plus中如果传入三个参数,有两个是非必传参数,那么可以将参数改为对象传进来,对象里有这三个属性

        @RequestMapping(value = "/exportPhoto", method = RequestMethod.POST)
        public void exportPhoto(@ModelAttribute AuthEnroll authEnroll){
    
        }
    

    7、in查询、以及只查询某一列的数据

    (1)

    List<Map<String, Object>> mapList = fileService.selectMaps(new EntityWrapper<FileModel>().in("approval_id", ids).setSqlSelect("file_id"));
    
    

    这一段SQLfileService.selectMaps(new EntityWrapper<FileModel>().in("approval_id", ids)的返回结果是List集合,集合里的元素是对象。如果不需要f返回对象的全部数据,而只是想要某一个字段的数据呢?可以使用setSqlSelect(),这里.setSqlSelect("file_id")是只查询file_id列的数据,返回List<Map<String, Object>>

    如果想要两个字段的数据,不能使用.setSqlSelect("file_id").setSqlSelect("file_name"),后面的会覆盖前面的。应该这样使用.setSqlSelect("file_id","file_name")

    (2)

    List<FileModel> mapList = fileService.selectList(new EntityWrapper<FileModel>().in("approval_id", ids).setSqlSelect("file_id"));
    

    同上,只不过返回的集合中是Object,而不是Map。此Object中只有filId不为空,其他属性为空。

    如果想要两个字段的数据,不能使用.setSqlSelect("file_id").setSqlSelect("file_name"),后面的会覆盖前面的。应该这样使用.setSqlSelect("file_id","file_name")

    (3)

    //先删除科目下的数据
    this.delete(new EntityWrapper<AuthEnroll>().eq("subjectid", subjectId).in("idcard", idCards));
    
    

    多条件查询,①值subjectId 是固定的,②值idCards 是集合

    8、in条件里的list集合为空的bug

    关于in查询,有一个大bug。当in条件里的list集合是null的时候,默认返回所有数据。所以当根据idList批量查询或者删除的时候,一定要判断idList集合是否为空!!

        /**
         * <p>
         * IN 条件语句,目前适配mysql及oracle
         * </p>
         *
         * @param condition 拼接的前置条件
         * @param column    字段名称
         * @param value     匹配值 集合
         * @return this
         */
        public Wrapper<T> in(boolean condition, String column, Collection<?> value) {
            if (condition && CollectionUtils.isNotEmpty(value)) {
                sql.WHERE(formatSql(inExpression(column, value, false), value.toArray()));
            }
            return this;
        }
    

    测试:

    测试的表.png postman模拟接口测试.png
        @Autowired
        private MyNameService myNameService;
    
        @RequestMapping(value = "/myName", method = RequestMethod.POST)
        public ResponseObj<Boolean> myName(@RequestBody List<MyName> list) throws BusinessException {
    
            if (list.size() <= 0) {
                throw new BusinessException("没有找到任何记录");
            }
    
            List<Long> longList = new ArrayList<>();
            for (MyName myName : list) {
    //            longList.add(myName.getId());
            }
            List<MyName> id = myNameService.selectList(new EntityWrapper<MyName>().in("id", longList).setSqlSelect("id"));
            System.out.println(id);
    
    
    //        boolean id1 = myNameService.delete(new EntityWrapper<MyName>().in("id", longList));
    //        System.out.println(id1);
    
            return new ResponseObj<>(true, RetCode.SUCCESS);
        }
    
    }
    

    ①当longList集合为空的时候,myNameService.selectList(new EntityWrapper<MyName>().in("id", longList)查询了所有数据,Execute SQL为SELECT id,age,`name` FROM my_name

            List<MyName> id = myNameService.selectList(new EntityWrapper<MyName>().in("id", longList).setSqlSelect("id"));
            System.out.println(id);
    

    ②当longList集合为空的时候,.in()方法返回了表里的所有数据,Execute SQL为DELETE FROM my_name,删除的时候就会将整个表数据删除,切记一定要对集合进行判空操作!!

            boolean id1 = myNameService.delete(new EntityWrapper<MyName>().in("id", longList));
            System.out.println(id1);
    

    ③当setSqlSelect为空的时候,表示查询所有列的数据。这里后面的setSqlSelect覆盖了前面的。

            List<MyName> id = myNameService.selectList(new EntityWrapper<MyName>()
                    .in("id", longList)
                    .setSqlSelect("age")
                    .setSqlSelect("")
            );
    

    .setSqlSelect("name","age") 可以查询多个列的数据,不等同于

            List<MyName> id = myNameService.selectList(new EntityWrapper<MyName>()
                    .in("id", longList)
                    .setSqlSelect("age")
                    .setSqlSelect("name")
                    //.setSqlSelect("name","age")
            );
    

    9. 不需要分页查询,但是想返回分页的数据结构

    返回给前端的数据想不分页,同时又要返回Page这种数据结构,那么就先查询列表,不分页API是selectList,然后page.setRecords(list)即可。分页API是selectPage
    Page<SubjectEnrollCertTemplate> page = new Page<>();

         Page<SubjectEnrollCertTemplate> page = new Page<>();
         List<SubjectEnrollCertTemplate> list = serviceTemplate.selectList(new EntityWrapper<>(model));
         if (list != null && list.size() > 0) {
             page.setRecords(list);
         }
         RetCode retCode = page != null ? RetCode.SUCCESS : RetCode.FAIL;
         return new ResponseObj<>(page, retCode);
    
    image.png

    不需要分页查询,但是想返回分页的数据结构

    相关文章

      网友评论

          本文标题:mybatis plus项目中用法小结

          本文链接:https://www.haomeiwen.com/subject/btqnwqtx.html