需求:
查询某种图书分类下面的所有图书。
查询某种电脑分类下面的所有电脑。
查询某种手机分类下面的所有手机。
查询某种服装分类下面的所有服装。
查询某种美食分类下面的所有美食。
方案一:
一对多关联,就需要取得关联的多条记录。
在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 所以上面所说的点需要注意 。









网友评论