1.查询结果排序
- 默认asc正序, desc倒序, field(t.state, '01', '02', '03') 按照t.state的规定状态排序
2.树形结果,例如产品分类、子分类递归等容易忽略的点要注意
- 逻辑删除标志位一定要考虑
- 结合实际业务需求详细考虑
3.设计数据库一定详细考虑
- 例如时间,如果存字符串可以考虑varchar(20),如果设置不合理
-- 修改字段为varchar类型
ALTER TABLE `t_job` MODIFY `expect_solve_time` varchar(20) comment '期望解决时间';
4.用Map返回结果的时候,如果是List<Map<String, Object>>
- 如上面的返回类型,如果是list.add(map);加进去的需要考虑不要使用同一个Map对象,不然由于指针都会指向这个map,导致加入list的都是最后一个map对象。加了多少次,就有多少个最后一个相同的map对象。
5.字符长度限制
- @Length(max=200, message="不能超过200字符")
- if (StringUtils.length(param) > 200) return false;
6.条件查询(特指字典表中的类型什么的)
- 需要前端传入的是Id(最好不要字典翻译后的typeName)
7.导出Excel的时候,一定要把id,字典等翻译过来显示
8.写统计sql的时候
- 一定要避免for循环中写sql查询,因为这样性能全部消耗在连接数据库上了
- 可以查询所有再过滤,甚至在sql中用foreach循环都比sql写在for中多次连接强
mybatis foreach
- 接收集合参数的时候list集合可以写collection = "list",其他集合必须写collection = "collection"
- Map参数接收,直接写collection = "Map名字"
#单参数list类型
<select id="countByUserList" resultType="_int" parameterType="list">
select count(*) from users
<where>
id in
<foreach item="item" collection="list" separator="," open="(" close=")" index="">
#{item.id, jdbcType=NUMERIC}
</foreach>
</where>
</select>
#单参数array数组类型
<select id="dynamicForeach2Test" resultType="Blog">
select * from t_blog where id in
<foreach collection="array" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>
- 如果map中传的是个List需要判断list.size > 0
<if test="moduleIds!=null and moduleIds.size > 0">
and t.module_id in
<foreach collection="moduleIds" item="item" index="index" open="(" separator="," close=")">
#{item}
</foreach>
</if>
#自己把参数封装Map类型
<select id="dynamicForeach3Test" resultType="Blog">
select * from t_blog where title like "%"#{title}"%" and id in
<foreach collection="ids" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>
10.递归的时候返回SET(Entity)的时候实体类要重写equals和hashcode()
11.时间向下半小时取整
/**
* 时间就近取整
* 08:00 -> 08:00,
* 08:20 -> 08:30,
* 08:30 -> 08:30,
* 08:45 -> 09:00,
* 23:56 -> 00:00
*
* @param time
* @return outTime
*/
public static String getCompleteTime(String time) {
String hour = "00";//小时
String minutes = "00";//分钟
String outTime = "00:00";
StringTokenizer st = new StringTokenizer(time, ":");
List<String> inTime = new ArrayList<>();
while (st.hasMoreElements()) {
inTime.add(st.nextToken());
}
hour = inTime.get(0);
minutes = inTime.get(1);
if (Integer.parseInt(minutes) > 30) {
hour = (Integer.parseInt(hour) + 1) + "";
outTime = hour + ":00";
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
try {
outTime = sdf.format(sdf.parse(outTime));
} catch (Exception e) {
e.printStackTrace();
}
} else if (Integer.parseInt(minutes) == 00) {
outTime = hour + ":00";
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
try {
outTime = sdf.format(sdf.parse(outTime));
} catch (Exception e) {
e.printStackTrace();
}
} else if (Integer.parseInt(minutes) <= 30 && Integer.parseInt(minutes) != 00) {
outTime = hour + ":30";
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
try {
outTime = sdf.format(sdf.parse(outTime));
} catch (Exception e) {
e.printStackTrace();
}
}
return outTime;
}
12.关于mysql中查询 != 和 <> 的使用
- 注意这两个不等于的查询结果都不会包括null,只能用is null来获取
13.插入的时候使用insertSelective()能够避免数据库字段有默认值,却被插入为NULL
14.启动自动执行数据库sql文件
spring:
datasource:
initialization-mode: never #不执行初始化 #always执行初始化 #embedded只初始化内存数据库
schema: classpath:static/mall.sql
sql-script-encoding: UTF-8
15.mybatis plus的AR模式new User()可以用builder模式builder.build()替代
16.如果工程中同时存在application.properties文件和 application.yml文件,yml文件会先加载,而后加载的properties文件会覆盖yml文件
17.批量插入的sql的正确格式是,注意values后面没有额外的大括号,所以mybatis中应该这么写,open和close中不要加额外的括号
insert into pms_qc_project_cutting_table_activity (proj_id, cutting_activity_id, `program`, description, is_deleted, create_time, update_time)
values
(?, ?, ?, ?, '0', ?, now()) ,
(?, ?, ?, ?, '0', ?, now()) ,
(?, ?, ?, ?, '0', ?, now())
<insert id="addBatch" parameterType="list">
insert into pms_qc_project_cutting_table_activity (proj_id, cutting_activity_id, `program`,
description, is_deleted, create_time, update_time)
values
<foreach collection="list" index="index" item="item" open="" separator="," close="">
(#{item.projId}, #{item.cuttingActivityId}, #{item.program}, #{item.description}, '0', #{item.createTime}, now())
</foreach>
</insert>
18.使用PageHelper插件进行分页的时候,PageHelper.startPage()必须在查询语句上面紧挨着!!!否则不会分页返回所有
PageHelper.startPage(pageInfo.getPage(), pageInfo.getLimit());
final List<T> list= mapper.query(paramMap);
com.github.pagehelper.PageInfo<T> voPageInfo = new com.github.pagehelper.PageInfo<>(list);
PageVo<T> pageVo = new PageVo<>();
pageVo.setTotal((int)voPageInfo.getTotal());
pageVo.setList(voPageInfo.getList());
return pageVo;