Mybatis实现一对一,一对多数据插入数据实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Mybatis实现一对一,一对多数据插入

数据

Mybatis实现一对一和一对多关系

项目结构图

环境:

开发工具:Intellij idea 2018.3版本

JDK:1.8

数据库:Mysql 8.0.11

Mybatis:3.4.1

1. 一对一关系和一对多关系

•什么关系属于一对一

一个身份证对应着一个公民,一个公民也对应着一张身份证•一对一的建表原则:

两种对应方式:

唯一外键对应:在任意一方加一个外键,然后加个unique约束条件。本文中采用这种

主键对应:就是主键对主键

•什么样关系属于一对多?

一个用户对应多个订单,一个订单只能属于一个用户

一个客户对应多个联系人,一个联系人只能属于某一个客户。

•一对多的建表原则:

在多的一方创建外键指向一的一方的主键

这里用到的是两张表,订单表(Orders)和用户表(User)。一个订单对应一个用户,一个用户可以对应着多个订单。虽然这是一对多关系,但是如果从订单角度看,一个订单只能对应一个用户。勉强可以算作一对一,本文中为了缩减代码量,就直接用两个表演示一对一和一对多。

创建两张表

创建User表,插入三条数据

1.

创建Orders表,插入两条数据

创建工程

可以创建java工程也可以创建javaEE项目,反正测试使用Junit 导入jar包:

创建实体类

创建Order实体类

根据一对一的实体类原则,在没有外键的一方实体类中包含外键一方的对象,因此Order 类中要有User的对象

创建User类

根据一对多的建立实体类的原则,在没有外键的一方(user)的实体类创建另一方的List集合(List<order>),因此User类中带有order类的list集合。

创建Mybatis-config.xml文件

MySql.properties配置文件

创建SessionFactory的Util类

实现一对一

需求:使用一对一的查找方式,输入订单id查询订单信息,嵌套用户顺便查询出订单所属的用户信息。在sql映射文件中用resultMap标签输出

实现思路:根据一对一的建表原则,在任意一方(订单表)建立唯一外键指向另一方的主键,确定要查询的唯一订单和唯一用户。再根据一对一建立实体类的原则,在没有外键的一方实体类中包含外键一方的对象,显示时通过这个对象获取到关联的用户信息。

实现过程:sql查询语句中设置两个条件:

条件1 订单的外键user_id =用户的主键id

条件2:订单的主键id=你要查询的值。

结果用resultMap结果集返回,类型是Order型,order实体类中有user对象,因此关联的用户信息就可以从里面获取到(即order.getUser())。实体类时关联了,但是映射的时候还是得指明关联关系,因此需要在resultMap标签中使用association标签指定。

创建订单类的sql映射文件:OrderMapper.xml

1.

select标签:

1.我给两个表的主键id都起了别名,因为两个表的主键都是一样的名称,当你把结果映射到resultMap的时候会出现显示错误的bug。具体可查看我另一篇文章https:///Vibugs/article/details/86540185

2.我们的查询条件有两个,一个是通过order_id查询用户信息,第二是通过外键查询用户信息。因此在sql语句中查询条件是er_id = u.id(即订单表中的user_id 外键= 用户表中的id主键)。但是要插入匹配符#{}的应该是订单的id主键,毕竟我们是通过订单id查询订单信息。

属性:id的值就是OrderMapper接口类的方法名,parameterType是输入的参数,这里

是int型。resultMap:将结果以结果集的形式显示。

SQL语句:这里有两个点需要知道。

resultMap标签:

属性

字段

constructor - 用于在实例化类时,注入结果到构造方法中

idArg - ID 参数;标记出作为ID 的结果可以帮助提高整体性能

arg - 将被注入到构造方法的一个普通结果

id –一个ID 结果;标记出作为ID 的结果可以帮助提高整体性能

result –注入到字段或JavaBean 属性的普通结果

association –一个复杂类型的关联;许多结果将包装成这种类型

嵌套结果映射–关联本身可以是一个resultMap 元素,或者从别处引用一个collection –一个复杂类型的集合

嵌套结果映射–集合本身可以是一个resultMap 元素,或者从别处引用一个discriminator –使用结果值来决定使用哪个resultMap

case –基于某些值的结果映射

嵌套结果映射– case 本身可以是一个resultMap 元素,因此可以具有相同的结构和元素,或者从别处引用一个

本例中两个resultMap的type不一样,select标签指定的oneToOneOrderResultMap是Order 类型的,而association关联的UserMap是User类型的。那输出时怎么输出呢,是输出order 对象还是user对象呢。其实是输出Order对象,我们在Order实体类中不是定义了user对象吗,可以直接通过order.getUser.getXxx()方法输出User信息。

association标签:

这个标签上面代码注释里面有对它几个属性的解释。

记得将OrderMapper.xml导入到Mybatis-config.xml文件中

相关文档
最新文档