MyBatis高级映射(一对一、一对多、多对多、延迟加载)

本文详细介绍了MyBatis中的一对一、一对多、多对多映射的实现,包括resultType和resultMap的使用,并探讨了延迟加载的概念和配置,通过实例解析了数据库表间的关系和业务场景。
摘要由CSDN通过智能技术生成

MyBatis高级映射

一、入门准备:订单商品数据模型分析


1. 数据模型分析思路

    a.每张表记录的数据内容

         分模块对每张表记录的内容进行熟悉,相当 于你学习系统 需求(功能)的过程。

    b.每张表重要的字段设置

         非空字段、外键字段

    c.数据库级别表与表之间的关系

         外键关系

4、    d.表与表之间的业务关系

         在分析表与表之间的业务关系时一定要建立 在某个业务意义基础上去分析

2.数据模型分析

    

3. 数据库表之间有外键关系的业务关系

    user和orders:

        user---->orders:一个用户可以创建多个订单,一对多

        orders--->user:一个订单只由一个用户创建,一对一

    orders和orderdetail:

       orders-àorderdetail:一个订单可以包括 多个订单明细,因为一个订单可以购买多个商品,每个商品的

        购    买信息在orderdetail记录,一对多关系

        orderdetail--> orders:一个订单明细只能包括在一个订单中,一对一

    orderdetail和itesm:

        orderdetail---》itesms:一个订单明细只对应一个商品信息,一对一

        items--> orderdetail:一个商品可以包括在多个订单明细 ,一对多

4. 数据库表之间没有外键关系的业务关系

Orders和items:

    这两张表没有直接的外键关系,通过业务及数据库的间接关系分析出它们是多对多的关系

    Ordersà orderdetail–>items:一个订单可以有多个订单明细,一个订单明细对应一个商品,所以一个订单对 应多个商品

    Items-àorderdetailàorders:一个商品可以对应多个订单明细,一个订单明细对应一个订单,所以一个商品对应多个订单

User和items:

    这两张表没有直接的外键关系,通过业务及数据库的间接关系分析出它们是多对多的关系

    Useràordersàorderdetailàitems:一个用户有多个订单,一个订单有多个订单明细、一个订单明细对应一个商品,所以一个用户对应多个商品

    Itemsàorderdetailàordersàuser:一个商品对应多个订单明细,一个订单明细对应一个订单,一个订单对应一个用户,所以一个商品对应多个用户

二、一对一查询

准备工作:

创建java工程导入jar包


① SQL语句

SELECT 
  orders.*,
  USER.username,
  USER.sex,
  USER.address 
FROM
  orders,
  USER 
WHERE orders.user_id = user.id

② 日志文件:log4j.properties

# Global logging configuration
#\u5728\u5f00\u53d1\u73af\u5883\u4e0b\u65e5\u5fd7\u7ea7\u522b\u8981\u8bbe\u7f6e\u6210DEBUG\uff0c\u751f\u4ea7\u73af\u5883\u8bbe\u7f6e\u6210info\u6216error
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

③ MyBatis配置文件:SqlMapConfig.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中还可以配置一些属性名和属性值  -->
		<!-- <property name="jdbc.driver" value=""/> -->
	</properties>
	<typeAliases>
		<!-- 批量别名定义 
		指定包名,mybatis自动扫描包中的po类,自动定义别名,别名就是类名(首字母大写或小写都可以)
		-->
		<package name="com.cjw.mybatis.po"/>
		
	</typeAliases>
	
	<!-- 和spring整合后 environments配置将废除-->
	<environments default="development">
		<environment id="development">
		<!-- 使用jdbc事务管理,事务控制由mybatis-->
			<transactionManager type="JDBC" />
		<!-- 数据库连接池,由mybatis管理-->
			<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>
		<!-- 批量加载mapper
		指定mapper接口的包名,mybatis自动扫描包下边所有mapper接口进行加载
		遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录 中
		上边规范的前提是:使用的是mapper代理方法
		 -->
		<package name="com.cjw.mybatis.mapper"/>

	</mappers>
	
</configuration>

④ 数据库原型文件:db.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=root

1. resultType实现一对一查询


1.1 创建PO类:Orders.java

public class Orders {

	private Integer id;
	private Integer userId;
	private String number;
	private Date createtime;
	private String note;

1.2 扩展PO类:OrdersCustomer.java

复杂查询时,单表对应的po类已不能满足输出结果集的映射。

所以要根据需求建立一个扩展类来作为resultType的类型。

/**
 * 通过此类映射订单和用户查询的结果,让此类继承包括 字段较多的pojo类
 * @author DreamWF
 *
 */
public class OrdersCustomer extends Orders{
	
	private String username;
	private String sex;

1.3 建立Mapper代理接口:OrdersMapperCustomer.java

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值