当前位置: 移动技术网 > IT编程>开发语言>Java > 工作日记(八):完整项目开发之学习sql与学习http报文

工作日记(八):完整项目开发之学习sql与学习http报文

2020年07月18日  | 移动技术网IT编程  | 我要评论

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

后记

暂无——

本文地址:https://blog.csdn.net/BHSZZY/article/details/107381242

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网