MyBatis學習(七)MyBatis關聯映射之多對多映射

對於數據庫中的多對多關係建議使用一箇中間表來維護關係。java

1.建立四張表,分別爲用戶表,商品表,訂單表,中間表。

 1 DROP TABLE IF EXISTS `t_user`;  2 CREATE TABLE `t_user` (  3   `id` int(11) NOT NULL AUTO_INCREMENT,  4   `username` varchar(18) NOT NULL,  5   `sex` char(2) NOT NULL,  6   `age` int(11) NOT NULL,  7   PRIMARY KEY (`id`)  8 ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;  9 
10 -- ----------------------------
11 -- Records of t_user
12 -- ----------------------------
13 INSERT INTO `t_user` VALUES ('1', '張三', '', '12'); 14 INSERT INTO `t_user` VALUES ('2', '王五', '', '12');
user表
 1 -- ----------------------------
 2 -- Table structure for `t_article`
 3 -- ----------------------------
 4 DROP TABLE IF EXISTS `t_article`;  5 CREATE TABLE `t_article` (  6   `id` int(11) NOT NULL AUTO_INCREMENT,  7   `name` varchar(255) NOT NULL,  8   `price` int(11) NOT NULL,  9   `remark` varchar(255) NOT NULL, 10   PRIMARY KEY (`id`) 11 ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; 12 
13 -- ----------------------------
14 -- Records of t_article
15 -- ----------------------------
16 INSERT INTO `t_article` VALUES ('1', 'java', '100', 'java'); 17 INSERT INTO `t_article` VALUES ('2', 'spring', '100', 'spring');
商品表
-- ---------------------------- -- Table structure for `t_order` -- ----------------------------
DROP TABLE IF EXISTS `t_order`; CREATE TABLE `t_order` ( `id` int(11) NOT NULL AUTO_INCREMENT, `uid` int(11) NOT NULL, `total` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `uid` (`uid`), CONSTRAINT `uid` FOREIGN KEY (`uid`) REFERENCES `t_user` (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of t_order -- ----------------------------
INSERT INTO `t_order` VALUES ('1', '1', '100'); INSERT INTO `t_order` VALUES ('2', '1', '200');
訂單表
-- ---------------------------- -- Table structure for `t_item` -- ----------------------------
DROP TABLE IF EXISTS `t_item`; CREATE TABLE `t_item` ( `order_id` int(11) NOT NULL, `article_id` int(11) NOT NULL, PRIMARY KEY (`order_id`,`article_id`), KEY `article_id` (`article_id`), CONSTRAINT `article_id` FOREIGN KEY (`article_id`) REFERENCES `t_article` (`id`), CONSTRAINT `order_id` FOREIGN KEY (`order_id`) REFERENCES `t_order` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of t_item -- ----------------------------
INSERT INTO `t_item` VALUES ('1', '1'); INSERT INTO `t_item` VALUES ('2', '1'); INSERT INTO `t_item` VALUES ('1', '2');
中間表

2.建立一個項目,導入所需的jar包,導入db.perproties、log4j.properties屬性文件

3.編寫對應的實體類

 

User.javaspring

public class User { private Integer id; private String username; private String sex; private Integer age; //一個用戶能夠有多個訂單
    private List<Order> orders; //省略set、get、toString方法 
}

Order.java數據庫

public class Order { private Integer id; private Double total; //一個訂單對應一個用戶
    private User user; //一個訂單能夠有多個商品
    private List<Article> articles; //省略set、get、toString方法
}

Article.javasession

public class Article { private Integer id; private String name; private Double price; private String remark; //一種商品能夠出如今多個訂單中
    private List<Order> orders; //省略get、set、toString方法
}

4.編寫SQL映射文件

OrderMapper.xmlmybatis

<?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.dj.mapper.OrderMapper">
    <resultMap type="com.dj.domain.Order" id="orderResultMapper">
        <id property="id" column="oid"/>
        <result property="total" column="total"/>
        <!-- 多對一關聯映射 -->
        <association property="user" javaType="com.dj.domain.User">
            <id property="id" column="id"/>
            <result property="username" column="username"/>
            <result property="sex" column="sex"/>
            <result property="age" column="age"/>
        </association>
        <!-- 多對多映射 -->
        <!-- 使用查詢到的column屬性oid的值做爲參數執行selectArticleByOrderId -->
        <collection property="articles" column="oid" fetchType="lazy"
            javaType="ArrayList" ofType="com.dj.domain.Article" 
            select="com.dj.mapper.ArticleMapper.selectArticleByOrderId"> 
            <id property="id" column="id"/>
            <result property="name" column="name"/>
            <result property="price" column="price"/>
            <result property="remark" column="remark"/>
        </collection>
    </resultMap>
    <!-- 查詢結果有兩個id列,因此把order的id取一個別名oid -->
    <select id="selectOrderById" parameterType="int" resultMap="orderResultMapper">
        select u.*,o.id as oid ,o.total     
        from t_user u,t_order o
        where u.id=o.uid and o.id=#{id}
    </select>
</mapper>

ArticleMapper.xmlapp

<?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.dj.mapper.ArticleMapper">
    <select id="selectArticleByOrderId" parameterType="int"
        resultType="com.dj.domain.Article">
            select * from t_article where id in(
                select article_id from t_item where order_id=#{id}
            )
            </select>
</mapper>

 

5.mapper接口對象

public interface OrderMapper {
Order selectOrderById(int id);
}

6.測試類

public class SelectOrderTest {
    public static void main(String[] args) throws Exception {
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession session = factory.openSession();
        //得到接口的代理對象
        OrderMapper om = session.getMapper(OrderMapper.class);
        Order order = om.selectOrderById(1);
        System.out.println(order);
        User user = order.getUser();
        System.out.println(user);
        List<Article> articles = order.getArticles();
        for (Article article : articles) {
            System.out.println(article);    
        }  
    }
}

  流程:dom

  獲得一個OrderMapper接口的代理對象,調用裏面的selectOrderById(int id)方法,找到OrderMapper.xml裏面 id爲selectOrderById的select屬性,返回的是一個resultMap,找到這個resultMap,這個resultMap返回的是一個Order類型。ide

  執行id爲selecOrderById的select屬性裏面的SQL語句結果以下圖測試

  

  而後將查詢到的數據中的用戶信息裝載到Order對象的user屬性中,將查詢到column屬性的oid的值做爲參數,執行ArticleMapper.xml裏面的selectArticleByOrderId查詢訂單中的商品,將查詢到的商品數據封裝到Order對象的articles對象當中。fetch

  結果如圖所示:

測試成功!

相關文章
相關標籤/搜索