开发总结相关

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

5.考虑使用事务
 

事务的应用场景:当你需要保证且通过数据事务可以保证多个操作的ACID的时候。

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

@Transactional问题:
 

6.使用流的方式优化集合的操作方式

遍历原有集合,将其添加进新的集合

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

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

你可能感兴趣的:(android,adb)