欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

完整项目开发之学习sql与学习http报文

程序员文章站 2022-07-01 08:46:57
2020.7.16今天是周四,本人自己负责的模块已经基本开发完了(从controller到service到mapper.java到mapper.xml),自我感觉没啥问题,就等联调测试了。本人所在小组的其它同事还在继续开发,可能是本人负责的模块太简单了。然后就准备学习代码,写写博客。由于之前sql方面写的比较少,因此准备先看看同事写的sql学习一下。以下是本人(自)认为值得学习的一个sql:学习SQL1.xxxmapper.java中这么写(mapper接口,在service层注...

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