三. 一对一关联映射
一对一关联映射有两种方式,一种是嵌套结果的,一种是嵌套查询的,都是通过assocation 元素来完成的。 下面会重点介绍一下。
三.一 嵌套结果的一对一查询
嵌套结果,就是将关联的表,即user,idcard 表进行连接查询,将所有的查询结果放置在一个结果集里面,Mybatis 会将这个结果集进行分类组装成新的对象。
接口:
public User getByIdWithResult(@Param(value="id") int id);
sql 语句:
<resultMap type="user" id="userResultMapWithResult"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="sex" column="sex"/> <result property="age" column="age"/> <result property="description" column="description"/> <!--property 为属性, 注意,一定不要忘记写 javaType 来指明构造哪个实体类--> <association property="idCard" javaType="idCard"> <!--内部为 连接类 IdCard 中的属性 和关联表IdCard 中的字段--> <id property="id" column="id"/> <result property="idNum" column="idnum"/> </association> </resultMap> <select id="getByIdWithResult" parameterType="int" resultMap="userResultMapWithResult"> <!--关联的sql语句--> select * from user u,idCard i where u.id=i.id and u.id=#{id} </select>
测试方法:
@Test public void findByIdWithResultTest(){ SqlSession sqlSession=SqlSessionFactoryUtils.getSession(); UserMapper userMapper=sqlSession.getMapper(UserMapper.class); User user=userMapper.getByIdWithResult(1); System.out.println(user); }
测试运行,控制台打印:
会发现 IdCard 中的uid 没有值, 那是因为 在实体类 IdCard 中并没有 uid 这个属性。 在IdCard 中也应该添加一个private User user 即User 表的引用,来达到双向关联的目的。 既可以从员工查到IdCard, 也可以从IdCard 查找到对应的员工。 用法一样,故只用一个来举例。
三.二 嵌套查询 用select引入其他空间的查询语句
接口:
public User getByIdWithSelect(int id);
sql语句:
<resultMap type="user" id="userResultMapWithSelect"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="sex" column="sex"/> <result property="age" column="age"/> <result property="description" column="description"/> <!--用了一个column,表示要传入的是哪一个参数的值, select 指明的是哪一个命名空间的哪一条语句--> <association property="idCard" javaType="idCard" column="id" select="com.yjl.mapper.IdCardMapper.findByUserId"> </association> </resultMap> <select id="getByIdWithSelect" parameterType="int" resultMap="userResultMapWithSelect"> <!--是单语句--> select * from user u where u.id=#{id} </select>
IdCardMapper.java 中有一个接口:
public IdCard findById(int id);
IdCardMapper.xml 的文件配置为:
<?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.yjl.mapper.IdCardMapper"> <resultMap type="idCard" id="idCardResultMap"> <id property="id" column="id"/> <result property="idNum" column="idNum"/> </resultMap> <!-- 嵌套结果 --> <select id="findById" parameterType="int" resultMap="idCardResultMap"> select * from idCard where id=#{id} </select> <!-- 嵌套查询的sql, 没有对应的接口,传入的参数为int 类型 --> <select id="findByUserId" parameterType="int" resultMap="idCardResultMap"> select * from idCard where uid=#{id} </select> </mapper>
测试方法为:
@Test public void findByIdWithSelectTest(){ SqlSession sqlSession=SqlSessionFactoryUtils.getSession(); UserMapper userMapper=sqlSession.getMapper(UserMapper.class); User user=userMapper.getByIdWithSelect(1); System.out.println(user); }
可以看出,进行了两条 sql语句的查询。
谢谢!!!