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)
(SELECT c.id 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语句必须具有相同的列数
// 统计增加和减少了多少
public Map<String, String> compare(String a, String b) {
String[] listA = a.split(",");
String[] listB = b.split(",");
Set<String> setA = new HashSet<>(Arrays.asList(listA));
Set<String> setB = new HashSet<>(Arrays.asList(listB));
Set<String> addedData = new HashSet<>(setB);
addedData.removeAll(setA);
Set<String> removedData = new HashSet<>(setA);
removedData.removeAll(setB);
String addedResult = String.join(",", addedData);
String removedResult = String.join(",", removedData);
Map<String, String> 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<String> set1 = new HashSet<>(Arrays.asList(arr1));
Set<String> set2 = new HashSet<>(Arrays.asList(arr2));
// 判断两个Set集合是否相等
return set1.equals(set2);
}
事务的场景很简单呀,就是当你需要保证且通过数据事务可以保证多个操作的ACID的时候。
简单点说就是多个写操作要么一起成功,要么一起失败的时候就需要用事务。
Set<CourseUserVO> 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<String> parkIdList = authorizeParkList.stream()
.map(AuthorizeParkVO::getSmart_park_id)
.collect(Collectors.toList());
批量向集合中添加多个对象
List<AlertVO> 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
SELECT A*
FROM A
LEFT JOIN B
ON A = B
INNER JOIN C
ON B = C?
C表中没有数据时,会导致查询查询出来的全部为空
数据库全局搜索时,ctrl + f 当前页没有时,切换分页
一张表可以考虑连接多次,sql逐级排查
子查询中查询失败(列不存在),程序也有可能正常执行
排查sql时,要查验所有的sql条件
项目启动失败:
日志提示的原因可能,有可能不是根本原因
需检查是否是以maven的格式进行打开的
1.mapper文件出现了根本的语法错误,<include>没有引用sql标签,引用了其它的<insert>
2.标签体不完整
3.文档逗号等与xml无关的符号
4.mappr注入失败:检查注入mapper的位置,是否在mapper文件夹下
5.全局的类型别名优于@Alias便签,在IDEAresultType中点击简写的实体对象可以跳转