MyBatis中的assocation与collection的使用区别及使用方法
assocation 主要是在多对一,一对一的情况使用
比如说 有两个表 用户表 与账户表
一个用户可以有多个账户 ,而一个账户只能有一个用户
当查询账户信息时,也要查询到用户信息 此时就是多对一,一对一的情况
话不多说,上代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.dao.IAccountDao">
<resultMap id="accountUserMap" type="account">
<id column="aid" property="id"></id>
<result column="uid" property="uid"></result>
<result column="money" property="money"></result>
<association property="user" column="uid" javaType="User">
<id column="id" property="id"></id>
<result column="username" property="username"></result>
<result column="address" property="address"></result>
<result column="sex" property="sex"></result>
<result column="birthday" property="birthday"></result>
</association>
</resultMap>
<select id="findAll" resultMap="accountUserMap">
select u.*,a.uid,a.id as aid,a.money from account a,user u where u.id = a.uid
</select>
<select id="findAllAccount" resultType="AccountUser">
select a.*,u.username,u.address from account a,user u where u.id = a.uid
</select>
</mapper>
注意:这种方式javaType必须指定,表示user的类型是User
collection 主要是一对多的时候使用,有两种使用方式
1.只需要执行一次sql查询, 主表分页查询不正确(注意分页不建议用此方式)
注意 这里要写 ofType, javaType还是可以不写
2.代码复用性高, 主表分页查询正确
实体类和collection 的第一种方式一样
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.dao.IUserDao">
<resultMap id="accountUserMap" type="user">
<id property="id" column="id"></id>
<result column="username" property="username"></result>
<result column="address" property="address"></result>
<result column="sex" property="sex"></result>
<result column="birthday" property="birthday"></result>
<collection property="accounts" javaType="java.util.ArrayList" ofType="Account"
select="com.itheima.dao.IAccountDao.findAccountByUid" column="id">
<!-- id是定义的变量名,
也可以传多个参数 column="{uId=id,username=username} uId, username 是定义的变量 ,id,username 是user表的字段
先查出主表的结果, 然后主表记录数是几 就执行几次 collection 的select,
javaType和ofType 写不写都行,
select的值: 对应xml的namespace + 对应xml中的代码片段的id,
column作为select语句的参数传入,如果只传一个参数id可以简写: column="id" -->
</collection>
</resultMap>
<select id="findAllUserAccount" resultMap="accountUserMap">
select * from user
</select>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.dao.IAccountDao">
<select id="findAccountByUid" resultType="Account">
SELECT
*
FROM
ACCOUNT A
WHERE A.UID = #{id}
<!-- 变量名 id 对应上文的 id -->
<!-- 如果上文中 collection只传一个参数column="id",只要类型匹配,在这里随便写个变量名就可以取到值 #{xyz} -->
</select>
</mapper>
注意:本人在mybatis的配置文件中 使用了别名,所以ofType 后直接跟的类名,如果没有配置 记得写全限定类名 全限定类名就是 包名+类名
如果对您有所帮助 注意点赞奥