工作日记(八):完整项目开发之学习sql与学习http报文
2020.7.16
今天是周四,本人自己负责的模块已经基本开发完了(从controller到service到mapper.java到mapper.xml),自我感觉没啥问题,就等联调测试了。
本人所在小组的其它同事还在继续开发,可能是本人负责的模块太简单了。
然后就准备学习代码,写写博客。
由于之前sql方面写的比较少,因此准备先看看同事写的sql学习一下。
以下是本人(自)认为值得学习的一个sql:
学习SQL
1.xxxmapper.java中这么写(mapper接口,在service层注入就能用那个):
List<Map> getList(Map paramMap);
2.xxxmapper.xml中这么写:
<select id="getList" parameterType="java.util.Map" resultType="java.util.Map">
SELECT c.*, GROUP_CONCAT(DISTINCT d.type SEPARATOR ',') mergeType
FROM table_info d,
(SELECT
a.id uId,
a.name uName,
DATE_FORMAT(a.start_time, '%Y-%m-%d') startTime,
DATE_FORMAT(a.end_time, '%Y-%m-%d') endTime
FROM table_main a left join table_info b on a.id = b.id
<where>
<if test="id != null and id !=''>
<![CDATA[ AND LOCATE(#{id,jdbcType=VARCHAR}, a.id)]]>
</if>
<if test="name != null and name !=''>
<![CDATA[ AND LOCATE(#{name,jdbcType=VARCHAR}, a.name)]]>
</if>
</where>
GROUP BY a.id) c
WHERE c.id=d.id
GROUP BY c.id
</select>
顺便说一下这个sql的执行结果:
uId | uName | startTime | endTime | mergeType |
1 | A | 2020-01-01 | 2020-02-01 | 1,3,5 |
2 | C | 2020-01-01 | 2020-03-01 | 1,4 |
3 | B | 2020-01-01 | 2020-01-25 | 3 |
... | ... | ... | ... | ... |
(1)id的值与mapper.java中的方法名对应
(2)parameterType指入参(mapper.java的方法中的paramMap),resultType指返回的类型;虽然都指定是map类型,不过返回的参数是List<Map>形式(mapper.java的方法中规定了返回类型,先将每条数据装入map,然后将全部数据装入list)。
(3) 这句【GROUP_CONCAT(DISTINCT d.type SEPARATOR ',') mergeType】的意思是,对表d的type去重并合并结果,以逗号分隔结果,然后起别名叫mergeType;这句要与句末的【GROUP BY c.id】一起用,就可以按uId分组、分组合并显示出mergeType(如1,3,5)。
(4)这句【 DATE_FORMAT(a.start_time, '%Y-%m-%d') startTime】的意思是格式化查询后的结果,起别名叫startTime(从datetime类型转为格式化后的类型)。
(5)这句【FROM table_main a left join table_info b on a.id = b.id】的意思是从左连接的两张表中获取信息 。
(6)这句【 <if test="id != null and id !=''>】的意思是从传入参数map中找键为id的值,如果不为空,则拼接后续的sql。
(7)这句【AND LOCATE(#{id,jdbcType=VARCHAR}, a.id】的意思是,传入的id与数据库的id比较,按照模糊查询的规则,匹配成功则返回该条数据;其中AND如果在sql拼接的第一个,sql实际拼接时会自动去掉第一个AND。(例如id为A001,只要查询A即可找到该条数据。)
(8)【GROUP BY】是需要注意的,它在分组后只取每组第一个结果。已测试,假如数据库有5条数据,name分别为AABBC,使用GROUP BY name 则只会返回3条数据,ABC(每组选第一条)。
(9)整个sql的意思是,先从主表中查找4个字段(并且从表中也要有对应数据,以id左连接匹配),然后再追加一个从表中查到的type字段,该字段按照id分组进行合并,用逗号隔开;最后将这5个字段展示出来。(数据库表是一对多的状态,主表中一个id对应从表中的多行数据;也就是说从表中存了主表中的id字段,有多行的id相同)
学习http
本次项目中基本都是用json传递数据的,当然涉及到了http。因此准备将常用的http相关知识单独整理成一个博客:
HTTP常用请求头与请求体实例:
https://blog.csdn.net/BHSZZY/article/details/107382323
后记
暂无——