①创建数据库和表,数据库为mytest,表为users、orders和users_orders

  1. DROP TABLE IF EXISTS users;
  2. CREATE TABLE users(
  3. id INT PRIMARY KEY auto_increment,
  4. name VARCHAR(20),
  5. age INT
  6. );
  7.  
  8. INSERT INTO users(name, age) VALUES ('Jack', 40);
  9. INSERT INTO users(name, age) VALUES ('Rose', 36);
  10. INSERT INTO users(name, age) VALUES ('Tom', 18);
  11.  
  12. DROP TABLE IF EXISTS orders;
  13. CREATE TABLE orders(
  14. order_id INT PRIMARY KEY auto_increment,
  15. order_name VARCHAR(20),
  16. order_price float
  17. );
  18.  
  19. INSERT INTO orders(order_name, order_price) VALUES ('IPhone', 7777.77);
  20. INSERT INTO orders(order_name, order_price) VALUES ('Haier', 8888.88);
  21. INSERT INTO orders(order_name, order_price) VALUES ('Benz GLS', 9999);
  22.  
  23. DROP TABLE IF EXISTS users_orders;
  24. CREATE TABLE users_orders(
  25. user_id INT,
  26. order_id INT
  27. );
  28.  
  29. ALTER TABLE users_orders ADD CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users(id);
  30. ALTER TABLE users_orders ADD CONSTRAINT fk_order_id FOREIGN KEY (order_id) REFERENCES orders(order_id);
  31.  
  32. INSERT INTO users_orders VALUES (1,1);
  33. INSERT INTO users_orders VALUES (1,2);
  34. INSERT INTO users_orders VALUES (1,3);
  35. INSERT INTO users_orders VALUES (2,1);
  36. INSERT INTO users_orders VALUES (2,3);
  37. INSERT INTO users_orders VALUES (3,1);

②创建Java工程,导入相应的jar包

③创建配置文件conf.xml和数据库配置文件db.properties

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  3. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  4.  
  5. <configuration>
  6. <properties resource="db.properties"></properties>
  7. <environments default="development">
  8. <environment id="development">
  9. <transactionManager type="JDBC"></transactionManager>
  10. <dataSource type="POOLED">
  11. <property name="driver" value="${driver}"/>
  12. <property name="url" value="${url}"/>
  13. <property name="username" value="${name}"/>
  14. <property name="password" value="${password}"/>
  15. </dataSource>
  16. </environment>
  17. </environments>
  18.  
  19. <mappers>
  20. <mapper resource="org/mybatis/mapping/userMapper.xml"/>
  21. <mapper resource="org/mybatis/mapping/orderMapper.xml"/>
  22. </mappers>
  23. </configuration>
  1. driver = com.mysql.jdbc.Driver
  2. url = jdbc:mysql://localhost:3306/mytest
  3. name = root
  4. password = root

④创建实体类Users、Orders和Users_Orders

  1. package org.mybatis.domain;
  2.  
  3. import java.util.Set;
  4.  
  5. public class Orders {
  6. private int order_id;
  7. private String order_name;
  8. private float order_price;
  9. private Set<Users> users;
  10.  
  11. public int getOrder_id() {
  12. return order_id;
  13. }
  14. public void setOrder_id(int order_id) {
  15. this.order_id = order_id;
  16. }
  17. public String getOrder_name() {
  18. return order_name;
  19. }
  20. public void setOrder_name(String order_name) {
  21. this.order_name = order_name;
  22. }
  23. public float getOrder_price() {
  24. return order_price;
  25. }
  26. public void setOrder_price(float order_price) {
  27. this.order_price = order_price;
  28. }
  29. public Set<Users> getUsers() {
  30. return users;
  31. }
  32. public void setUsers(Set<Users> users) {
  33. this.users = users;
  34. }
  35.  
  36. @Override
  37. public String toString() {
  38. return "Order [orderID:" + order_id + ", orderName:" +
  39. order_name + ", orderPrice:" + order_price + "]";
  40. }
  41.  
  42. }
  1. package org.mybatis.domain;
  2.  
  3. import java.util.Set;
  4.  
  5. public class Users {
  6. private int id;
  7. private String name;
  8. private int age;
  9. private Set<Orders> orders;
  10.  
  11. public Set<Orders> getOrders() {
  12. return orders;
  13. }
  14. public void setOrders(Set<Orders> orders) {
  15. this.orders = orders;
  16. }
  17. public int getId() {
  18. return id;
  19. }
  20. public void setId(int id) {
  21. this.id = id;
  22. }
  23. public String getName() {
  24. return name;
  25. }
  26. public void setName(String name) {
  27. this.name = name;
  28. }
  29. public int getAge() {
  30. return age;
  31. }
  32. public void setAge(int age) {
  33. this.age = age;
  34. }
  35.  
  36. @Override
  37. public String toString() {
  38. return "User [userID:" + id + ", userName:" +
  39. name + ", userAge:" + age + "]";
  40. }
  41.  
  42. }
  1. package org.mybatis.domain;
  2.  
  3. public class Users_Orders {
  4.  
  5. private Users user;
  6. private Orders order;
  7.  
  8. public Users getUser() {
  9. return user;
  10. }
  11. public void setUser(Users user) {
  12. this.user = user;
  13. }
  14. public Orders getOrder() {
  15. return order;
  16. }
  17. public void setOrder(Orders order) {
  18. this.order = order;
  19. }
  20.  
  21. }

