1.mysql中单双引号都表示子符串,as 起别名时,使用反引号(尤其是中文),也可以不添加反引号,当错误使用单双引号时会出现sql语句正常执行,结果不符合预期。
2.sql语句尽量不要写在for循环,考虑使用批量增删的方式
3.聚合查询 + order by rand()
(SELECT c.id FROM c_course_menu cm
JOIN c_course c ON cm.id = c.menu_id
AND cm.course_type = '2'
AND c.id IN
(SELECT relation_id
FROM c_post_course pc
WHERE post_id = #{postId}
)
ORDER BY rand()
LIMIT 2
)
UNION
(SELECT c.id,c.price
FROM c_course_menu cm
JOIN c_course c
ON cm.id = c.menu_id
AND cm.course_type = '3'
AND c.id IN (
SELECT relation_id
FROM c_post_course pc
WHERE post_id = #{postId}
)
ORDER BY rand() LIMIT 2
)
UNION的作用
UNION运算符用于组合两个或更多SELECT语句的结果集。
UNION使用前提
UNION中的每个SELECT语句必须具有相同的列数
一张表可以考虑来连结多次
连结表后可以考虑追加筛选提条件
一个经典问题:
SELECT A*
FROM A
LEFT JOIN B
ON A = B
INNER JOIN C
ON B = C
B表中没有数据时,会导致查询查询出来的全部为空
表联结时,会先连结AB的结果,再追加C的结果,其中C的结果是根据B来的
sql排查:
一张表可以考虑连接多次,sql逐级排查
子查询中查询失败(列不存在),程序也有可能正常执行
排查sql时,要查验所有的sql条件
数据库全局搜索时,ctrl + f 当前页没有时,切换分页
// 统计增加和减少了多少
public Map compare(String a, String b) {
String[] listA = a.split(",");
String[] listB = b.split(",");
Set setA = new HashSet<>(Arrays.asList(listA));
Set setB = new HashSet<>(Arrays.asList(listB));
Set addedData = new HashSet<>(setB);
addedData.removeAll(setA);
Set removedData = new HashSet<>(setA);
removedData.removeAll(setB);
String addedResult = String.join(",", addedData);
String removedResult = String.join(",", removedData);
Map result = new HashMap<>();
result.put("add", addedResult);
result.put("reduce", removedResult);
return result;
}
public boolean isDataEqual(String str1, String str2) {
// 将字符串按照逗号分隔成字符串数组,并去除空格
String[] arr1 = str1.split("\\s*,\\s*");
String[] arr2 = str2.split("\\s*,\\s*");
// 将字符串数组转换为Set集合
Set set1 = new HashSet<>(Arrays.asList(arr1));
Set set2 = new HashSet<>(Arrays.asList(arr2));
// 判断两个Set集合是否相等
return set1.equals(set2);
}
事务的应用场景:当你需要保证且通过数据事务可以保证多个操作的ACID的时候。
简单点说就是多个写操作要么一起成功,要么一起失败的时候就需要用事务。
@Transactional问题:
遍历原有集合,将其添加进新的集合
Set courseUserVOList = new HashSet<>();
String orderId = GlobalRecIdUtil.nextRecId();
courseUserVOList = courseIdList.stream()
.map(o -> {
CourseUserVO courseUserVO = new CourseUserVO();
courseUserVO.setId(GlobalRecIdUtil.nextRecId());
courseUserVO.setCreate_by(userId);
courseUserVO.setUser_id(userId);
courseUserVO.setCourse_id(o);
courseUserVO.setOrder_id(orderId);
return courseUserVO;
})
.collect(Collectors.toSet());
List parkIdList = authorizeParkList.stream()
.map(AuthorizeParkVO::getSmart_park_id)
.collect(Collectors.toList());
批量向集合中添加多个对象
List alertVOList = new ArrayList<>();
AlertVO todayAlertNumAndGrowth = alertMapper.getTodayAlertNumAndGrowth();
AlertVO currentMonthAlertNumAndGrowth = alertMapper.getCurrentMonthAlertNumAndGrowth();
AlertVO currentYearAlertNumAndGrowth = alertMapper.getCurrentYearAlertNumAndGrowth();
Stream.of(todayAlertNumAndGrowth, currentMonthAlertNumAndGrowth, currentYearAlertNumAndGrowth)
.forEach(alertVOList::add);
FIND_IN_SET函数 是一个比like关键字更加高级的精确查询匹配
用法:find_in_set('欲查找的值', '被查找值的集合,用英文逗号隔开')
and t.address in (SELECT id from sys_area where FIND_IN_SET(#{address},ancestors) || id=#{address} )
使用全局变量要考虑清除的问题
Set集合10万条数据同List相比,相差20ms
项目启动失败:
日志提示的原因可能,有可能不是根本原因
需检查是否是以maven的格式进行打开的
1.mapper文件出现了根本的语法错误,
2.标签体不完整
3.文档逗号等与xml无关的符号
4.mappr注入失败:检查注入mapper的位置,是否在mapper文件夹下
5.全局的类型别名优于@Alias便签,在IDEAresultType中点击简写的实体对象可以跳转