Mybatis表關(guān)聯(lián)多對(duì)一

Mybatis表關(guān)聯(lián)多對(duì)一

在上章的 一對(duì)多 中,我們已經(jīng)學(xué)習(xí)如何在 Mybatis 中關(guān)聯(lián)多表,但在實(shí)際項(xiàng)目中也是經(jīng)常使用 多對(duì)一 的情況,這些查詢是如何處理的呢,在這一節(jié)中我們來(lái)學(xué)習(xí)它。多表映射的多對(duì)一關(guān)系要用到 mybitis 的 association 來(lái)加以實(shí)現(xiàn)。這篇介紹的是多表中的多對(duì)一表關(guān)聯(lián)查詢。

應(yīng)用場(chǎng)景:首先根據(jù)帖子 ID 讀取一個(gè)帖子信息,然后再讀取這個(gè)帖子所屬的用戶信息。

1、先做一些準(zhǔn)備工作

我們首先在創(chuàng)建一個(gè) java 工程,工程名稱為:mybatis05-many2one(

下載

),還需要?jiǎng)?chuàng)建兩張表,它們分別是用戶表 user,和帖子表 post,一個(gè)戶用戶可以有多個(gè)帖子。

user表的結(jié)構(gòu)和數(shù)據(jù):

-- ----------------------------
-- Table structure for `user`
-- ----------------------------
CREATE TABLE `user` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(64) NOT NULL DEFAULT '',
  `mobile` int(10) unsigned NOT NULL DEFAULT '0',
  `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', 'yiibai', '100', '2015-09-23 20:11:23');

帖子表 post 的結(jié)構(gòu)和數(shù)據(jù):

-- ----------------------------
-- Table structure for `post`
-- ----------------------------
CREATE TABLE `post` (
  `post_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `userid` int(10) unsigned NOT NULL,
  `title` varchar(254) NOT NULL DEFAULT '',
  `content` text,
  `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`post_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of post
-- ----------------------------
INSERT INTO `post` VALUES ('1', '1', 'MyBatis關(guān)聯(lián)數(shù)據(jù)查詢', '在實(shí)際項(xiàng)目中,經(jīng)常使用關(guān)聯(lián)表的查詢,比如:多對(duì)一,一對(duì)多等。這些查詢是如何處理的呢,這一講就講這個(gè)問(wèn)題。我們首先創(chuàng)建一個(gè) post 表,并初始化數(shù)據(jù).', '2015-09-23 21:40:17');
INSERT INTO `post` VALUES ('2', '1', 'MyBatis開發(fā)環(huán)境搭建', '為了方便學(xué)習(xí),這里直接建立java 工程,但一般都是開發(fā) Web 項(xiàng)目。', '2015-09-23 21:42:14');
INSERT INTO `post` VALUES ('3', '2', '這個(gè)是別人發(fā)的', 'content,內(nèi)容...', '0000-00-00 00:00:00');  

從上面應(yīng)該看出,這幾個(gè)帖子對(duì)應(yīng)的 userid 都是1,所以需要用戶表 user 里面有 id=1 的數(shù)據(jù)??梢孕薷某蓾M足自己條件的數(shù)據(jù),按照 orm 的規(guī)則,表肯定需要一個(gè)對(duì)象與之對(duì)應(yīng),所以我們?cè)黾右粋€(gè) Post 類。

2、創(chuàng)建表對(duì)應(yīng)的 JavaBean 對(duì)象

這個(gè)例子中,我們需要在包 com.yiibai.pojo 下創(chuàng)建兩個(gè)類,它們分別是: User.java 和 Post.java,我們一個(gè)一個(gè)地來(lái)看它們的代碼,User.java 類的代碼如下:

package com.yiibai.pojo;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

public class User implements Serializable{
    private int id;
    private String username;
    private String mobile;
    private List<Post> posts;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getMobile() {
        return mobile;
    }

    public void setMobile(String mobile) {
        this.mobile = mobile;
    }

    public List<Post> getPosts() {
        return posts;
    }
    public void setPosts(List<Post> posts) {
        this.posts = posts;
    }

    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + username + "]";
    }

}

Post.java 類的代碼如下:

package com.yiibai.pojo;

import java.io.Serializable;

public class Post implements Serializable{
    private int id;
    private User user;
    private String title;
    private String content;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    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;
    }
}

3、配置文件