⑤创建sql映射文件userMapper.xml和orderMapper.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  4.  
  5. <mapper namespace="org.mybatis.mapping.userMapper">
  6. <select id="getUsers" resultMap="getUsersMap">
  7. select * from users u, orders o, users_orders uo
  8. where u.id=uo.user_id and o.order_id=uo.order_id
  9. and u.id=#{id}
  10. </select>
  11.  
  12. <resultMap type="org.mybatis.domain.Users" id="getUsersMap">
  13. <id column="id" property="id" />
  14. <result column="name" property="name" />
  15. <result column="age" property="age"/>
  16. <collection property="orders" ofType="org.mybatis.domain.Orders">
  17. <id column="order_id" property="order_id"/>
  18. <result column="order_name" property="order_name"/>
  19. <result column="order_price" property="order_price"/>
  20. </collection>
  21. </resultMap>
  22. </mapper>

userMapper.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  4.  
  5. <mapper namespace="org.mybatis.mapping.orderMapper">
  6. <select id="getOrders" resultMap="getOrdersMap">
  7. select * from users u, orders o, users_orders uo
  8. where u.id=uo.user_id and o.order_id=uo.order_id
  9. and o.order_id=#{id}
  10. </select>
  11.  
  12. <resultMap type="org.mybatis.domain.Orders" id="getOrdersMap">
  13. <id column="order_id" property="order_id" />
  14. <result column="order_name" property="order_name" />
  15. <result column="order_price" property="order_price"/>
  16. <collection property="users" ofType="org.mybatis.domain.Users">
  17. <id column="id" property="id"/>
  18. <result column="name" property="name"/>
  19. <result column="age" property="age"/>
  20. </collection>
  21. </resultMap>
  22. </mapper>

orderMapper.xml

⑥向配置文件中注册 userMapper.xml和orderMapper.xml 文件【已添加,查看第③步】

⑦测试类

  1. package org.mybatis.app;
  2.  
  3. import java.io.InputStream;
  4. import java.util.List;
  5. import java.util.Set;
  6.  
  7. import org.apache.ibatis.session.SqlSession;
  8. import org.apache.ibatis.session.SqlSessionFactory;
  9. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  10. import org.junit.Before;
  11. import org.junit.Test;
  12. import org.mybatis.domain.Orders;
  13. import org.mybatis.domain.Users;
  14.  
  15. public class TestManyToMany {
  16.  
  17. SqlSession session;
  18.  
  19. @Before
  20. public void beforeLoad() {
  21. InputStream inputStream =
  22. TestManyToMany.class.getClassLoader().getResourceAsStream("conf.xml");
  23. SqlSessionFactory sqlSessionFactory =
  24. new SqlSessionFactoryBuilder().build(inputStream);
  25. session = sqlSessionFactory.openSession();
  26. }
  27.  
  28. @Test
  29. public void testGetUsers() {
  30. String statement = "org.mybatis.mapping.userMapper.getUsers";
  31. List<Users> usersList = session.selectList(statement, 2);
  32. for(Users user : usersList) {
  33. System.out.println(user.getName() + "买了" + user.getOrders().size() + "个产品, 它们是:");
  34. Set<Orders> orders = user.getOrders();
  35. for(Orders order : orders) {
  36. System.out.println(order.getOrder_name());
  37. }
  38. }
  39. }
  40.  
  41. @Test
  42. public void testGetOrders() {
  43. String statement = "org.mybatis.mapping.orderMapper.getOrders";
  44. List<Orders> orderList = session.selectList(statement, 3);
  45. for(Orders order : orderList) {
  46. System.out.println(order.getOrder_name() + "被买了" + order.getUsers().size() + "次, 买它的人有:");
  47. Set<Users> users = order.getUsers();
  48. for(Users user : users) {
  49. System.out.println(user.getName());
  50. }
  51. }
  52. }
  53.  
  54. }

⑧结构图:

