mybatis 關聯查詢

在前面一章mybatis數據庫增刪改查操作中,我們已經能完成簡單的增刪改查操作,可是在真實項目中,必定還會涉及到多張表關聯查詢的操作,那麼在進行多張表關聯查詢時,在mybatis中又該怎樣配置呢?
在前面幾章中,數據庫中已經有了一張t_user表,現在創建一張與t_user相關聯的表t_article,並插入幾條關聯數據:
這裏寫圖片描述
由圖可見,t_article的user_id關聯的是t_user表中的id字段,並且這幾條數據都是關聯的是id爲1的用戶,article與user爲多對一關係。

之前的代碼目錄結構如下:
這裏寫圖片描述

現在,在mapper包下新建一個Article類屬性與t_article表相對應,並重寫toString方法,注意:在Article類中關聯屬性並沒有使用int類型的user_id,而是一個User對象:

package cn.bdyl.model;

public class Article {
    private Integer id;
    private String title;
    private String content;
    private User user;

    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    @Override
    public String toString() {
        return "Article [id=" + id + ", title=" + title + ", content="+ content + ", user=" + user + "]";
    }

}

在configuration.xml文件中配置Article類的別名

<typeAlias alias="Article" type="cn.bdyl.model.Article"/> 

在UserMapper接口中添加方法queryUserArticles:

public List<Article> queryUserArticles(int userId);

配置User.xml文件(方式一):

<resultMap type="Article" id="articleListMap">
    <id column="id" property="id"/>
    <result column="title" property="title"/>
    <result column="content" property="content"/>

    <association property="user" javaType="User">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="sex" property="sex"/>
        <result column="address" property="address"/>
    </association>
</resultMap>

<select id="queryUserArticles" parameterType="int" resultMap="articleListMap">
    select a.id,a.content,a.title,u.id,u.name,u.sex,u.address from t_user u,t_article a where u.id=a.user_id and u.id=#{userId}

</select>

配置User.xml文件(方式二:將association中對應的映射獨立出來,達到複用的目的)

<resultMap type="User" id="userListMap">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="sex" property="sex"/>
        <result column="address" property="address"/>
</resultMap>
<resultMap type="Article" id="articleListMap">
        <id column="id" property="id"/>
        <result column="title" property="title"/>
        <result column="content" property="content"/>

        <association property="user" javaType="User" resultMap="userListMap"></association>
</resultMap>  
<select id="queryUserArticles" parameterType="int" resultMap="articleListMap">
    select a.id,a.content,a.title,u.id,u.name,u.sex,u.address from t_user u,t_article a where u.id=a.user_id and u.id=#{userId}
</select>

注:當兩張表中有相同的字段時,在查詢時應根據映射先後順序查詢,否則查詢不出完整的結果。

測試代碼:

public void testRelatedQuery(){
        SqlSession session = sqlSessionFactory.openSession();

        try {
            UserMapper userMapper = session.getMapper(UserMapper.class);
            List<Article> articles = userMapper.queryUserArticles(1);

            for (Article article : articles) {
                System.out.println(article);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            if(session!=null){
                session.close();
            }
        }
    }

執行結果:

Article [id=1, title=標題1, content=內容1, user=User [id=1, name=小明, sex=男, address=四川成都]]
Article [id=2, title=標題2, content=內容2, user=User [id=2, name=小明, sex=男, address=四川成都]]
Article [id=3, title=標題3, content=內容3, user=User [id=3, name=小明, sex=男, address=四川成都]]
發佈了57 篇原創文章 · 獲贊 12 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章