文档章节

mybatis学习七 单多表关联

忘川-hsm
 忘川-hsm
发布于 2017/03/29 17:40
字数 688
阅读 16
收藏 0

个人觉得这个功能其实可以不用的,完全可以用连接操作,自己的逻辑清晰就好了 ###1.创建实体类

public class Ticket {
	private Integer ticketId;  
	private String ticketAddress;  
	private Integer ticketPrice;  
	private Integer ticketCId;  
	private Customer customer;//使用一个customer来表示顾客  
    ....

public class Customer {
	private Integer customerId;
	private String customerName;
	private Integer customerTel;
	private List<Ticket> tickets;//使用一个List来表示车票
    ....

###2.编写xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mucfc.model.CustomerMapper">
 <!-- 定义数据库字段与实体对象的映射关系 -->
	<resultMap type="Customer" id="customerBean">
		<id column="customerId" property="customerId"/>
		<result column="customerName" property="customerName"/>
		<result column="customerTel" property="customerTel"/>		
		<!-- 一对多的关系 -->
		<!-- property: 指的是集合属性的值, ofType:指的是集合中元素的类型 -->
		<collection property="tickets" ofType="Ticket">
			<id column="ticketId" property="ticketId"/>
			<result column="ticketAddress" property="ticketAddress"/>
			<result column="ticketPrice" property="ticketPrice"/>
			<result column="ticketCId" property="ticketCId"/>
		</collection>
	</resultMap>	
	
	<!-- 根据id查询Person, 关联将Orders查询出来 -->
	<select id="selectCustomerByName" parameterType="string" resultMap="customerBean">
		select c.*,t.* from t_customer c,t_ticket t  where  c.customerId=t.ticketCId and c.customerName =#{customerName};
	</select>
	