【Mybatis】多对多实例的更多相关文章

  1. mybatis多对一关联

    mybatis多对一关联查询实现 1.定义实体 定义实体的时候需要注意,若是双向关联,就是说双方的属性中都含有对方对象作为域属性出现, 那么在写toString()方法时需要注意,只让某一方输出即可, ...

  2. Java基础-SSM之mybatis多对多关联

    Java基础-SSM之mybatis多对多关联 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.准备测试环境(创建数据库表) 1>.创建teas,stus,links表 u ...

  3. MyBatis多对多查询

    -------------------siwuxie095                                 MyBatis 多对多查询         以订单和商品为例,即 一个订单可 ...

  4. 1. mybatis 的入门实例

    mybatis 的入门实例 1.创建一个普通的Java项目 1.加入jar包(所有mybatis 和mysql) 2.加入配置文件 src 目录下 (1) db.properties mysql.us ...

  5. mybatis多对多关联关系映射

    mybatis多对多关联关系映射 多对多关系在java类实体中表示为,一个类中包含了集合为另一个类的属性.而这连个实体都需要包含对方的集合类的属性. 例如:订单和商品,一个订单包含多个商品,一个商品又 ...

  6. mybatis多对一关联的两种方式

    第一个种是Address找到自己的user_id,扔给User,让User自己去再查一次,即使在有缓存的前提下,每遇到一个新的user_id,就会查一次,对比hibernate的话,相当于多对一eag ...

  7. springboot+mybatis+springmvc整合实例

    以往的ssm框架整合通常有两种形式,一种是xml形式,一种是注解形式,不管是xml还是注解,基本都会有一大堆xml标签配置,其中有很多重复性的.springboot带给我们的恰恰是“零配置”,&quo ...

  8. mybatis多对多关联查询——(十)

    1.需求 查询用户及用户购买商品信息. 2     sql语句 查询主表是:用户表 关联表:由于用户和商品没有直接关联,通过订单和订单明细进行关联,所以关联表: orders.orderdetail. ...

  9. Hibernate的多对多实例

    在完成了一对多的实例的基础上,继续做多对多实例.例子是老师和学生,一个老师教多个学生,一个学生也有多个老师. 文档结构如图:

随机推荐

  1. 《mysql必知必会》学习_第20章_20180809_欢

    第20章:更新和删除数据 P140 update customers set_emails='elmer@fudd.com' where cust_id=10005; 更新多个列,用逗号隔开.注意被指 ...

  2. web安全基础

    web安全备忘 主机系统安全防护:防火墙控制 Web是一个分布式系统,一个站点多个主机布置,一主机布置多个站点:并发,异步,同步 主机安全配置文件修改与强化 web站点数据验证逻辑的常用技巧:功能性代 ...

  3. 背水一战 Windows 10 (66) - 控件(WebView): 监听和处理 WebView 的事件

    [源码下载] 背水一战 Windows 10 (66) - 控件(WebView): 监听和处理 WebView 的事件 作者:webabcd 介绍背水一战 Windows 10 之 控件(WebVi ...

  4. 改善Python 程序的 91 个建议

    建议1.理解Pythonic概念—-详见Python中的<Python之禅> 建议2.编写Pythonic代码 (1)避免不规范代码,比如只用大小写区分变量.使用容易混淆的变量名.害怕过长 ...

  5. Python大法之告别脚本小子系列—信息资产收集类脚本编写(下)

    作者:阿甫哥哥 原文来自:https://bbs.ichunqiu.com/article-1618-1.html 系列文章专辑:Python大法之告别脚本小子系列目录: 0×05 高精度字典生成脚本 ...

  6. Javascript高级编程学习笔记(12)—— 引用类型(1)Object类型

    前面的文章中我们知道JS中的值分为两种类型 基础类型的值和引用类型的值 基础类型的值我已经大概介绍了一下,今天开始后面几天我会为大家介绍一下引用类型的值 Object类型 对象是引用类型的值的实例,在 ...

  7. Android精通教程-第一节Android入门简介

    前言 大家好,给大家带来Android精通教程-第一节Android入门简介的概述,希望你们喜欢 每日一句 If life were predictable it would cease to be ...

  8. 用document.readyState实现网页加载进度条

    概述 之前以为给网页设置加载进度条很麻烦,今天一学真是超级简单,记录下来供以后开发时参考,相信对其他人也有用. readyState 主要运用了document.readyState和nprogres ...

  9. 仿B站项目——(1)计划,前端工程

    计划 现打算: 计划用webpack打包 + 模板语言 + jquery + jquery ui + bootstrap做一个仿B站的静态网站. 网站兼容手机浏览器端. 部分模块打算仿照SPA用js加 ...

  10. PHP扩展开发教程(总结)

    PHP是一种解释型的语言,对于用户而言,我们精心的控制内存意味着easier prototyping和更少的崩溃!当我们深入到内核之后,所有的安全防线都已经被越过,最终还是要依赖于真正有责任心的软件工 ...