對於數據庫中的多對多關係建議使用一箇中間表來維護關係。java
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');
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');
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方法
}
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>
public interface OrderMapper { Order selectOrderById(int id); }
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
結果如圖所示:
測試成功!