开发总结相关

1.SQL相关


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

一张表可以考虑来连结多次

连结表后可以考虑追加筛选提条件

一个经典问题:

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 当前页没有时,切换分页

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的时候。

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

@Transactional问题:
 

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

程序启动

项目启动失败:

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

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

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

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

相关推荐

  1. 开发总结相关

    2024-01-12 22:58:06       60 阅读
  2. Qt相关开源项目总结

    2024-01-12 22:58:06       35 阅读
  3. Android NDK开发 CMAKE 相关总结

    2024-01-12 22:58:06       121 阅读
  4. RabbitMQ相关总结

    2024-01-12 22:58:06       40 阅读
  5. mysql相关知识总结

    2024-01-12 22:58:06       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-12 22:58:06       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-12 22:58:06       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-12 22:58:06       82 阅读
  4. Python语言-面向对象

    2024-01-12 22:58:06       91 阅读

热门阅读

  1. 网络常用命令

    2024-01-12 22:58:06       44 阅读
  2. QML使用QCustomPlot笔记

    2024-01-12 22:58:06       52 阅读
  3. Android 13.0 Settings搜索功能屏蔽某个app

    2024-01-12 22:58:06       53 阅读
  4. c yuv422转yuv420p

    2024-01-12 22:58:06       54 阅读
  5. 力扣2085.统计出现过一次的公共字符串

    2024-01-12 22:58:06       56 阅读
  6. Redis面试题10

    2024-01-12 22:58:06       50 阅读