题记
最近在学习mybatis,学习过程中遇到很多配置文件的学习,所以在这里做一些总结和自己的理解,如若理解有误,也请大家指出。
一对多的多表查询
现在有两张表,一张是user用户表,另外一张是account账户表,直接上ER图,可以看到account表UID和user表的id产生联系
下面我们来看java实体类如何设计,User类就不说了,没有什么好讲的。主要是Account类,从表实体类里包含主表实体的对象的引用,具体就是下图红框位置,这里需要一个user成员变量
下面就到了最重要的配置xml部分,直接上代码
<mapper namespace="com.itheima.dao.IAccountDao">
<!--定义封装account和user的resultMap-->
<resultMap id="accountUserMap" type="account">
<!--从表内容-->
<id property="id" column="aid"></id>
<result property="uid" column="uid"></result>
<result property="money" column="money"></result>
<!--配置封装user的内容,也就是从表实体所引用的主表实体-->
<association property="user" javaType="user">
<id property="id" column="id"></id><!--user表主键-->
<result property="username" column="username"></result>
<result property="address" column="address"></result>
<result property="sex" column="sex"></result>
<result property="birthday" column="birthday"></result>
</association>
</resultMap>
<!--查询所有账户以及每个账户对应的信息-->
<select id="findAll" resultMap="accountUserMap">
select u.*, a.id as aid, a.uid, a.money from account a, user u where u.id = a.uid;
</select>
</mapper>
这里的javaType属性和resultMap标签里的type属性是一个意思,都是指定实体类,不过由于主配置文件设置了别名,所以这里就不用写全限定实体类名
再对比下
红框的内容其实就是account实体类的成员变量
而蓝框的内容是user实体类的成员变量
property属性就是实体类里的成员变量;column属性就是表所对应的字段,这里有个比较有意思的,就是user表和account表都有id这个字段(由于在windows上不区分大小写),所以sql语句使用了取别名来防止字段名产生冲突,代码如下
<select id="findAll" resultMap="accountUserMap">
select u.*, a.id as aid, a.uid, a.money from account a, user u where u.id = a.uid;
</select>
多对一的多表查询
上面是查询账户以及账户所对应的用户的信息
账户和用户是多对一的关系
下面是查询用户以及用户所拥有的账户的信息
用户和账户是一对多的关系
表的关系还是参考上面的ER图,不再赘述,直接User实体类的代码,如下图:注意红框位置,这里也是,主表实体类要引用从表实体类的集合
我们再看xml的写法,注意resultMap,也就是红框位置
注意这里不再是association标签,而是collection集合标签,同时ofType属性对应着全限定类名
暂时写到这里