MyBatis学习笔记(3)

MyBatis入门之高级结果映射

  • demo截图
    MyBatis学习笔记(3)_第1张图片

  • 编写po类(Blog.java,Post.java,User.java)

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 + "]";
    }

}
  • 编写映射文件(BlogMapper.xml)


<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();
        }
    }
  • 结果
    MyBatis学习笔记(3)_第2张图片

  • 知识点
    联合( 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>

你可能感兴趣的:(javaweb,java,框架,mybatis)