mybatis plus项目中用法小结

2019-04-23  本文已影响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

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

上一篇下一篇

猜你喜欢

热点阅读