MyBatis关联关系
1、一对多:一个国家对应多个城市
01.实体类
package cn.pb.bean; import java.util.Set; /**
* 国家的实体类
*/
public class Country {
private Integer cId;//国家的编号
private String cName;//国家的名称 //关联省会的属性
private Set<Provincial> provincials; public Integer getcId() {
return cId;
} public void setcId(Integer cId) {
this.cId = cId;
} public String getcName() {
return cName;
} public void setcName(String cName) {
this.cName = cName;
} public Set<Provincial> getProvincials() {
return provincials;
} public void setProvincials(Set<Provincial> provincials) {
this.provincials = provincials;
} public Country(Integer cId, String cName, Set<Provincial> provincials) {
this.cId = cId;
this.cName = cName;
this.provincials = provincials;
}
public Country() { } @Override
public String toString() {
return "Country{" +
"cId=" + cId +
", cName='" + cName + '\'' +
", provincials=" + provincials +
'}';
}
}
package cn.pb.bean; /**
* 省会对应的实体类
*/
public class Provincial {
private Integer pId; //省会的编号
private String pName; //省会名称 public Integer getpId() {
return pId;
}
public void setpId(Integer pId) {
this.pId = pId;
}
public String getpName() {
return pName;
}
public void setpName(String pName) {
this.pName = pName;
}
public Provincial(Integer pId, String pName) {
super();
this.pId = pId;
this.pName = pName;
}
public Provincial() {
super();
}
@Override
public String toString() {
return "Provincial [pId=" + pId + ", pName=" + pName + "]";
}
}
02.创建对应的dao和mapper文件
public interface CountryDao {
/**
* 根据国家的id查询出国家的信息 以及国家下面的省会信息
*/
Country selectCountryById(Integer cId);
}
03.mapper.xm文件=====单条SQL不能使用延迟加载
<?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="cn.bdqn.dao.CountryDao"> <!-- 这里的resultMap和之前使用的不一样,哪怕属性和字段一致 也要书写
因为mybatis在底层封装的时候,是根据我们resultMap中写的属性来的 -->
<resultMap type="Country" id="countryMap">
<id property="cId" column="cid"/>
<result property="cName" column="cname"/>
<!-- 设置关联的集合属性 -->
<collection property="provincials" ofType="Provincial">
<id property="pId" column="pid"/>
<result property="pName" column="pname"/>
</collection>
</resultMap>
<!-- 这是单表的关联查询 不经常使用 因为 不能使用延迟加载 -->
<select id="selectCountryById" resultMap="countryMap">
select cid,cname,pid,pname from country,provincial
where cid=countryid and cid=#{xxx} <!--#{xxx} 参数的占位符 -->
</select>
</mapper>
04.mapper.xm文件=====多条SQL可以使用延迟加载
<?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.xdf.dao.CountryDao"> <!--必须是对应的dao接口的全类名--> <!--01 根据国家的编号 查询出 国家的信息 xxx就是用户输入的值-->
<select id="selectCountryById" resultMap="countryMap">
select cid,cname from country where cid=#{xxx}
</select>
<!--02 根据国家的编号 查询出 国家对应的省会信息 xxx 谁给传值-->
<select id="selectProvincialByCid" resultType="Provincial">
select pid,pname from provincial where countryid=#{xxx}
</select> <!--对应的countryMap 这种方式 推荐使用 因为使用使用延迟加载-->
<resultMap id="countryMap" type="Country">
<id property="cId" column="cid"/>
<result property="cName" column="cname"/>
<!--
select: 指的是关联sql语句的id ===》根据国家的编号 查询出 国家对应的省会信息的sql
column:关联sql语句需要的参数
-->
<collection property="provincials" ofType="Provincial"
select="selectProvincialByCid" column="cid"/>
</resultMap> </mapper>
05.在MyBatis.xml文件中 管理Mapper文件
<!-- 加载映射文件信息 -->
<mappers>
<mapper resource="cn/bdqn/dao/CountryMapper.xml" />
</mappers>
06.测试类代码
public class CountryTest {
CountryDao dao=null;
SqlSession session=null;
Logger log=Logger.getLogger(CountryTest.class);
/**
* 在所有的test测试方法执行之前 都要执行的操作
*/
@Before
public void before(){
//获取session
session= SessionFactoryUtil.getSession();
dao=session.getMapper(CountryDao.class); //获取执行的类对象
} @After
public void after(){
if (session!=null){
session.close();
}
} /**
* 根据国家的编号 查询出 国家对应省会的信息
* 没有延迟加载
*/
@Test
public void selectCountry(){
Country country = dao.selectCountryById(1);
log.debug(country);
}
/**
* 根据国家的编号 查询出 国家对应省会的信息
* 设置延迟加载
*01.在mybati核心配置文件中 增加setting节点
*02.节点中增加
* <setting name="lazyLoadingEnabled" value="true"/>
* <setting name="aggressiveLazyLoading" value="false"/>
*/
@Test
public void selectCountryLazy(){
Country country = dao.selectCountryById(2);
log.debug(country.getcName()); //只查询国家的名称 如果开启了延迟加载有1条sql
log.debug(country.getcName()); //只查询国家的名称 如果没开启了延迟加载有2条sql
log.debug(country.getProvincials()); //查询国家对应的省会 无论有没有开启了延迟加载都有2条sql
} }
07.在MyBatis.xml中核心配置文件中的配置延迟加载
<settings>
<!--开启延迟加载 默认值是 false-->
<setting name="lazyLoadingEnabled" value="true"/>
<!--
我们的一个实体类中可以有多个延迟加载属性不?? 肯定可以!
当启用后,一个有延迟加载属性的对象的任何一个延迟属性被加载时,该对象的所有的属性都会被加载。
否则,所有属性都是按需加载。默认值是true
-->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
2、多对一:多个城市对应一个国家
01.实体类
package cn.pb.bean; /**
* 国家的实体类
*/
public class Country { private Integer cId; //国家的编号
private String cName; //国家的名称 public Integer getcId() {
return cId;
}
public void setcId(Integer cId) {
this.cId = cId;
}
public String getcName() {
return cName;
}
public void setcName(String cName) {
this.cName = cName;
}
public Country(Integer cId, String cName) {
super();
this.cId = cId;
this.cName = cName;
}
public Country() {
super();
}
@Override
public String toString() {
return "Country [cId=" + cId + ", cName=" + cName ;
} }
package cn.pb.bean; /**
* 省会对应的实体类
*/
public class Provincial {
private Integer pId; //省会的编号
private String pName; //省会名称
//关联的国家属性
private Country country; public Country getCountry() {
return country;
}
public void setCountry(Country country) {
this.country = country;
}
public Integer getpId() {
return pId;
}
public void setpId(Integer pId) {
this.pId = pId;
}
public String getpName() {
return pName;
}
public void setpName(String pName) {
this.pName = pName;
}
public Provincial(Integer pId, String pName) {
super();
this.pId = pId;
this.pName = pName;
}
public Provincial() {
super();
}
@Override
public String toString() {
return "Provincial [pId=" + pId + ", pName=" + pName + ", country="
+ country + "]";
} }
02.创建对应的dao和mapper文件
public interface CountryDao {
/**
* 根据省会的id 查询出 省会 以及对应的国家
*/
Provincial selectProvincialById(Serializable id);
}
03.mapper.xm文件=====单条SQL不能使用延迟加载
<?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="cn.pb.dao.ProvincialDao">
<resultMap id="provincialMap" type="Provincial">
<id property="pId" column="pid"/>
<result property="pName" column="pname"/>
<!-- 设置关联的属性 -->
<association property="country" javaType="Country">
<id property="cId" column="cid"/>
<result property="cName" column="cname"/>
</association>
</resultMap>
<!-- 这是单表的关联查询 不经常使用 因为 不能使用延迟加载 -->
<select id="selectProvincialById" resultMap="provincialMap">
select cid,cname,pid,pname from country,provincial
where cid=countryid and pid=#{xxx} <!-- #{xxx} 参数的占位符 -->
</select>
</mapper>
04.mapper.xm文件=====多条SQL可以使用延迟加载
<?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.xdf.dao.CountryDao"> <!--必须是对应的dao接口的全类名-->
<!-- 01. 根据省会的id 查询出 省会的信息-->
<select id="selectProvincialById" resultMap="provincialMap">
select pid,pname,countryid from provincial where pid=#{xxx}
</select>
<!-- 02. 根据省会的id 查询出 对应国家的信息
xxx就是resultmap中传递来的 countryid-->
<select id="selectCountryById" resultType="Country">
select cid,cname from country where cid=#{xxx}
</select> <!--对应的countryMap 这种方式 推荐使用 因为使用延迟加载-->
<resultMap id="provincialMap" type="Provincial">
<id property="pId" column="pid"/>
<result property="pName" column="pname"/>
<!-- Provincial有一个属性的类型是 Country 域属性
javaType:域属性对应的类型 -->
<association property="country" javaType="Country" select="selectCountryById"
column="countryid"/>
</resultMap> </mapper>
05.在MyBatis.xml文件中 管理Mapper文件
<!-- 加载映射文件信息 -->
<mappers>
<mapper resource="cn/bdqn/dao/ProvincialMapper.xml" />
</mappers>
06.测试类代码
public class CountryTest {
CountryDao dao=null;
SqlSession session=null;
Logger log=Logger.getLogger(CountryTest.class);
/**
* 在所有的test测试方法执行之前 都要执行的操作
*/
@Before
public void before(){
//获取session
session= SessionFactoryUtil.getSession();
dao=session.getMapper(CountryDao.class); //获取执行的类对象
}
@After
public void after(){
if (session!=null){
session.close();
}
}
/**
* 根据国家的编号 查询出 国家对应省会的信息
* 设置延迟加载
*01.在mybati核心配置文件中 增加setting节点
*02.节点中增加
* <setting name="lazyLoadingEnabled" value="true"/>
* <setting name="aggressiveLazyLoading" value="false"/>
*/
@Test
public void selectCountryLazy(){
Provincial provincial = dao.selectProvincialById(1);
//开启延迟加载的情况 直接输出省会的名称 执行1条sql log.debug(provincial.getpName());
log.debug(provincial.getCountry().getcName()); //执行2条
}
}
MyBatis关联关系的更多相关文章
- mybatis关联关系映射
1.一对多关联关系 2.多对多关联关系 首先先用逆向生成工具生成t_hibernate_order.t_hibernate_order_item t_hibernate_book.t_hibernat ...
- mybatis 关联关系查询 java
<mapper namespace="com.rrz.modules.awardrecord.dao.CheckAwardsDao"> <resultMap ty ...
- mybatis之关联关系映射
Mybatis关联关系映射 1.一对多 首先先用逆向生成工具生成t_hibernate_order.t_hibernate_order_item 这两张表对应的model与mapper OrderVo ...
- JavaEE MyBatis
1. 简介 MyBatis本是apache的一个开源项目iBatis的升级版,2013年11月迁移到Github,是三层架构中持久层框架. 目前提供了Java..NET.以及Ruby三种语言实现的版 ...
- MyBatis学习笔记(二) 关联关系
首先给大家推荐几个网页: http://blog.csdn.net/isea533/article/category/2092001 没事看看 - MyBatis工具:www.mybatis.tk h ...
- myBatis 基础测试 表关联关系配置 集合 测试
myBatis 基础测试 表关联关系配置 集合 测试 测试myelipse项目源码 sql 下载 http://download.csdn.net/detail/liangrui1988/599388 ...
- mybatis学习笔记三(关联关系)
学习mybatis的关联关系,主要注解在代码上,这里不做解释.配置文件一样的就不贴了 1.关联关系表创建(学生对应老师 多对一) 学生老师表 2.表对应的实体类 package com.home.en ...
- MyBatis对象关联关系---- association与collection
Mybatis处理“一对多”的关系时,需要用到associasion元素.处理”多对一“用collection元素来实现(这两个元素在之前mapper文件中提到过). 本例子中,假设一名User可以有 ...
- Mybatis输入输出映射_动态sql_关联关系(一对一、一对多、多对多)
Mybatis输入输出映射_动态sql_关联关系(一对一.一对多.多对多)输入输出映射parameterType完成输入映射parameterType可以传入的参数有,基本数据类型(根据id查询用户的 ...
随机推荐
- Visual Studio 2017 Enterprise 发布 15.3.3 版,附离线安装包百度网盘下载。
Visual Studio 2017 Enterprise 发布 15.3.3 版,附离线安装包百度网盘下载. Visual Studio 2017 Enterprise 更新至 15.3.3 ,本安 ...
- UVA-11214 IDA*
利用迭代加深搜索,枚举需要的皇后数量,进行搜索. 对于10 * 10 的棋盘,最多需要5个皇后就能攻击整个棋盘,当0~4个皇后都不能搜索成功,那么5就不用搜索,直接打印. AC代码: #include ...
- Docker MariaDB 10.3 Galera Cluster 集群同步复制 多主 Docker Haproxy 负载均衡
mariadb 现有动态列,支持json格式存储,类似mongodb的bson,但是操作能力较为尴尬,中间件有spider,我非常感兴趣的一个东西 关于spider 这里有一篇很好的博文,有时间一定得 ...
- flask中jinjia2模板使用详解2
接上文 注释的使用 在jinjia2模板中,使用{# #}进行代码注释,如下所示 运行后发现,注释不会被render出来 去掉空行 两种方法可以去掉jinjia2模板中的空白行,一是设置jinjia2 ...
- Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十四)Redis缓存正确的使用姿势
作者:13 GitHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载. 简介 这是一篇关于Redis使用的总结类型文章,会先简单的谈一下缓存 ...
- mysql数据库导入导出 查询 修改表记录
mysql数据导入导出: 导入: 把系统的文件的内容,保存到数据库的表里 导入数据的基本格式:mysql> load data infile "文件名" into table ...
- 【mongodb系统学习之六】mongodb配置文件方式启动
六.mongodb可以用配置文件启动,配置文件配好后,每次指定文件就好,而不用每次写一长串: 1).创建配置文件: 2).配置(例如指定数据存储目录,日志存储文件,后台进程,端口号等): 3).配置文 ...
- GStreamer 简化 Linux 多媒体开发
Streamer 是 GNOME 桌面环境下用来构建流媒体应用的开源多媒体框架(framework),其目标是要简化音/视频应用程序的开发,目前已经能够被用来处理像 MP3.Ogg.MPEG1.MPE ...
- Linux中挂载Windows共享出来的目录
Windows中1.新建文件夹,创建共享目录 右键文件夹,共享 2.设置访问方式 Everyone,添加确认 Linux-ubuntu中1.安装cifs#sudo apt-get install ci ...
- SpringMVC工作流程描述
向服务器发送HTTP请求,请求被前端控制器 DispatcherServlet 捕获. DispatcherServlet 根据 <servlet-name>-servlet.xml 中的 ...