在前面一章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=四川成都]]