昨天在改需求的时候,改了一天,发现关于数据库映射那里出现了问题。
因为我对于后端的mapper层了解的并不深,所以导致我改了一天还没发现问题所在。当我好不容易发现了问题出在mapper层,结果我发现我不会改哈哈哈,还是借助了GPT来帮忙。
对于后端来讲,如果读懂了controller层的代码,service层的代码,mapper层的代码,数据库表也烂熟于心(知道每张数据库表是干什么的),基本上就对整个后端大致有一个初步的了解了。
今天,我们就来研究一下,这个mapper层的xml的代码。我就以我修改的那个需求的那片代码为例子:
先来看一个相对简单的:
<select id="getRoleUserInfo" resultType="com.csgholding.idmp.ums.dto.StakeHolderDTO">
select u.id user_id ,u.user_name from t_role_info t
LEFT JOIN t_user_role r ON t.id = r.role_id
LEFT JOIN t_user_info u ON u.id = r.user_id
<where>
t.delete_flag = 0 AND u.delete_flag = 0 AND r.delete_flag = 0
AND t.id IN
<foreach collection='roleIdList' item='id' open='(' separator=',' close=')'>
#{id}
</foreach>
</where>
</select>
<select><select/>标签包裹着的就是SQL语句。
这行SQL语句大致的意思是:选择 id,user_name,这两个字段是从 t_role_info,t_user_role,t_user_info表中查到的,这三张表之间可以通过‘左连接’来连接起来。查出这些数据后还要对这些数据做一些筛选过滤。
其实我也不是很懂这个SQL语句是干什么的,如果遇到这些SQL语句,你也不需要自己能看的很懂,可以通过GPT来去搞懂就好了。包括你写SQL语句也是,你其实并不需要自己会写,你要把你的想法给描述出来告诉GPT,GPT会帮你写好的,所以不用担心。
那<select><select/>标签的内容是什么呢?
可以看看这里,id="getRoleUserInfo" ,意思是这个SQL语句对应的是mapper层的getRoleUserInfo的数据接口。
而 resultType="com.csgholding.idmp.ums.dto.StakeHolderDTO" 指的是那条SQL语句查出来的字段会映射到StakeHolderDTO里面。因为你一开始写StakeHolderDTO,你的StakeHolderDTO里面有很多个字段嘛,但是这些字段都是没有值的,你写SQL语句就是从数据库中查出这些字段的值,然后放到StakeHolderDTO里面。
接下来讲一下一些相对复杂一点的SQL语句,就像这条:
<select id="getTaskRoleInfo" resultMap="roleTaskInfoDTOMap">
select t.id, r.user_id,t.role_name,u.user_name from t_role_info t
LEFT JOIN t_user_role r ON t.id = r.role_id
LEFT JOIN t_user_info u ON u.id = r.user_id
<where>
t.delete_flag = 0 AND u.delete_flag = 0 AND r.delete_flag = 0
AND t.id IN
<foreach collection='roleIdList' item='id' open='(' separator=',' close=')'>
#{id}
</foreach>
</where>
</select>
这条SQL语句的大致意思就是:找到 id, user_id, role_name, user_name 这些字段,这些字段从哪里找呢?从 t_role_info,t_user_role,t_user_info 这三张表中找,这三张表通过某些字段关联起来。
id="getTaskRoleInfo" 意思就是这条SQL语句其实是getTaskRoleInfo数据接口的SQL语句,就这个意思。
resultMap是什么?之前不是 resultType 吗?其实resultType对应的是很简单的情况,表示将查询结果将直接映射到 StakeHolderDTO
类。而这里的 resultMap
是 roleTaskInfoDTOMap
,表示查询结果将按照 roleTaskInfoDTOMap
中定义的映射规则进行映射。
说实话,这个 roleTaskInfoDTOMap
还真挺难写的,还是要花点时间才能写出来。但是好在有GPT,你只要把你写的那条SQL语句,以及RoleInfoDTO整个复制给GPT,叫他帮你写一个显式的映射,就搞定了。
感觉只要把mapper层的代码搞懂,然后把SQL语句搞懂,基本上对于mapper层就搞懂了。
至于数据库表,是要根据你的那个系统来的,你不可能一下子就把数据库表全部搞懂,都是要慢慢积累,做到某一个需求的时候弄懂与这个需求有关的数据库表,然后做多几个需求,你对于系统的数据库表就全部了解了。这还是需要时间去积累的。