mybatis的高级结果映射可以很轻松的帮助我们处理一对一, 一对多的数据关系。
1 数据准备 1.1 数据库创建以下的名为 mybatis 的数据库, 并在其下创建4个表。
在此就不贴出来建表的 SQL 语句了 , 感兴趣的可以去我的 Github:mybatis-mapping 中获取。
1.2 实体类, 接口和XML使用 mybatis-代码生成器 生成相应的实体类, 接口和XML。
以上为生成的项目结构。
2 一对一映射创建的表中, author 和 blog 就是一对一的关系。
我们希望找到一个blog, 然后就会把它的作者信息也关联出来。
2.1 resultType 方式一注意:resultType方式要求获取到的列和成员变量名一致。
2.1.1 创建对象创建一个类BlogCustom, 该类继承于 Blog 类, 在该类上添加 Author 对象作为成员变量
2.1.2 创建接口方法和XML 语句 BlogBO selectBoById(int id); /** * 根据博客的 id 获取博客及作者的信息 * @param id * @return */ BlogCustom selectCutomById(int id);对应的 XML 语句:
<select parameterType="java.lang.Integer" resultType="com.homejim.mybatis.entity.BlogCustom"> SELECT b.id, b.title, b.author_id AS authorId, a.id AS "author.id", a.username AS "author.username", a.password AS "author.password" , a.email AS "author.email" FROM blog b LEFT JOIN author a ON b.author_id=a.id where b.id = #{id,jdbcType=INTEGER} </select>通过 author.username 这种方式可以设定 author 对象中的 username 属性。
2.1.3 测试 @Test public void testSelectCustomById() { SqlSession sqlSession = sqlSessionFactory.openSession(); BlogMapper blogMapper = sqlSession.getMapper(BlogMapper.class); BlogCustom blogCustom = blogMapper.selectCutomById(1); System.out.println(ToStringBuilder.reflectionToString(blogCustom, ToStringStyle.MULTI_LINE_STYLE)); }运行后的结果
有时候, 我们获取的另外的属性不多, 则我们也可以选择下面的方式二。
2.2 resultType 方式二 2.2.1 创建对象创建一个类BlogBO, 该类继承于 Blog 类, 在该类上添加 Author 中的成员变量作为该类自己的成员变量。
2.2.2 创建接口方法和XML 语句接口方法
/** * 根据博客的 id 获取博客及作者的信息 * @param id * @return */ BlogBO selectBoById(int id);XML 对应的 SQL , 其中 resultType 是上面定义的实体对象。
<select parameterType="java.lang.Integer" resultType="com.homejim.mybatis.entity.BlogBO"> select b.id, b.title, b.author_id as authorId, a.id as userId, a.username, a.email from blog b left join author a on b.author_id=a.id where b.id = #{id,jdbcType=INTEGER} </select> 2.2.3 测试创建一个测试例子。
@Test public void testSelectBoById() { SqlSession sqlSession = sqlSessionFactory.openSession(); BlogMapper blogMapper = sqlSession.getMapper(BlogMapper.class); BlogBO blogBO = blogMapper.selectBoById(1); System.out.println(ToStringBuilder.reflectionToString(blogBO, ToStringStyle.MULTI_LINE_STYLE)); }测试结果
2.3 resultMap 方式 2.3.1 创建对象创建一个类BlogCustom, 该类继承于 Blog 类, 在该类上添加 Author 对象作为成员变量
2.3.2 创建对应 resultMap对应创建一个 resultMap
<resultMap type="com.homejim.mybatis.entity.BlogCustom" extends="BaseResultMap"> <result column="username" jdbcType="VARCHAR" property="author.username" /> <result column="user_id" jdbcType="VARCHAR" property="author.id" /> <result column="email" jdbcType="VARCHAR" property="author.email" /> </resultMap> 2.3.3 创建接口方法和XML 语句 /** * 根据博客的 id 获取博客及作者的信息, resultMap 方式 * @param id * @return */ BlogCustom selectCutomByIdMap(int id);