一对多关系

2018-07-30  本文已影响6人  神豪VS勇士赢

需求:
查询某种图书分类下面的所有图书。
查询某种电脑分类下面的所有电脑。
查询某种手机分类下面的所有手机。
查询某种服装分类下面的所有服装。
查询某种美食分类下面的所有美食。

方案一:
一对多关联,就需要取得关联的多条记录。

在BookType 实体类里面加入

private ArrayList<BookInfo> bookInfos;

映射文件如下所示:

<select id="selectByOneToMany" parameterType="java.lang.Long" resultMap="resultMapSelectByOneToMany">
SELECT
t_book_type.,t_book_info.
FROM t_book_type ,t_book_info
WHERE t_book_type.type_id=t_book_info.type_id
AND t_book_type.type_id=#{typeId}
</select>

需要注意的地方是 : resultMap="resultMapSelectByOneToMany"

resultMapSelectByOneToMany 如下所示:

<resultMap id="resultMapSelectByOneToMany" type="com.zyh.pojo.BookType">
<id column="type_id" jdbcType="BIGINT" property="typeId" />
<result column="type_name" jdbcType="VARCHAR" property="typeName" />
<result column="type_desc" jdbcType="VARCHAR" property="typeDesc" />
<collection property="bookInfos" ofType="com.zyh.pojo.BookInfo">
<id column="book_id" jdbcType="BIGINT" property="bookId" />
<result column="book_name" jdbcType="VARCHAR" property="bookName" />
<result column="book_author" jdbcType="VARCHAR" property="bookAuthor" />
<result column="book_price" jdbcType="DOUBLE" property="bookPrice" />
<result column="book_date" jdbcType="TIMESTAMP" property="bookDate" />
<result column="book_publish" jdbcType="VARCHAR" property="bookPublish" />
<result column="book_desc" jdbcType="VARCHAR" property="bookDesc" />
<result column="type_id" jdbcType="BIGINT" property="typeId" />
</collection>
</resultMap>

上面的配置文件需要注意的地方是:


image.png

对应的都是实体的属性。

这里需要注意的地方是 因为我们在 BookType 中引用了 BookInfo 而同时我们的 BookInfo 又依赖 BookType 这个时候我们可以进行修改 BookInfo 删除对于 BookType 的引用或者 留下 对于 BookType 属性的引用。

测试方法如下所示:
@Test
public void testSelectByOneToMany(){
SqlSession sqlSession = SqlSessionFactoryUtilSingleL.getSqlSession();
BookTypeMapper mapper = sqlSession.getMapper(BookTypeMapper.class);
BookType bookType = mapper.selectByOneToMany(1l);
ArrayList<BookInfo> bookInfos = bookType.getBookInfos();
for (BookInfo bookInfo : bookInfos) {
System.out.println(bookInfo);
}
}

我们对于 上面需要的注意点分别进行结果输出:

假如我们并没有在 BookInfo 中删除对于 BookType 的引用 , 输出结果如下:
可以发现如果没有删除引用,输出字段为null ,所以并不会因为没有删除字段造成异常 。这一点需要注意。


image.png

当我们删除 BookInfo 对于 BookType引用字段 ,这个时候输出结果如下所示:

image.png

方案二:

在方案一种,我们使用了连接表,这个时候 我们返回来观察 t_book_info 表 会发现 存在 一个类别的字段,所以我们没必要麻烦连接表 ,这个时候我们可以通过单表查询完成。

不使用关联映射:查询单表:根据分类找图书
在图书信息表中使用单表查询:
第一步:在Mapper映射文件中加入自定义查询

<select id="selectOneToMany" parameterType="java.lang.Long" resultMap="BaseResultMap">
SELECT
<include refid="Base_Column_List"/>
FROM t_book_info
WHERE type_id = #{typeId}
</select>

映射文件对应的
List<BookInfo> selectOneToMany(Long aLong);

测试方法如下所示:
@Test
public void testSelectOneToMany(){
SqlSession sqlSession = SqlSessionFactoryUtilSingleL.getSqlSession();
BookInfoMapper mapper = sqlSession.getMapper(BookInfoMapper.class);
List<BookInfo> bookInfos = mapper.selectOneToMany(1l);
for (BookInfo bookInfo : bookInfos) {
System.out.println(bookInfo);
}
}

这里需要我们注意的是 当我们在映射文件里面设置不同的 输出类型 测试方法输出完全不相同
注意 这里使用的是 resultMap="BaseResultMap"
输出结果如下所示:

image.png

当我们使用 resultType="com.zyh.pojo.BookInfo"
这时候观察测试方法输出结果为 null 所以上面所说的点需要注意 。

上一篇 下一篇

猜你喜欢

热点阅读