mybatis-高级结果映射之一对一(多种方式, 有没提到的你找我)

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 对象作为成员变量

BlogCustom

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)); }

运行后的结果

resultType方式一结果

有时候, 我们获取的另外的属性不多, 则我们也可以选择下面的方式二。

2.2 resultType 方式二 2.2.1 创建对象

创建一个类BlogBO, 该类继承于 Blog 类, 在该类上添加 Author 中的成员变量作为该类自己的成员变量。

BlogBO

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)); }

测试结果

resultType方式二结果

2.3 resultMap 方式 2.3.1 创建对象

创建一个类BlogCustom, 该类继承于 Blog 类, 在该类上添加 Author 对象作为成员变量

image

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);

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyzyjg.html