在這一章節(jié)中,要用到的配置文件有兩個(gè),一個(gè)是 mybatis 的主配置文件:src/config/Configure.xml 和 User.java對(duì)應(yīng)的配置文件 User.xml,我們先來(lái)看看 src/config/Configure.xml,其詳細(xì)配置信息如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <typeAliases>
        <typeAlias alias="User" type="com.yiibai.pojo.User" />
        <typeAlias alias="Post" type="com.yiibai.pojo.Post" />
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/yiibai" />
                <property name="username" value="root" />
                <property name="password" value="" />
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <!-- // power by http://www.yiibai.com -->
        <mapper resource="com/yiibai/pojo/User.xml" />
    </mappers>
</configuration>

這里需要注意的是 <typeAliases> 這個(gè)標(biāo)簽內(nèi)容,它就是用于定義一個(gè) JavaBean 類的別名,如將 com.yiibai.pojo.User 簡(jiǎn)寫為 User,可以認(rèn)為

com.yiibai.pojo.User 就是 User,User 就是 com.yiibai.pojo.User 。

另外一個(gè)配置文件 User.xml 的內(nèi)容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.yiibai.userMaper">
    <!-- User 級(jí)聯(lián)文章查詢 方法配置 (多個(gè)文章對(duì)一個(gè)用戶)  -->
    
    <resultMap type="Post" id="resultPostsMap">
        <result property="id" column="post_id" />
        <result property="title" column="title" />
        <result property="content" column="content" />
        <association property="user" javaType="User">  
            <id property="id" column="userid"/>   
            <result property="username" column="username"/>   
            <result property="mobile" column="mobile"/>   
        </association> 
    </resultMap>

    <select id="getPosts" resultMap="resultPostsMap" parameterType="int">
        SELECT u.*,p.*
        FROM user u, post p
        WHERE u.id=p.userid AND p.post_id=#{post_id} 
  </select>

</mapper>

注:在上面的配置文件中,使用到了一個(gè) <association>標(biāo)簽,關(guān)聯(lián)對(duì)應(yīng)的 User 類。

4、測(cè)試程序運(yùn)行

到這里,整個(gè)工作準(zhǔn)備得已經(jīng)差不多了,我們創(chuàng)建一個(gè)主類來(lái)測(cè)試上面程序,在 src 下創(chuàng)建一個(gè) Main.java,代碼如下:

import java.io.Reader;
import java.text.MessageFormat;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.yiibai.pojo.Post;
import com.yiibai.pojo.User;


public class Main {
    private static SqlSessionFactory sqlSessionFactory;
    private static Reader reader;

    static {
        try {
            reader = Resources.getResourceAsReader("config/Configure.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static SqlSessionFactory getSession() {
        return sqlSessionFactory;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        SqlSession session = sqlSessionFactory.openSession();
        try {
            int postId = 1;
            Post post = session.selectOne("com.yiibai.userMaper.getPosts", postId); 
            System.out.println("title: "+post.getTitle());
            System.out.println("userName: "+post.getUser().getUsername());
        } finally {
            session.close();
        }
    }

}

輸出結(jié)果如下:

title: MyBatis關(guān)聯(lián)數(shù)據(jù)查詢
userName: yiibai

附工程目錄結(jié)構(gòu)圖如下:

img
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Mybatis表關(guān)聯(lián)一對(duì)多 有了前面幾章的基礎(chǔ),對(duì)一些簡(jiǎn)單的應(yīng)用是可以處理的,但在實(shí)際項(xiàng)目中,經(jīng)常是關(guān)聯(lián)表的查詢,...
    木易林1閱讀 4,848評(píng)論 0 2
  • 1 Mybatis入門 1.1 單獨(dú)使用jdbc編程問(wèn)題總結(jié) 1.1.1 jdbc程序 上邊使...
    哇哈哈E閱讀 3,410評(píng)論 0 38
  • 和平時(shí)一樣,月華乘車來(lái)到了這個(gè)不足二十平米但卻盛裝了愛(ài)情的小窩。打開手機(jī),一邊聽著自己喜歡《畫心》一邊準(zhǔn)備做飯的材...
    余下清香閱讀 315評(píng)論 0 0
  • [TOC]列表控件也算是很常見的控件了,現(xiàn)在基本都切換到RecycleView了,這邊記錄下列表控件的基本的使用以...
    冰川孤辰j(luò)s閱讀 5,125評(píng)論 0 19
  • 防御機(jī)制的作用,是回避或處理強(qiáng)烈的、具有威脅性的情感,比如極度的焦慮、非常痛苦的哀傷等等。 因?yàn)槿说谋拘允遣灰屪?..
    冬瓜悠悠閱讀 1,621評(píng)論 0 0

友情鏈接更多精彩內(nèi)容