Mybatis Collection联合查询

因为在做图书管理系统的时候,有一个页面,显示一条图书数据,显示多条评论数据

做到这里就很纠结了,使用了Controller跳转到Controller查询两次这个办法,但是对象经过Model的传递,跳转到第二个Controller的时候,对象的值就只剩下了id,其他的值为空。没找到解决办法。

于是想到了联合查询,刚开始用association尝试的,但是发现association只能存普通数据类型。

后来找到了解决办法:使用Collection将查询结果封装成集合

Book类vo代码

    private Integer id;
    private String bookName;
    private String author;
    private Date publicationDate;
    ...
    private List<Comment> comment;	//封装了一个List集合,用来存多条Comment的数据
    ...//省略get set方法  

Comment类vo代码

	private Integer id;
	private String commentUser;
	private Integer commentBookId;
	private Date commentTime;
	private String content;
	private Integer mylike;
	private String time;
    ...//省略get set方法  

Controller代码

	@RequestMapping("getBookDetail")
	public String getBookDetail(Model model,@RequestParam(value="id",required=true)int id){
		Book book = bs.getBookById(id);
		model.addAttribute("book",book);
		return "bookDetail.jsp";
	}

ServiceImpl代码

	@Override
	public Book getBookById(int id) {
		// TODO Auto-generated method stub
		Book book = bm.getBookAndComment(id);
        //时间格式转化  此处可以省略
		book.setTime(dateToString(book.getPublicationDate()));
         //时间格式转化  此处可以省略
		for(Comment c : book.getComment()){
			c.setTime(dateToString(c.getCommentTime()));
		}
		return book;
	}

mapper.xml代码

<!-- Book getBookAndComment(Book book); -->
	<select id="getBookAndComment" resultMap="BookAndComment">
		select b.id bid, book_name, author, publication_date, publishing_house,
		cover,book_type, status,inventory, price,c.id cid, comment_user,
		comment_book_id, comment_time, content, mylike
		from book b
		join comment c
		on b.id=c.comment_book_id
		where c.comment_book_id=#{id}
	</select>

	<resultMap id="BookAndComment" type="com.book.vo.Book">
		<id column="bid" property="id" jdbcType="INTEGER" />
		<result column="book_name" property="bookName" jdbcType="VARCHAR" />
		<result column="author" property="author" jdbcType="VARCHAR" />
		<result column="publication_date" property="publicationDate"
			jdbcType="TIMESTAMP" />
		<result column="publishing_house" property="publishingHouse"
			jdbcType="VARCHAR" />
		<result column="cover" property="cover" jdbcType="VARCHAR" />
		<result column="book_type" property="bookType" jdbcType="VARCHAR" />
		<result column="status" property="status" jdbcType="INTEGER" />
		<result column="inventory" property="inventory" jdbcType="INTEGER" />
		<result column="price" property="price" jdbcType="DOUBLE" />
		<collection property="comment" ofType="com.book.vo.Comment">
			<id column="cid" property="id" />
			<result column="comment_user" property="commentUser" />
			<result column="comment_book_id" property="commentBookId" />
			<result column="comment_time" property="commentTime" />
			<result column="content" property="content" />
			<result column="mylike" property="mylike" />
		</collection>

collection里的 property代表的是vo类里集合的名字,ofType代表的是集合里封装的是什么类型。

此处还有一个问题,集合中查询到的结果只有一条,而数据库里存了三条。
后经查询发现,是因为两个表中的主键都为id,在写查询语句的时候,给两个id都起个别名就好了。
挂个参考链接,感谢作者。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值