mybatis plus项目中用法小结
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.png3、mybatis-plus自定义分页
不使用service.selectPage()方法
mybatis-plus分页查询
4、resultType映射返回对象问题
当需要返回对象时,使用resultMap能成功,但是resultType不成功
FileModel类
5、批量查找问题
@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