 </mapper>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mucfc.model.TicketMapper">
	<!-- 定义数据库字段与实体对象的映射关系  -->
	<resultMap type="Ticket" id="ticketBean">
		<id column="ticketId" property="ticketId" />
		<result column="ticketAddress" property="ticketAddress" />
		<result column="ticketPrice" property="ticketPrice" />
		<result column="ticketCId" property="ticketCId" />
		<!-- 一对一的关系 -->
		<!-- property: 指的是属性的值, javaType:指的是元素的类型 -->
		<association property="customer" javaType="Customer">
			<id column="customerId" property="customerId" />
			<result column="customerName" property="customerName" />
			<result column="customerTel" property="customerTel" />
		</association>
	</resultMap>
	<!-- 根据id查询ticket, 关联将Customer查询出来 -->
	<select id="selectTicketById" parameterType="int" resultMap="ticketBean">
		select c.*,t.* from t_customer c,t_ticket t where
		c.customerId=t.ticketCId and t.ticketId =#{ticketId}
	</select>
</mapper>

###3.编写总的xml文件 ``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> <!-- 设置别名 --> <typeAliases> <typeAlias alias="Customer" type="com.mucfc.model.Customer"/> <typeAlias alias="Ticket" type="com.mucfc.model.Ticket" /> </typeAliases>

<!-- 配置数据源相关的信息  -->
<environments default="development">
	<environment id="development">
		<transactionManager type="JDBC" />
		<dataSource type="POOLED">
		<property name="driver" value="com.mysql.jdbc.Driver"/>
		 <property name="url" value="jdbc:mysql://192.168.236.131:3306/test?characterEncoding=UTF-8"/> 
		<property name="username" value="root"/> 
		<property name="password" value="1994713"/>  
		</dataSource>
	</environment>
</environments>

<!-- 列出映射文件 -->
<mappers>
	<mapper resource="com/mucfc/model/Customer.xml" />
	<mapper resource="com/mucfc/model/Ticket.xml" /> 
</mappers>

</configuration> ``` ###4.编写测试类 ```java package com.hsm;

import java.io.Reader; import java.util.List;

import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.mucfc.model.Customer; import com.mucfc.model.Ticket;

public class Test { private static SqlSessionFactory sqlSessionFactory; private static Reader reader; static { try { reader = Resources.getResourceAsReader("mybatis-config.xml"); sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); } catch (Exception e) { e.printStackTrace(); } }

/*
 * 一对一关联查询
 */
public static void selectTicketById(int id) {
	SqlSession session = null;
	try {
		session = sqlSessionFactory.openSession();
		Ticket ticket = (Ticket) session.selectOne(
				"com.mucfc.model.TicketMapper.selectTicketById", id);
		if (ticket == null)
			System.out.println("null");
		else {
			System.out.println(ticket);
			System.out.println(ticket.getCustomer());
		}
	} finally {
		session.close();
	}
}

/*
 * 一对多关联查询
 */
public static void selectCustomerByName(String string) {
	SqlSession session = null;
	try {
		session = sqlSessionFactory.openSession();
		Customer customer = (Customer) session
				.selectOne(
						"com.mucfc.model.CustomerMapper.selectCustomerByName",
						string);
		if (customer == null)
			System.out.println("null");
		else {
			System.out.println(customer);
			List<Ticket> tickets = customer.getTickets();
			for (Ticket ticket : tickets) {
				System.out.println(ticket);
			}
		}
	} finally {
		session.close();
	}
}

public static void main(String[] args) {
	System.out.println("==============一对一查询,根据车票来查顾客===============");
	selectTicketById(1);
	System.out.println("==============多对一查询,根据顾客来查车票===============");
	selectCustomerByName("小王");

}

}

© 著作权归作者所有

忘川-hsm
粉丝 8
博文 84
码字总数 50675
作品 0
深圳
程序员
私信 提问
Mybatis应用学习(4)——延迟加载

通过resultMap实现延迟加载 1. 通过resultMap中的子标签association和collection可以实现一对一、一对多、多对多查询,通过还可以通过这两标签实现延迟加载 2. 应用场景:比如查询NoteBook相...

江左煤郎
2018/11/26
21
0
mybatis学习教程中级(八)延迟加载

1 引言 查询数据库时候,尽量使用单表查询提示性能,快啊~但是如果有多表联合和,那就可以使用延迟记载。首先说,在没得余地的情况下试用,是有点优势。 可以简单理解为,只有在使用的时候,...

ycy蓝码
2015/09/10
0
0
MyBatis之使用resultMap实现高级映射

对于数据库中对表的增删改查操作,我们知道增删改都涉及的是单表,而只有查询操作既可以设计到单表操作又可以涉及到多表操作,所以对于输入映射parameterType而言是没有所谓的高级映射的,也...

瑟青豆
2018/06/20
79
0
mybatis学习笔记(13)-延迟加载

mybatis学习笔记(13)-延迟加载 标签: mybatis [TOC] resultMap可以实现高级映射(使用、实现一对一及一对多映射),、具备延迟加载功能。 延迟加载:先从单表查询、需要时再从关联表去关联查...

brianway
2016/03/02
972
3
MyBatis多对多保存示例——MyBatis学习笔记之十七

前几天有网友问到MyBatis多对多的问题,不过愧对网友厚爱的是,最近一直忙,直到现在才有时间处理此事。今天就先写一个多对多保存的示例,算是对这位网友的初步回应,以后会有更多相关的博文...

NashMaster2011
2013/08/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

HashSet和HashMap有什么区别?

HashSet 底层是采用 HashMap 实现,HashSet 的实现比较简单,HashSet 的绝大部分方法都是通过调用 HashMap 的方法来实现 调用 HashSet 的 add 方法时,实际上是向 HashSet 对象内部持有的 Ha...

ConstXiong
3分钟前
1
0
击穿JVM虚拟机

什么是JVM虚拟机 首先我们需要了解什么是虚拟机,为什么虚拟机可以实现夸平台,虚拟机在计算机中扮演一个什么样的角色。 (从下向上看) 看上图的操作系统与虚拟机层,可以看到,JVM是在操作...

兜兜毛毛
10分钟前
2
0
OpenNMS 利用 Sentinel处理Netflow(流量流向分析)

准备环境 CentOS-7-x86_64 Java8 OpenNMS 23.0.4 minion-23.0.4 sentinel-23.0.4 elasticsearch-6.7.1.tar.gz OpenNMS 配置 1 配置ActiveMQ vi $OPENNMS_HOME/etc/opennms-activemq.xml 取消......

qoswork
14分钟前
2
0
PHP Socket初探---先从一个简单的socket服务器开始

socket的中文名字叫做套接字,这种东西就是对TCP/IP的“封装”。现实中的网络实际上只有四层而已,从上至下分别是应用层、传输层、网络层、数据链路层。最常用的http协议则是属于应用层的协议...

bengozhong
21分钟前
2
0
Git

指令 git init :创建版本库,生成.git文件夹 git add XX:上传代码到暂存区 git state:查看目前本地工作起、暂存区、分支,三者之间的文件状态 git diff demo.html:查看工作区和暂存区的代码...

Hui先生
41分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部