【Mybatis】多对多实例
①创建数据库和表,数据库为mytest,表为users、orders和users_orders
DROP TABLE IF EXISTS users;
CREATE TABLE users(
id INT PRIMARY KEY auto_increment,
name VARCHAR(20),
age INT
); INSERT INTO users(name, age) VALUES ('Jack', 40);
INSERT INTO users(name, age) VALUES ('Rose', 36);
INSERT INTO users(name, age) VALUES ('Tom', 18); DROP TABLE IF EXISTS orders;
CREATE TABLE orders(
order_id INT PRIMARY KEY auto_increment,
order_name VARCHAR(20),
order_price float
); INSERT INTO orders(order_name, order_price) VALUES ('IPhone', 7777.77);
INSERT INTO orders(order_name, order_price) VALUES ('Haier', 8888.88);
INSERT INTO orders(order_name, order_price) VALUES ('Benz GLS', 9999); DROP TABLE IF EXISTS users_orders;
CREATE TABLE users_orders(
user_id INT,
order_id INT
); ALTER TABLE users_orders ADD CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users(id);
ALTER TABLE users_orders ADD CONSTRAINT fk_order_id FOREIGN KEY (order_id) REFERENCES orders(order_id); INSERT INTO users_orders VALUES (1,1);
INSERT INTO users_orders VALUES (1,2);
INSERT INTO users_orders VALUES (1,3);
INSERT INTO users_orders VALUES (2,1);
INSERT INTO users_orders VALUES (2,3);
INSERT INTO users_orders VALUES (3,1);
②创建Java工程,导入相应的jar包

③创建配置文件conf.xml和数据库配置文件db.properties
<?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>
<properties resource="db.properties"></properties>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${name}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments> <mappers>
<mapper resource="org/mybatis/mapping/userMapper.xml"/>
<mapper resource="org/mybatis/mapping/orderMapper.xml"/>
</mappers>
</configuration>
driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/mytest
name = root
password = root
④创建实体类Users、Orders和Users_Orders
package org.mybatis.domain;
import java.util.Set;
public class Orders {
    private int order_id;
    private String order_name;
    private float order_price;
    private Set<Users> users;
    public int getOrder_id() {
        return order_id;
    }
    public void setOrder_id(int order_id) {
        this.order_id = order_id;
    }
    public String getOrder_name() {
        return order_name;
    }
    public void setOrder_name(String order_name) {
        this.order_name = order_name;
    }
    public float getOrder_price() {
        return order_price;
    }
    public void setOrder_price(float order_price) {
        this.order_price = order_price;
    }
    public Set<Users> getUsers() {
        return users;
    }
    public void setUsers(Set<Users> users) {
        this.users = users;
    }
    @Override
    public String toString() {
        return "Order [orderID:" + order_id + ", orderName:" +
                order_name + ", orderPrice:" + order_price + "]";
    }
}
package org.mybatis.domain;
import java.util.Set;
public class Users {
    private int id;
    private String name;
    private int age;
    private Set<Orders> orders;
    public Set<Orders> getOrders() {
        return orders;
    }
    public void setOrders(Set<Orders> orders) {
        this.orders = orders;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "User [userID:" + id + ", userName:" +
                name + ", userAge:" + age + "]";
    }
}
package org.mybatis.domain;
public class Users_Orders {
    private Users user;
    private Orders order;
    public Users getUser() {
        return user;
    }
    public void setUser(Users user) {
        this.user = user;
    }
    public Orders getOrder() {
        return order;
    }
    public void setOrder(Orders order) {
        this.order = order;
    }
}
⑤创建sql映射文件userMapper.xml和orderMapper.xml
<?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="org.mybatis.mapping.userMapper">
<select id="getUsers" resultMap="getUsersMap">
select * from users u, orders o, users_orders uo
where u.id=uo.user_id and o.order_id=uo.order_id
and u.id=#{id}
</select> <resultMap type="org.mybatis.domain.Users" id="getUsersMap">
<id column="id" property="id" />
<result column="name" property="name" />
<result column="age" property="age"/>
<collection property="orders" ofType="org.mybatis.domain.Orders">
<id column="order_id" property="order_id"/>
<result column="order_name" property="order_name"/>
<result column="order_price" property="order_price"/>
</collection>
</resultMap>
</mapper>
userMapper.xml
<?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="org.mybatis.mapping.orderMapper">
<select id="getOrders" resultMap="getOrdersMap">
select * from users u, orders o, users_orders uo
where u.id=uo.user_id and o.order_id=uo.order_id
and o.order_id=#{id}
</select> <resultMap type="org.mybatis.domain.Orders" id="getOrdersMap">
<id column="order_id" property="order_id" />
<result column="order_name" property="order_name" />
<result column="order_price" property="order_price"/>
<collection property="users" ofType="org.mybatis.domain.Users">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="age" property="age"/>
</collection>
</resultMap>
</mapper>
orderMapper.xml
⑥向配置文件中注册 userMapper.xml和orderMapper.xml 文件【已添加,查看第③步】
⑦测试类
package org.mybatis.app; import java.io.InputStream;
import java.util.List;
import java.util.Set; import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import org.mybatis.domain.Orders;
import org.mybatis.domain.Users; public class TestManyToMany { SqlSession session; @Before
public void beforeLoad() {
InputStream inputStream =
TestManyToMany.class.getClassLoader().getResourceAsStream("conf.xml");
SqlSessionFactory sqlSessionFactory =
new SqlSessionFactoryBuilder().build(inputStream);
session = sqlSessionFactory.openSession();
} @Test
public void testGetUsers() {
String statement = "org.mybatis.mapping.userMapper.getUsers";
List<Users> usersList = session.selectList(statement, 2);
for(Users user : usersList) {
System.out.println(user.getName() + "买了" + user.getOrders().size() + "个产品, 它们是:");
Set<Orders> orders = user.getOrders();
for(Orders order : orders) {
System.out.println(order.getOrder_name());
}
}
} @Test
public void testGetOrders() {
String statement = "org.mybatis.mapping.orderMapper.getOrders";
List<Orders> orderList = session.selectList(statement, 3);
for(Orders order : orderList) {
System.out.println(order.getOrder_name() + "被买了" + order.getUsers().size() + "次, 买它的人有:");
Set<Users> users = order.getUsers();
for(Users user : users) {
System.out.println(user.getName());
}
}
} }
⑧结构图:

