【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的多对多实例
在完成了一对多的实例的基础上,继续做多对多实例.例子是老师和学生,一个老师教多个学生,一个学生也有多个老师. 文档结构如图:
随机推荐
- 冲刺博客NO.10
今天做了什么:将程序整合到一起,出现了不少小错误,但是在讨论后都解决了. 遇到的难题:没遇到什么大困难
- Hessian 使用例子
一.协议包(数据对象需要实现序列化接口,可以用于服务端接口.客户端调用服务之用) /** * */ package com.junge.demo.protocol.model; import java ...
- Windows 系统 IP 和端口的相关检测命令
查看本机IP地址 查看自己电脑的ip,使用 ipconfig 命令 ipconfig 检测指定IP是否联通 检测某个ip是否可以连通,直接使用 ping 命令 ping 219.148.111.212 ...
- 三种方法在当前目录下打开cmd命令窗口
概述 运行npm的时候,每次都要cd到目录,很麻烦,所以总结了三种在当前目录下直接打开cmd窗口的方法,供以后开发时参考,相信对其他人也有用. 方法一 在当前目录按住shift再右键. 会看到右键菜单 ...
- C++primer笔记之顺序容器
最近又重新拾起C++primer,发现每一次看都会有不同的体验,但每一次看后因为不常用,忘记得很快,所以记笔记是很关键的一环,咋一看是浪费时间,实际上是节省了很多时间.下面就把这一节的内容做一个简单的 ...
- Servlet-生命周期简介
Servlet生命周期可分为5个步骤 加载Servlet.当Tomcat第一次访问Servlet的时候,Tomcat会负责创建Servlet的实例 初始化.当Servlet被实例化后,Tomcat会调 ...
- Python模块——subprocess
subprocess模块 通过Python去执行一条系统命令或脚本. 三种执行命令的方法 subprocess.run(*popenargs, input=None, timeout=None, ch ...
- Java language
1.Java开发环境: java编译运行过程: 1. 编译期:.java源文件,经过编译,生成.class字节码文件 2. 运行期:JVM加载.class并运行.class - 特点:跨平台.一次编程 ...
- [原创]Struts2奇葩环境任意文件上传工具(解决菜刀无法传文件或上传乱码等问题)
上面这问题问得好 1 不知道大家有没碰到有些Strus2站点 上传JSP后访问404 或者503 注意我说的是404或503不是403(要是403换个css/img等目录或许可以) 但 ...
- welcome-file-list修改后不生效
用别的浏览器重新尝试一下,或者清缓存.我就是这样解决的.值得注意的就是,<welcome-file>里面指定的文件可以是.do或者是action.