实际开发中,我们做项目不可能只是单表操作,往往会涉及到多张表之间的关联操作。那么我们如何用 mybatis 处理多表之间的关联操作呢?
首先我们先说一对一的方式:什么是一对一?假设一个订单只能由一个用户创建,那么由订单到用户就是一对一的关系换个说法就是一个订单只能由一个用户创建,从订单表出发去用户表中找数据,一条订单表中的数据只能对应用户表中的一条数据!
注意!这里我们没有说一个客户可以创建多个订单的事情
一对一其实在看例子的时候想了好久文件目录的结构,原因是这里面需要定义两个实体类,这里考虑了好久,为什么需要定义两个实体类?我们不可以直接select a.x, b.y from a,b where a.zz=b.zz?后来考虑到,我们需要保存查询的结果,回想我们之前的查询,都需要定义一个表的实体类,那么这里也不例外,我们需要定义另外一张表的实体类
第二张表的实体类
这里面要加一个"对于哪个类"的定义,定义一个类对象,同样也需要getter和setter方法
在对应的接口文件中加上对应的方法,需要查询哪张表就定义哪个类的方法,如查A表,就定义A实例的类,查B表,就定义B实例的类,另外我们要查询的结果中,B的实例是定义在A的类中的,所以也可以直接用A来定义接口中的方法。
定义过了两个表的实体类之后,就要定义查询的接口和接口对应的xml文件了
定义接口的时候需要注意的是定义的方法以及方法的类,这个类是什么类?是查询返回数据的实体类
然后就是mapper.xml文件了
<mapper namespace="com.dn.mapper.SysrunparamMapper">
<select id="selectSysrunparamInfoByCode" resultType="com.dn.po.SysrunparamPo"
parameterType="String">
select * from sysrunparam where paramcode = #{paramcode}
</select>
<!-- 一对一 -->
<select id="selectAAndSByAID" parameterType="String" resultMap="getAAndB">
select a.paramcode,a.paramname,a.paramvalue,s.paramcode sparamcode,s.paramname sparamname,s.paramvalue sparamvalue from
apprunparam a, sysrunparam s where a.paramcode = s.paramcode and
a.paramcode = #{paramcode}
</select>
<resultMap type="com.dn.po.ApprunparamPo" id="getAAndB">
<id column="paramcode" property="paramcodeA" />
<result column="paramname" property="paramnameA" />
<result column="paramvalue" property="paramvalueA" />
<!--association:用于映射关联查询单个对象的信息 property:实体类对应的属性名 javaType:实体类对应的全类名 -->
<association property="sysrunparamPo" column="paramcode" javaType="com.dn.po.SysrunparamPo">
<!-- id:指定查询列表唯一标识,如果有多个唯一标识,则配置多个id column:数据库对应的列 property:实体类对应的属性名 -->
<id column="sparamcode" property="paramcode" />
<result column="sparamvalue" property="paramvalue" />
<result column="sparamname" property="paramname" />
</association>
</resultMap>
</mapper>
正常参考这种写法就好了,这里就是先定义查询
sqlselect a.paramcode,a.paramname,a.paramvalue,s.paramcode sparamcode,s.paramname sparamname,s.paramvalue sparamvalue from
apprunparam a, sysrunparam s where a.paramcode = s.paramcode and
a.paramcode = #{paramcode}
同样需要注意第一个表以及第二个表的类型,另外就是result标签中的property要和实例中定义的参数名对应
这里如果格式忘记,查一下就好了。
这里有一个比较不常见的问题,如果两个表中还有相同的列怎么办?如果不进行修改,很容易值会被覆盖,所以上方的sql语句中对查询的列进行了重新的定义,这样 就不会有问题了
至于一对多、多对多,也是mybatis的一个特点,但是由于一般开发过程中不会用到这两个,为什么不会用到?1.业务逻辑层控制。2.代码控制,连表查询多表查询效率低而且容易出错。