1、一对一


我们以用户表 user 和订单表 orders 为例。设定一个订单只能由一个 用户创建,那么由订单到用户就是一对一的关系。

①、创建用户表 user 和订单表 orders

  用户表 user

②、创建项目工程,导入相应的 jar 包

 ③、创建实体类

User.java

package com.ys.po;public class User {//用户IDprivate int id;//用户姓名private String username;//用户性别private String sex;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}@Overridepublic String toString() {return "User [id=" + id + ", username=" + username + ", sex=" + sex+ "]";}
}

 Orders.java

package com.ys.po;public class Orders {//订单IDprivate int id;//用户IDprivate int userId;//订单数量private String number;//和用户表构成一对一的关系,即一个订单只能由一个用户创建private User user;public int getId() {return id;}public void setId(int id) {this.id = id;}public int getUserId() {return userId;}public void setUserId(int userId) {this.userId = userId;}public String getNumber() {return number;}public void setNumber(String number) {this.number = number;}public User getUser() {return user;}public void setUser(User user) {this.user = user;}@Overridepublic String toString() {return "Orders [id=" + id + ", userId=" + userId + ", number=" + number+ ", user=" + user + "]";}}

④、创建 OrderMapper 接口和 OrderMapper.xml 文件

由于我们采用 Mapper 代理加载 xxxMapper.xml 文件,这里我们重复一下 Mapper 代理所需的条件,接口和xml文件必须满足以下几个条件:

  1、接口必须要和 xml 文件同名且在同一个包下,也就是说 xml 文件中的namespace是接口的全类名  

  2、接口中的方法名和xml 文件中定义的 id 一致

  3、接口输入参数类型要和xml 中定义的 parameterType 一致

  4、接口返回数据类型要和xml 中定义的 resultType 一致

OrderMapper 接口:

package one.to.one.mapper;import com.ys.po.Orders;
import com.ys.po.User;public interface OrdersMapper {/*** 方式一:嵌套结果* select * from orders o,user u where o.user_id=u.id and o.id=#{id}* @param orderId* @return*///根据订单ID查询订单和用户信息public Orders selectOrderAndUserByOrderID(int orderId);/*** 方式二:嵌套查询* select * from order WHERE id=1;//得到user_id* select * from user WHERE id=1   //1 是上一个查询得到的user_id的值* @param userID* @return*///根据订单ID得到订单信息(包含user_id)public Orders getOrderByOrderId(int orderId);//根据用户ID查询用户信息public User getUserByUserId(int userID);}

OrderMapper .xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="one.to.one.mapper.OrdersMapper"><!--嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集封装联表查询的数据(去除重复的数据)select * from orders o,user u where o.user_id=u.id and o.id=#{id}--><select id="selectOrderAndUserByOrderID" resultMap="getOrderAndUser">select * from orders o,user u where o.user_id=u.id and o.id=#{id}</select><resultMap type="com.ys.po.Orders" id="getOrderAndUser"><!--id:指定查询列表唯一标识,如果有多个唯一标识,则配置多个idcolumn:数据库对应的列property:实体类对应的属性名--><id column="id" property="id"/><result column="user_id" property="userId"/><result column="number" property="number"/><!--association:用于映射关联查询单个对象的信息property:实体类对应的属性名javaType:实体类对应的全类名--><association property="user" javaType="com.ys.po.User"><!--id:指定查询列表唯一标识,如果有多个唯一标识,则配置多个idcolumn:数据库对应的列property:实体类对应的属性名--><id column="id" property="id"/><result column="username" property="username"/><result column="sex" property="sex"/></association></resultMap><!--方式二:嵌套查询:通过执行另外一个SQL映射语句来返回预期的复杂类型select user_id from order WHERE id=1;//得到user_idselect * from user WHERE id=1   //1 是上一个查询得到的user_id的值property:别名(属性名)    column:列名 --><select id="getOrderByOrderId" resultMap="getOrderMap">select * from order where id=#{id}</select><resultMap type="com.ys.po.Orders" id="getOrderMap"><id column="id" property="id"/><result column="number" property="number"/><association property="userId"  column="id" select="getUserByUserId"></association></resultMap><select id="getUserByUserId" resultType="com.ys.po.User">select * from user where id=#{id}</select></mapper>

⑤、向 mybatis-configuration.xml 配置文件中注册 OrderMapper.xml 文件

<?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>
<!-- 定义别名 -->
<typeAliases><!-- mybatis自动扫描包中的po类,自动定义别名,别名是类名(首字母大写或小写都可以,一般用小写) --><package name="com.ys.po"/>
</typeAliases><environments default="development"><environment id="development"><transactionManager type="JDBC"/><!--dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象源  --><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><mappers><!-- 通过OrdersMapper接口注册OrdersMapper.xml文件,必须保证:接口和xml在同一个包下,而且名字一样OrdersMapper接口的方法名和OrdersMapper.xml文件的id一样OrdersMapper接口的输出输出参数和OrdersMapper.xml文件resultType,parameterType类型一样--><mapper class="one.to.one.mapper.OrdersMapper"/></mappers>
</configuration>

⑥、测试

package one.to.one.mapper;import java.io.InputStream;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 com.ys.po.Orders;public class OneToOneTest {//定义 SqlSessionSqlSession session =null;@Beforepublic void init(){//定义mybatis全局配置文件String resource = "mybatis-configuration.xml";//加载 mybatis 全局配置文件InputStream inputStream = OneToOneTest.class.getClassLoader().getResourceAsStream(resource);//构建sqlSession的工厂SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//根据 sqlSessionFactory 产生 sessionsession = sessionFactory.openSession();}/*** 方式一:嵌套结果* select * from orders o,user u where o.user_id=u.id and o.id=#{id}*/@Testpublic void testSelectOrderAndUserByOrderId(){String statement = "one.to.one.mapper.OrdersMapper.selectOrderAndUserByOrderID";//创建OrdersMapper对象,mybatis自动生成mapepr代理对象OrdersMapper orderMapper = session.getMapper(OrdersMapper.class);Orders order = orderMapper.selectOrderAndUserByOrderID(1);System.out.println(order);session.close();}/*** 方式二:嵌套查询* select * from order WHERE id=1;//得到user_id* select * from user WHERE id=1   //1 是上一个查询得到的user_id的值*/@Testpublic void testgetOrderByOrderId(){String statement = "one.to.one.mapper.OrdersMapper.getOrderByOrderId";//创建OrdersMapper对象,mybatis自动生成mapepr代理对象OrdersMapper orderMapper = session.getMapper(OrdersMapper.class);Orders order = orderMapper.selectOrderAndUserByOrderID(1);System.out.println(order);session.close();}
}

2、一对多


还是以用户表 user 和 订单表 orders 为例,一个用户能创建多个订单。故用户和订单构成一对多的关联。

  我们在 user.java 中添加一个属性 public List<Orders> orders;

①、创建实体类

  user.java如下,orders.java保持不变

package com.ys.po;import java.util.List;public class User {//用户IDprivate int id;//用户姓名private String username;//用户性别private String sex;//一个用户能创建多个订单,用户和订单构成一对多的关系public List<Orders> orders;public List<Orders> getOrders() {return orders;}public void setOrders(List<Orders> orders) {this.orders = orders;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}@Overridepublic String toString() {return "User [id=" + id + ", username=" + username + ", sex=" + sex+ "]";}
}

②、创建 UserMapper 接口和 UserMapper.xml 文件

UserMapper接口:

package one.to.many.mapper;import com.ys.po.User;public interface UserMapper {//根据用户id查询用户信息,以及用户下面的所有订单信息public User selectUserAndOrdersByUserId(int UserId);}

UserMapper.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="one.to.many.mapper.UserMapper"><!--方式一:嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集封装联表查询的数据(去除重复的数据)select * from user u,orders o where u.id=o.user_id and u.id=#{id}--><select id="selectUserAndOrdersByUserId" resultMap="getUserAndOrders">select u.*,o.id oid,o.number number from user u,orders o where u.id=o.user_id and u.id=#{id}</select><resultMap type="com.ys.po.User" id="getUserAndOrders"><!--id:指定查询列表唯一标识,如果有多个唯一标识,则配置多个idcolumn:数据库对应的列property:实体类对应的属性名 --><id column="id" property="id"/><result column="username" property="username"/><result column="sex" property="sex"/><!--property:实体类中定义的属性名ofType:指定映射到集合中的全类名--><collection property="orders" ofType="com.ys.po.Orders"><id column="oid" property="id"/><result column="number" property="number"/></collection></resultMap>
</mapper>

③、向 mybatis-configuration.xml 配置文件中注册 UserMapper.xml 文件

、测试

@Test
public void testSelectOrderAndUserByOrderId(){String statement = "one.to.many.mapper.UserMapper.selectUserAndOrdersByUserId";//创建OrdersMapper对象,mybatis自动生成mapepr代理对象UserMapper userMapper = session.getMapper(UserMapper.class);User user = userMapper.selectUserAndOrdersByUserId(1);System.out.println(user.getOrders().size());session.close();
}

3、多对多


这里我们以用户 user 表和 角色role 表为例,假定一个用户能被分配成多重角色,而一种角色也能分给多个用户,故用户和角色构成多对多的关系。

  需求:给定角色id,查询这个角色所属的所有用户信息

①、在数据库中建立相应的表

  user 表和上面的保持不变

  role 表

②、建立对应的实体类

  User.java

Role.java

package com.ys.po;import java.util.List;public class Role {private int id;private String name;private List<User> users;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 List<User> getUsers() {return users;}public void setUsers(List<User> users) {this.users = users;}}

User_Role.java

package com.ys.po;public class User_Role {private User user;private Role role;public User getUser() {return user;}public void setUser(User user) {this.user = user;}public Role getRole() {return role;}public void setRole(Role role) {this.role = role;}
}

、创建 UserMapper 接口和 UserMapper.xml 文件

  UserMapper 接口

package many.to.many.mapper;import java.util.List;import com.ys.po.User;public interface UserMapper {//给定一个角色id,要得到具有这个角色的所有用户信息public List<User> getUserByRoleId(int roleId);}

UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="many.to.many.mapper.UserMapper"><select id="getUserByRoleId" resultMap="getUserMap">select * from user_role ur,user u where ur.user_id=u.id and ur.role_id=#{id}</select><resultMap type="com.ys.po.User" id="getUserMap"><id column="id" property="id"/><result column="username" property="username"/><result column="sex" property="sex"/></resultMap>
</mapper>

④、向 mybatis-configuration.xml 配置文件中注册 UserMapper.xml 文件

⑤、测试

@Test
public void testGetUserByRoleId(){String statement = "many.to.many.mapper.UserMapper.getUserByRoleId";//创建OrdersMapper对象,mybatis自动生成mapepr代理对象UserMapper userMapper = session.getMapper(UserMapper.class);List<User> users = userMapper.getUserByRoleId(1);session.close();
}

多对多主要是关联关系要找好,然后根据关联去查询。

mybatis--一对一、一对多、多对多(七)相关推荐

  1. mybatis的一对一 一对多 多对多

    mybatis的一对一 一对多 多对多 1.表 2.建表语句 order_t表 CREATE TABLE `order_t` ( `id` int(11) NOT NULL, `user_id` in ...

  2. 7. MyBatis多表查询 - 一对一 - 一对多 - 多对多

    7. MyBatis多表查询 - 一对一 - 一对多 - 多对多 前言 在前面的篇章,我们已经熟悉了单表查询,下面我们来看看如何进行 多表查询. 数据准备 create database if not ...

  3. SQLAlchemy_定义(一对一/一对多/多对多)关系

    SQLAlchemy_定义(一对一/一对多/多对多)关系 目录 Basic Relationship Patterns One To Many One To One Many To Many Basi ...

  4. Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作

    Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作,单表查询,多表查询 一丶表与表之间的关系 背景: ​ ​ ​  ​ ​ 由于如果只使用一张表存储所有的数据,就会操作数 ...

  5. day 69-70 一对一 一对多 多对一联表查询

    day 69 orm操作之表关系,多对多,多对一多对一/一对多,多对多{类中的定义方法}day691. 昨日内容回顾1. 单表增删改查2. 单表查询API返回QuerySet对象的:1. .all() ...

  6. JPA 一对一 一对多 多对一 多对多配置

    1 JPA概述 1.1 JPA是什么 JPA (Java Persistence API) Java持久化API.是一套Sun公司 Java官方制定的ORM 方案,是规范,是标准 ,sun公司自己并没 ...

  7. Django一对一 ,一对多,多对多

    Django 数据库一对多,多对多 目录 app01/models.py app01/views.py app01/urls.py Python_Django/urls.py 目录 app01/mod ...

  8. Mybatis中的关系映射(一对一,一对多,多对多)

    在网上寻了很久,大多数讲关系性的文章都是大篇幅的去将表照搬上来,本来就很生硬,此文就不在讲述关系性映射的具体实现,转而从浅层来讲讲其概念性. 1.1 关联关系概述 在关系型数据库中,多表之间存在着三种 ...

  9. 初学者易上手的SSH-hibernate04 一对一 一对多 多对多

    这章我们就来学习下hibernate的关系关联,即一对一(one-to-one),一对多(one-to-many),多对多(many-to-many).这章也将是hibernate的最后一章了,用于初 ...

  10. JAVA日记之mybatis-3一对一,一对多,多对多xml与注解配置 ----喝最烈的酒.

    1.Mybatis多表查询 1.1 一对一查询 1.1.1 一对一查询的模型 用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户 一对一查询的需求:查询一个订单,与此同时查询出该订单 ...

最新文章

  1. 如何运用NLP向个性类型客户介绍产品
  2. mapper命名规范_Mybatis系列全解(五):全网最全!详解Mybatis的Mapper映射文件
  3. ESP32-C3的性价比到底有多高!乐鑫的布局到底是什么呢?
  4. 分享:wkhtmltoimage开源工具的基本应用
  5. jquery.uploadify参数
  6. python安装失败无法访问_错误:由于环境错误而无法安装包错误:[WinError 5]访问被拒绝:...
  7. IDEA 终于支持中文版和 JDK 直接下载了(太方便了)附新版介绍视频
  8. spring boot中的注解
  9. dls 深度受限搜索java_JAVA深入学习(栈和队列)之栈
  10. yolov4-tiny目标检测模型实战——学生姿势行为检测
  11. c语言:新颖的进制灵活应用
  12. swfupload 实例 php,文件上传之SWFUpload插件(代码)_php实例
  13. CentOS7安装Pentaho Server 8.1 CE 社区版
  14. discuz X程序目录和文件列表 详细中文说明
  15. 天田AMADA数控折弯机触摸屏维修RGM21003主机电路板维修
  16. TalkingData:未来10年是大数据价值变现的阶段
  17. win7系统提示计算机内存不足,win7电脑提示计算机内存不足怎么办
  18. 编程之美-1.3-烙饼排序问题
  19. 酒店无线wifi覆盖方案
  20. Python+scrapy爬取36氪网

热门文章

  1. 矢量图和Word:EPS,PDF,EMF和SVG
  2. 防盗链IHttpHandler
  3. wsdl接口_DEBUG系列四:第三方接口debug
  4. python人脸识别门禁系统毕设_人脸识别门禁系统 毕业设计 可移植树莓派
  5. mysql 目录更改 php_树莓派搭建LAMP,然后更改根目录
  6. 读保护_GD32VF103之片上flash读、写、擦除
  7. 2dpca的matlab代码,2DPCA人脸识别的matlab代码
  8. 收文处理和发文处理的环节_公文处理,如何提速增效
  9. android自定义队列,Android 消息机制(一)消息队列的创建与循环的开始 Looper与MessageQueue...
  10. 设计灵感|展览海报如何编排?