开发总结相关

发布时间:2024年01月11日

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 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语句中的列也必须以相同的顺序排列[即类型的顺序需要保持一致

  • ?

4.动态增减可以考虑?

// 统计增加和减少了多少
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);
}

5.考虑使用事务
?

事务的场景很简单呀,就是当你需要保证且通过数据事务可以保证多个操作的ACID的时候。

简单点说就是多个写操作要么一起成功,要么一起失败的时候就需要用事务。

6.使用流的方式优化集合添加对象方式

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);

7.Find IN Set

FIND_IN_SET函数 是一个比like关键字更加高级的精确查询匹配

用法:find_in_set('欲查找的值', '被查找值的集合,用英文逗号隔开')

and t.address in (SELECT id from sys_area where FIND_IN_SET(#{address},ancestors) || id=#{address} )

8.全局变量

使用全局变量要考虑清除值的问题

9.Set和List

Set集合10万条数据同List相比,相差20ms

10mysql相关

SELECT A*

FROM A

LEFT JOIN B

ON A = B

INNER JOIN C

ON B = C?

C表中没有数据时,会导致查询查询出来的全部为空

数据库全局搜索时,ctrl + f 当前页没有时,切换分页

一张表可以考虑连接多次,sql逐级排查

子查询中查询失败(列不存在),程序也有可能正常执行
排查sql时,要查验所有的sql条件

程序启动

项目启动失败:

日志提示的原因可能,有可能不是根本原因

需检查是否是以maven的格式进行打开的

Mybatis相关原因导致程序启动失败

1.mapper文件出现了根本的语法错误,<include>没有引用sql标签,引用了其它的<insert>
2.标签体不完整
3.文档逗号等与xml无关的符号
4.mappr注入失败:检查注入mapper的位置,是否在mapper文件夹下
5.全局的类型别名优于@Alias便签,在IDEAresultType中点击简写的实体对象可以跳转

文章来源:https://blog.csdn.net/qq_56876713/article/details/134545239
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。