Mybatis实现一对一一对多数据插入数据实验报告.docx
- 文档编号:25528791
- 上传时间:2023-06-09
- 格式:DOCX
- 页数:14
- 大小:891.99KB
Mybatis实现一对一一对多数据插入数据实验报告.docx
《Mybatis实现一对一一对多数据插入数据实验报告.docx》由会员分享,可在线阅读,更多相关《Mybatis实现一对一一对多数据插入数据实验报告.docx(14页珍藏版)》请在冰豆网上搜索。
Mybatis实现一对一一对多数据插入数据实验报告
Mybatis实现一对一,一对多数据插入数据
Mybatis实现一对一和一对多关系
项目结构图
环境:
开发工具:
Intellijidea2018.3版本
JDK:
1.8
数据库:
Mysql8.0.11
Mybatis:
3.4.1
1. 一对一关系和一对多关系
∙什么关系属于一对一
一个身份证对应着一个公民,一个公民也对应着一张身份证
∙一对一的建表原则:
两种对应方式:
唯一外键对应:
在任意一方加一个外键,然后加个unique约束条件。
本文中采用这种
主键对应:
就是主键对主键
∙什么样关系属于一对多?
一个用户对应多个订单,一个订单只能属于一个用户
一个客户对应多个联系人,一个联系人只能属于某一个客户。
∙一对多的建表原则:
在多的一方创建外键指向一的一方的主键
这里用到的是两张表,订单表(Orders)和用户表(User)。
一个订单对应一个用户,一个用户可以对应着多个订单。
虽然这是一对多关系,但是如果从订单角度看,一个订单只能对应一个用户。
勉强可以算作一对一,本文中为了缩减代码量,就直接用两个表演示一对一和一对多。
创建两张表
创建User表,插入三条数据
1.
创建Orders表,插入两条数据
创建工程
可以创建java工程也可以创建javaEE项目,反正测试使用Junit
导入jar包:
创建实体类
创建Order实体类
根据一对一的实体类原则,在没有外键的一方实体类中包含外键一方的对象 , 因此Order类中要有User的对象
创建User类
根据一对多的建立实体类的原则,在没有外键的一方(user)的实体类创建另一方的List集合(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。
具体可查看我另一篇文章
2.我们的查询条件有两个,一个是通过order_id查询用户信息,第二是通过外键查询用户信息。
因此在sql语句中查询条件是o.user_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文件中
创建接口类:
OrderMapper
测试类:
MapperTest
实现一对多
需求:
通过输入用户id查询多个订单信息,用户信息也要返回
实现思路:
根据一对多建表原则(在order创建外键指向user的主键),通过order的外键确定要查找的唯一用户和至少一个的订单的关系,再根据一对多建实体类的原则,在user实体类中有order的List
创建userMapper接口类:
创建userMapper.xml
创建测试方法:
测试结果:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Mybatis 实现 一对一 一对 多数 插入 数据 实验 报告