package com.icss.po;
import java.util.List;
public class Blog {
private Integer blogid;
private String blogtitle;
private Integer bloguserid;
private String blogcontent;
private User user;
private List list;
public Integer getBlogid() {
return blogid;
}
public void setBlogid(Integer blogid) {
this.blogid = blogid;
}
public String getBlogtitle() {
return blogtitle;
}
public void setBlogtitle(String blogtitle) {
this.blogtitle = blogtitle == null ? null : blogtitle.trim();
}
public Integer getBloguserid() {
return bloguserid;
}
public void setBloguserid(Integer bloguserid) {
this.bloguserid = bloguserid;
}
public String getBlogcontent() {
return blogcontent;
}
public void setBlogcontent(String blogcontent) {
this.blogcontent = blogcontent == null ? null : blogcontent.trim();
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
}
package com.icss.po;
public class Post {
private Integer postid;
private Integer postuserid;
private Integer postblogid;
private String postcontent;
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public Integer getPostid() {
return postid;
}
public void setPostid(Integer postid) {
this.postid = postid;
}
public Integer getPostuserid() {
return postuserid;
}
public void setPostuserid(Integer postuserid) {
this.postuserid = postuserid;
}
public Integer getPostblogid() {
return postblogid;
}
public void setPostblogid(Integer postblogid) {
this.postblogid = postblogid;
}
public String getPostcontent() {
return postcontent;
}
public void setPostcontent(String postcontent) {
this.postcontent = postcontent == null ? null : postcontent.trim();
}
}
package com.icss.po;
public class User {
private Integer userid;
private String username;
public Integer getUserid() {
return userid;
}
public void setUserid(Integer userid) {
this.userid = userid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username == null ? null : username.trim();
}
@Override
public String toString() {
return "User [userid=" + userid + ", username=" + username + "]";
}
}
<mapper namespace="com.icss.dao.BlogMapper" >
<select id="findBlogAndUserAndPost" resultMap="detailedBlogResultMap">
SELECT
tbl_blog.blogId blogId,
tbl_blog.blogContent blogContent,
tbl_blog.blogTitle blogTitle,
tbl_blog.blogUserId blogUserId,
tbl_post.postBlogId postBlogId,
tbl_post.postContent postContent,
tbl_post.postId postId,
tbl_post.postUserId postUserId,
tbl_user.userId userId,
tbl_user.userName userName,
tu.userId userId1,
tu.userName userName1
FROM
tbl_blog
INNER JOIN tbl_user ON tbl_blog.blogUserId = tbl_user.userId
INNER JOIN tbl_post ON tbl_post.postBlogId = tbl_blog.blogId
INNER JOIN tbl_user tu ON tu.userId=tbl_post.postUserId
select>
<resultMap type="com.icss.po.Blog" id="detailedBlogResultMap">
<id property="blogid" column="blogId" />
<result property="blogtitle" column="blogTitle" />
<result property="blogcontent" column="blogContent" />
<association property="user" column="blogUserId" javaType="com.icss.po.User">
<id property="userid" column="userId"/>
<result property="username" column="userName" />
association>
<collection property="list" ofType="com.icss.po.Post">
<id property="postid" column="postId" />
<result property="postcontent" column="postContent" />
<association property="user" column="postUserId" javaType="com.icss.po.User">
<id property="userid" column="userId1"/>
<result property="username" column="userName1" />
association>
collection>
resultMap>
mapper>
@Test
public void testCollection() {
SqlSession sqlSession =null;
try {
//mybatis配置文件
String resourse = "SqlMapConfig.xml";
//获取配置文件流
InputStream is = Resources.getResourceAsStream(resourse);
//创建会话工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//通过会话工厂获取SqlSession
sqlSession = sqlSessionFactory.openSession();
//获取代理对象
BlogMapper blogMapper = sqlSession.getMapper(BlogMapper.class);
List list = blogMapper.findBlogAndUserAndPost();
for(int i=0;iget(i);
System.out.println("博客标题:"+blog.getBlogtitle());
System.out.println("博客内容:"+blog.getBlogcontent());
User user = blog.getUser();
System.out.println("博客作者:"+user.getUsername());
List l = blog.getList();
for(int j=0;jget(j);
User u = post.getUser();
System.out.println("评论人"+(j+1)+":"+u.getUsername());
System.out.println("评论内容:"+post.getPostcontent());
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
sqlSession.close();
}
}
知识点
联合( association )元素用来处理“一对一”的关系。比如说,在我们的例子中,一个博客对应一个作者。
属性 | 描述 |
---|---|
property | 这个属于映射一个结果的列。如果 JavaBean 的属性与给定的名称匹配,就会使用匹配的字。否则,MyBatis 将搜索属性名。两种情况下你都可以使用逗号的属性形式。比如,你可以遇到‘username’ ,也可以映射到‘address.street.number’ |
column | 数据表的列名或者标签别名,通用是代入 resultSet.getString(columnName)这 个 名 称 。 注 意 : 在 处 理 组 合 键 时 , 你 可 以 使 用 column= ”{prop1=col1,prop2=col2}”这样的语法,设置多个列名传入到嵌套语句。 |
javaType | 一个完整的类名,或者是一个类型别名。如果你匹配的是一个 JavaBean,那 MyBatis 通常会自行检测到。然后,如果你是要映射到一个 HashMap,那你需要指定 javaType 要达到的目的。 |
jdbcType | 数据表支持的类型列表。这个属性只在 insert,update 或 delete 的时候针对允许空的列有用。JDBC 需要这项,但 MyBatis 不需要。如果你是直接针对JDBC 编码,且有允许空的列,而你要指定这项。 |
typeHandler | 使用这个属性可以覆写类型处理器。这项值可以是一个完整的类名,也可以是一个类型别名。 |
一个博客只有一个作者,在一个博客类里,可能会表述成这样:
private User user;
博客与博客作者是一对一的关系。
<id property="blogid" column="blogId" />
<id property="userid" column="userId"/>
<id property="postid" column="postId" />
id 元素是嵌套映射中非常重要的角色。你需要指定一个或更多的属性用来标记结果。如果你没有这么做,MyBatis 也可能会正常运行,但是却会付出惨重的性能损耗。尽量用数量少的列来唯一标识结果,使用主键是个好的选择。
聚集( collection )元素作用和联合几乎一模一样,现实上,他们非常相似。
一个博客却有许多的评论。在一个博客类里,可能会表述成这样:
private List list;
要映射一个嵌套的结果集到一个像这样的列表中,我们可以使用聚集元素。就像联合元素一样,我们可以使用一个嵌套选择,或者是一个连接的嵌套的结果。
聚集比联合多一个属性,它就是“ofType”这个新元素这个元素是用来区别 JavaBean(或者字段)的属性类型和集合所包括的类型。
"list" ofType="com.icss.po.Post">...
另外在写该demo的时候,发现一个小异常:
org.apache.ibatis.binding.BindingException: Type interface com.icss.dao.BlogMapper is not known to the MapperRegistry.
这是因为没在SqlMapConfig.xml里面加上
<mappers>
<mapper resource="com/icss/dao/BlogMapper.xml"/>
mappers>