1、问题1昨天在做多个数据库表之间的依赖查询更新时遇到一个问题。
场景:
A表和B表之间有依赖,当我需要通过它们之间的关系来修改B表的某些值时,我使用了以下的代码:
UPDATE ALEFT JOIN BON A.id = B.idSET B.age = A.age
WHERE ......
导致的问题是:B中需要修改的字段有的被改变了,有的没有被改变。
1.1、解决思路
查询相关的知识后,才发现原来是自己理解有误,LEFT JOIN的意思是将左边表的所有表项都能拿出来,然后进行修改。如下图所示:
这样就会导致在修改B表时,因为只拿出了一部分,所以有的修改了,有的没有修改。正确的做法应该是:
方案1:
UPDATE B LEFT JOIN AON A.id = B.idSET B.age = A.age
方案2:
UPDATE B RIGHT JOIN A
ON A.id = B.id
SET B.age = A.age
1.2、反思
之所以写成这样,是因为在我和pair结对的过程中,我一直看他都是这么写,自己私下却没有搞清楚其中的原理。总觉得挺简单的,用的时候我去查下就好了,这是一种错误的做法,现在将JOIN有关的总结如下:
求差集:
SELECT * FROM A LEFT JOIN B ON A.name = B.nameWHERE B.id IS NULLunionSELECT * FROM A right JOIN B ON A.name = B.nameWHERE A.id IS NULL;
求所有的集合:
select * from A left join B on B.name = A.name union select * from A right join B on B.name = A.name;
2、问题2
关于Mybaits嵌套查询的问题。
现在有如下需求:有两张数据库表,表A和表B,我想通过表A中的id找到与表B中id相同的字段,但是在表B中与表A相同的id有多个,但是要求我必须要将表B中查询到的数据放在一个集合中。
2.1、思路
最开始尝试的办法,就是使用sql,将数据查询出来,然后再在java代码级别,进行数据的组装,发现处理起来实在是麻烦。最后林老师告诉我,我们在使用mybits,会方便处理这个,由于之前没有这方面的经验,所以对Mybits没有想到。下来将mybits处理这种需求的方案记录下来:1.首先会使用相关的类来调用对数据库的操作:
//根据id 来查找一个表项的所有内容
Table getbyId(Integer id)
2.添加相关的配置文件:
<resultMap id="getTableMap" type="com.example.Table">
<id property="id" column="id"></id> <result property="age" column="age" /> <collection property="choices" ofType="string" javaType="list"> <result column="choice" /> </collection></resultMap><select id="getById" resultMap="getTableMap"> SELECT *FROM ALEFT JOIN B ON A.id=B.idWHERE id =#{id};</select>
解释:
当使用getById时,会进入到select部分,执行sql语句,查询到数据库中的数据后,会将结果进入到resultMap中,将结果依据配置,放入到具体的类对象中。即resultMap中的内容,id,age,choices等都表示具体的字段名,其中property表示类中的字段名,column表示具体的数据库列名(注意一定要对应切来,否则会出错)。collection标签就表示希望将从数据库中的到的内容放入到一个集合中,在这里表示将多个choice放入到类型为string的list结合中。从而实现了上面提到的需求。
3、Action
1、通过这两天做数据库迁移方面的工作,发现了之前对数据库操作的基本知识已经不熟悉了,后续需要对数据库的基本操作进行学习和积累。
2、因为之前没做过mybits相关的开发,现在项目上使用了,所以需要对mybits做持续的学习。