网站建设工作安排方案,注册公司名称查询,腾讯企点怎么改名字,梧州网站建设有哪些前言 在前面我们已经了解了#xff0c;mybatis 的基本用法#xff0c;动态SQL#xff0c;学会使用mybatis 来操作数据库。但这些主要操作还是针对 单表实现的。在实际的开发中#xff0c;对数据库的操作#xff0c;常常涉及多张表。 因此本篇博客的目标#xff1a;通过my…前言 在前面我们已经了解了mybatis 的基本用法动态SQL学会使用mybatis 来操作数据库。但这些主要操作还是针对 单表实现的。在实际的开发中对数据库的操作常常涉及多张表。 因此本篇博客的目标通过mybatis 提供的关联映射建立表与表之间的关系实现多表的数据操作。 关联映射的概述
在关系型数据库中表与表之间存在3 种关联映射关系分别是 一对一一对多/多对一和多对多 1. 一对一One-to-One 一对一关系是指一个表中的每个记录与另一个表中的一个记录相关联且这种关联是唯一的。例如 一个学生只能有一个学生证一个学生证只属于一个学生。 一个用户只能有一个个人资料一个个人资料只属于一个用户。 在数据库设计中一对一关系可以通过以下方式实现 主键关联将一个表的主键作为外键放在另一个表中。 联合主键将两个表的主键合并为一个联合主键存储在一张表中。 2. 一对多/多对一One-to-Many/Many-to-One 一对多关系是指一个表中的一个记录可以与另一个表中的多个记录相关联而另一个表中的每个记录只能与第一个表中的一个记录相关联。例如 一个部门可以有多个员工但每个员工只能属于一个部门。 一个作者可以写多本书但每本书只能由一个作者创作。 在数据库设计中一对多关系通常通过外键来实现 在“多”的一方的表中添加一个外键字段指向“一”的一方的主键字段。 3. 多对多Many-to-Many 多对多关系是指一个表中的多个记录可以与另一个表中的多个记录相关联。例如 一个学生可以选修多门课程一门课程也可以被多个学生选修。 一个作者可以写多本书一本书也可以由多个作者共同创作。 注意 在数据库设计中多对多关系通常通过一个**关联表中间表**来实现 关联表包含两个表的主键作为外键字段用于建立多对多关系。 例如对于学生和课程的多对多关系可以创建一个选课表包含学生ID和课程ID作为外键字段。 一对一查询
应用场景 例如 表示 一个人 只能有一个身份证同时一个身份证也只对应一个人 重点 在学习 一对一查询 时核心是学习使用 association元素 来处理 一对 对关联关系。 association元素 提供了一系列 属性用于维护数据表之间的关系 association元素 常用的属性
属性说明property用于指定映射到的实体类的属性与表字段一一对应Column用于指定表中的对应的字段javaType用于指定映射到实体对象的属性jdbcType用于指定数据表中对应的字段类型fetchType用于指定在关联查询时是否启用延迟加载。fetchType属性 有lazy,eager两个属性值默认为lazy默认关联映射延迟加载select用于指定引入嵌套查询的子SQL语句该属性用于关联映射的前提查询autoMapper用于指定是否自动映射typeHander用于指定一个类型处理器
association元素 是resultMap元素的子元素它有两种配置方式 嵌套查询方式嵌套结果方式。 嵌套查询方式嵌套结果方式的区别 我理解 嵌套查询方式是多步走而不是一步到位。例如 你写一个 复合sql语句【相当于sql 嵌套着其他的sql 语句】去查表中的数据现在是把这个sql 语句拆开通过表之间的关系 一个个去查最好得到结果。 样例 !-- 嵌套查询方式--association propertycard columncard_id javaTypefs.pojo.IdCard selectfs.mapper.IdCardMapper.findCodeById/ 嵌套结果方式则是一步到位。通过使用一个复合的sql 语句【相当于sql 嵌套着其他的sql 语句】得到最终结果。 样例 !-- 嵌套结果查询--association propertycard javaTypefs.pojo.IdCard id propertyid columncard_id/result propertycode columnCODE//association demo案例
项目准备 数据库中 tb_person 表tb_idcard 表 实体类 IdCard 类Person 类 mybatis -config 配置文件
?xml version1.0 encodingUTF-8 ?
!DOCTYPE configurationPUBLIC -//mybatis.org//DTD Config 3.0//ENhttp://mybatis.org/dtd/mybatis-3-config.dtd
configurationproperties resourcedb.properties/properties settings!-- environment 是一个环境里面包含一个事务管理器一个数据源 --environments defaultdevelopmentenvironment iddevelopmenttransactionManager typeJDBC/transactionManagerdataSource typePOOLED!-- 配置数据源信息主要有 数据库驱动数据库连接地址数据库用户名数据库密码等 --property namedriver value${driverClass}/propertyproperty nameurl value${jdbcUrl}/propertyproperty nameusername value${username}/propertyproperty namepassword value${password}/property/dataSource/environment/environmentsmappers!-- 使用mapper 标签 指定mapper映射文件--mapper resourcemapper/PersonMapper.xml/mapper resourcemapper/IdCardMapper.xml/mapper resourcemapper/UserMapper.xml/mapper resourcemapper/OrdersMapper.xml/mapper resourcemapper/ProductMapper.xml//mappers
/configuration问题当输入 id1时查询person 人的具体信息包括个人身份证信息 PersonMapper 接口 // 根据id查询Person findPersonById(Integer id);Person findPersonById2(Integer id);
PersonMapper.xml 映射文件
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacefs.mapper.PersonMapper
// 需要针对 数据库做的操作【查询修改删除插入】
/mapper 嵌套查询方式【多步到位】
select idfindPersonById parameterTypeint resultMapcardselect * from tb_person where id #{id}
/selectresultMap idcard typefs.pojo.Personid propertyid columnid/result propertyname columnname/result propertysex columnsex/result propertyage columnage/
!-- 嵌套查询方式--association propertycard columncard_id javaTypefs.pojo.IdCardselectfs.mapper.IdCardMapper.findCodeById//resultMap 嵌套查询方式 接口的findCodeById 方法和IdCardMapper.xml映射文件
接口的findCodeById 方法 IdCardMapper.xml映射文件 嵌套结果方式【一步到位】 select idfindPersonById2 parameterTypeint resultMapcard2select p.*, c.code from tb_person p , tb_idcard c where p.id #{id} and p.card_id c.id/selectresultMap idcard2 typefs.pojo.Personid propertyid columnid/result propertyname columnname/result propertysex columnsex/result propertyage columnage/
!-- 嵌套结果查询--association propertycard javaTypefs.pojo.IdCard id propertyid columncard_id/result propertycode columnCODE//association/resultMap 一对多查询
应用场景 与一对一的关联相比更多关联关系是一对多(或多对一例如 一个用户 可以有多个订单多个订单也可以归一个用户所有。 重点使用collection元素来处理一对多关联关系。
collection元素 和association元素的关系 1 collection元素 的属性 大部分与 association 元素 相同但其还包含一个特殊属性--ofType ofType 与javaType属性相对应用于指定实体类对象中集合类属性所包含的元素类型【集合中存储的实体类对象类型】 2 与 association 元素 相同 也是resultMap元素的子元素collection 元素 也嵌套查询和嵌套结果两者配置方式 demo(案例
项目准备 数据库 中 tb_user用户表 tb_order 订单表 实体类 User 用户 类Orders订单类 问题当输入用户 id1时获得 该用户所有的订单情况 UserMapper接口
package fs.mapper;import fs.pojo.User;public interface UserMapper {User findUserWithOrders(Integer id);
}UserMapper.xml 映射文件 嵌套结果查询方式【一步到位】
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacefs.mapper.UserMapperselect idfindUserWithOrders parameterTypeint resultMapordersselect u.*,o.id as orders_id,o.number from tb_user u, tb_orders owhere u.id o.user_id and u.id #{id}/selectresultMap idorders typefs.pojo.Userid propertyid columnid/result propertyusername columnusername/result propertyaddress columnaddress/collection propertyorders ofTypefs.pojo.Ordersid propertyid columnorders_id/result propertynumber columnnumber//collection/resultMap
/mapper 多对多查询
应用场景 多对多查询 和一对多查询在现实生活也是非常常见的。以订单和商品为例一个订单可以包含多种商品而一种商品又可以属于多种订单中订单和商品就是典型的多对多的关系。 重点使用collection元素来处理多对多关联关系。
demo(案例
项目准备 数据库中 tb_orders 订单表 tb_product 商品表 中间表 tb_ordersitem 实体类 Product用户 类Orders订单类 问题当输入 订单 id1 时查询 该订单中所有的商品信息 OrderMapper 接口
package fs.mapper;import fs.pojo.Orders;
public interface OrdersMapper {
Orders findOrdersWithProduct(Integer id);Orders findOrdersWithProduct1(Integer id);
}OrderMapper 映射文件
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacefs.mapper.OrdersMapper
// 各自数据库的操作
/mapper
嵌套查询方式【多步到位】 select idfindOrdersWithProduct1 parameterTypeint resultMapordersselect * from tb_orders where id#{id};/selectresultMap idorders typefs.pojo.Ordersid propertyid columnid/result propertynumber columnnumber/collection propertyproductList columnid ofTypefs.pojo.Product selectfs.mapper.ProductMapper.findProductById/collection/resultMap 嵌套查询方式 接口的findProductById 方法和ProductMapper.xml映射文件
ProductMapper 接口 ProductMapper.xml 映射文件 嵌套结果方式【一步到位】
没有给 tb_product 表的 id 字段 添加别名为 pid 之前
产生问题 当两者关联的表存在相同的字段时在执行sql 查询 后会因为tb_order表的id 字段和tb_product 的 id字段 相同导致 查询结果在映射到product 实体类对象时后面的product 对象始终会把前面的product 对象覆盖掉。本来应该查询多个 product对象信息但最好打印只有 1个【最好一个product对象信息】 运行截图 如果给 tb_product 表的 id 字段 添加别名 或者 给 tb_orders 表 的 id 字段添加别名
在这里我是给 tb_product 表的 id 字段 添加别名 为 pid 运行截图 最好确实出现了3 个product 对象的具体信息