【Mybatis】多对多实例的更多相关文章
- mybatis多对一关联
		mybatis多对一关联查询实现 1.定义实体 定义实体的时候需要注意,若是双向关联,就是说双方的属性中都含有对方对象作为域属性出现, 那么在写toString()方法时需要注意,只让某一方输出即可, ... 
- Java基础-SSM之mybatis多对多关联
		Java基础-SSM之mybatis多对多关联 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.准备测试环境(创建数据库表) 1>.创建teas,stus,links表 u ... 
- MyBatis多对多查询
		-------------------siwuxie095 MyBatis 多对多查询 以订单和商品为例,即 一个订单可 ... 
- 1. mybatis 的入门实例
		mybatis 的入门实例 1.创建一个普通的Java项目 1.加入jar包(所有mybatis 和mysql) 2.加入配置文件 src 目录下 (1) db.properties mysql.us ... 
- mybatis多对多关联关系映射
		mybatis多对多关联关系映射 多对多关系在java类实体中表示为,一个类中包含了集合为另一个类的属性.而这连个实体都需要包含对方的集合类的属性. 例如:订单和商品,一个订单包含多个商品,一个商品又 ... 
- mybatis多对一关联的两种方式
		第一个种是Address找到自己的user_id,扔给User,让User自己去再查一次,即使在有缓存的前提下,每遇到一个新的user_id,就会查一次,对比hibernate的话,相当于多对一eag ... 
- springboot+mybatis+springmvc整合实例
		以往的ssm框架整合通常有两种形式,一种是xml形式,一种是注解形式,不管是xml还是注解,基本都会有一大堆xml标签配置,其中有很多重复性的.springboot带给我们的恰恰是“零配置”,&quo ... 
- mybatis多对多关联查询——(十)
		1.需求 查询用户及用户购买商品信息. 2 sql语句 查询主表是:用户表 关联表:由于用户和商品没有直接关联,通过订单和订单明细进行关联,所以关联表: orders.orderdetail. ... 
- Hibernate的多对多实例
		在完成了一对多的实例的基础上,继续做多对多实例.例子是老师和学生,一个老师教多个学生,一个学生也有多个老师. 文档结构如图: 
随机推荐
- 人生苦短:Python里的17个“超赞操作
			人生苦短,我选Python”.那么,你真的掌握了Python吗? 1. 交换变量 有时候,当我们要交换两个变量的值时,一种常规的方法是创建一个临时变量,然后用它来进行交换.比如: # 输入 a = ... 
- MySQL:基础架构和工作流程
			[参考文章]:01|基础架构:一条查询语句的执行流程 1. 基本架构 大体来说,MySQL可以分为Server层和存储引擎两部分. Server层包括链接器,分析器,优化器,执行器等,涵盖大多数核心服 ... 
- python中匿名函数lambda
			简单来说,编程中提到的 lambda 表达式,通常是在需要一个函数,但是又不想费神去命 名一个函数的场合下使用,也就是指匿名函数. 先看它的几个用法: map( lambda x: x*x, [y f ... 
- Python - 使用Pyinstaller将Python代码生成可执行文件
			1 - Pyinstaller简介 Home-page: http://www.pyinstaller.org PyInstaller是一个能够在多系统平台(Windows.*NIX.Mac OS)上 ... 
- [转]KMP算法理解及java实现
			这大概是我看的最好懂的KMP算法讲解了,不过我还只弄懂了大概思想,算法实现我到时候用java实现一遍 出处:知乎 https://www.zhihu.com/question/21923021/ans ... 
- zabbix报错cannot set resource limit: [13] Permission denied解决方法
			zabbix-server启动时出现以下错误: 2912:20180326:050930.023 using configuration file: /etc/zabbix/zabbix_server ... 
- underscore.js源码解析【集合】
			// Collection Functions // -------------------- // The cornerstone, an `each` implementation, aka `f ... 
- DevExpress GridControl小结
			1. 如何解决单击记录整行选中的问题 View->OptionsBehavior->EditorShowMode 设置为:Click 2. 如何新增一条记录 (1).gridView.Ad ... 
- SQL 必知必会·笔记<9>使用子查询
			子查询(subquery),即嵌套在其他查询中的查询. 1. 利用子查询进行过滤 SELECT 语句中,子查询总是从内向外处理.示例: SELECT cust_name, cust_contact F ... 
- SpringBoot---静态页面加载
			Thymeleaf模板配置: maven添加支持如下: <dependency> <groupId>org.springframework.boot</groupId&g ... 
