注:代码已托管在GitHub上,地址是:https://github.com/Damaer/Mybatis-Learning ,项目是mybatis-12-many2one,需要自取,需要配置maven环境以及mysql环境(sql语句在resource下的test.sql中),觉得有用可以点个小星星。

docsify文档地址在:https://damaer.github.io/Mybatis-Learning/#/

一对多关联查询:每个国家有很多大臣,领导人,现在我们查询一个领导,希望能将他所在国家的信息连带出来,这就是一对多关联查询。

数据表如下:

国家表:

领导人表:

创建数据库/表

#创建数据库
CREATE DATABASE `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
#创建数据表
CREATE TABLE `test`.`country` ( `cid` INT(10) NOT NULL AUTO_INCREMENT ,`cname` VARCHAR(20) NOT NULL ,PRIMARY KEY(`cid`)) ENGINE = MyISAM;
CREATE TABLE `test`.`minister` ( `mid` INT(10) NOT NULL AUTO_INCREMENT ,`mname` VARCHAR(20) NOT NULL ,`countryId` INT(20) NOT NULL ,PRIMARY KEY(`mid`)) ENGINE = MyISAM; #初始化数据表
INSERT INTO `country` (`cid`, `cname`) VALUES ('1', 'USA');
INSERT INTO `country` (`cid`, `cname`) VALUES ('2', 'England'); INSERT INTO `minister` (`mid`, `mname`, `countryId`) VALUES ('1', 'aaa', '1');
INSERT INTO `minister` (`mid`, `mname`, `countryId`) VALUES ('2', 'bbb', '1');
INSERT INTO `minister` (`mid`, `mname`, `countryId`) VALUES ('3', 'ccc', '2');
INSERT INTO `minister` (`mid`, `mname`, `countryId`) VALUES ('4', 'ddd', '2');
INSERT INTO `minister` (`mid`, `mname`, `countryId`) VALUES ('5', 'eee', '2');

实体类

country类:

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;
} @Override
public String toString() {
return "Country{" +
"cid=" + cid +
", cname='" + cname + '\'' +
'}';
}
}

Minister类,在这个类里面使用Country当属性。

public class Minister {
private Integer mid;
private String mname;
private Country country; public Integer getMid() {
return mid;
} public void setMid(Integer mid) {
this.mid = mid;
} public String getMname() {
return mname;
} public void setMname(String mname) {
this.mname = mname;
} public Country getCountry() {
return country;
} public void setCountry(Country country) {
this.country = country;
} @Override
public String toString() {
return "Minister{" +
"mid=" + mid +
", mname='" + mname + '\'' +
", country=" + country +
'}';
}
}

Mybatis工具类,获取sqlsession实例:

public class MyBatisUtils {

    /*	public SqlSession getSqlSession(){
InputStream is;
try {
is = Resources.getResourceAsStream("mybatis.xml");
return new SqlSessionFactoryBuilder().build(is).openSession();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}*/
static private SqlSessionFactory sqlSessionFactory; static public SqlSession getSqlSession() {
InputStream is;
try {
is = Resources.getResourceAsStream("mybatis.xml");
if (sqlSessionFactory == null) {
sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
}
return sqlSessionFactory.openSession();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}

mybatis.xml主配置文件里面注册mapper文件:

<mappers>
<mapper resource="mapper/mapper.xml"/>
</mappers>

接口的声明:

public interface IMinisterDao {
Minister selectMinisterById(int mid);
Minister selectMinisterById2(int mid);
}

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="dao.IMinisterDao">
<!-- resultMap 能解决字段和属性不一样的问题 -->
<!-- 以后用得比较多 ,是因为可以使用延迟加载-->
<!-- 嵌套查询 -->
<select id="selectCountryById" resultType="Country">
select * from country where cid=#{countryId}
</select>
<resultMap type="Minister" id="countryMapper">
<id column="mid" property="mid"/>
<result column="mname" property="mname"/>
<!-- country中有一个成员变量是ministers,它的泛型是Minister -->
<collection property="country"
ofType="Country"
select="selectCountryById"
column="countryId">
</collection>
</resultMap>
<select id="selectMinisterById" resultMap="countryMapper">
select mid,mname,countryId
from minister
where
mid=#{mid}
</select> <!-- 嵌套结果-->
<select id="selectMinisterById2" resultMap="countryMapper2">
select mid,mname,countryId,cid,cname
from minister,country
where
mid=#{mid} and countryId = cid
</select>
<resultMap id="countryMapper2" type="Minister">
<id column="mid" property="mid"/>
<result column="mname" property="mname"/>
<collection property="country" ofType="Country">
<id property="cid" column="cid"/>
<result property="cname" column="cname"/>
</collection>
</resultMap>
</mapper>

单元测试:

public class MyTest {
private IMinisterDao dao;
private SqlSession sqlSession;
@Before
public void Before(){
sqlSession=MyBatisUtils.getSqlSession();
dao=sqlSession.getMapper(IMinisterDao.class);
}
@Test
public void TestselectMinisterById(){
Minister minister = dao.selectMinisterById(1);
System.out.println(minister);
} @Test
public void TestselectMinisterById2(){
Minister minister = dao.selectMinisterById2(1);
System.out.println(minister);
} @After
public void after(){
if(sqlSession!=null){
sqlSession.close();
}
} }

结果:

[service] 2018-07-12 20:07:23,875 - dao.IMinisterDao.selectMinisterById2 -567  [main] DEBUG dao.IMinisterDao.selectMinisterById2  - ==>  Preparing: select mid,mname,countryId,cid,cname from minister,country where mid=? and countryId = cid
[service] 2018-07-12 20:07:23,909 - dao.IMinisterDao.selectMinisterById2 -601 [main] DEBUG dao.IMinisterDao.selectMinisterById2 - ==> Parameters: 1(Integer)
[service] 2018-07-12 20:07:23,930 - dao.IMinisterDao.selectMinisterById2 -622 [main] DEBUG dao.IMinisterDao.selectMinisterById2 - <== Total: 1
Minister{mid=1, mname='aaa', country=Country{cid=1, cname='USA'}}

【作者简介】

秦怀,公众号【秦怀杂货店】作者,技术之路不在一时,山高水长,纵使缓慢,驰而不息。这个世界希望一切都很快,更快,但是我希望自己能走好每一步,写好每一篇文章,期待和你们一起交流。

Mybatis【16】-- Mybatis多对一关联查询的更多相关文章

  1. MyBatis 一对多,多对一关联查询的时候Mapper的顺序

    要先写association,然后写collection:这是由DTD决定的: <resultMap ...> <association ...> </associati ...

  2. mybatis实战教程二:多对一关联查询(一对多)

    多对一关联查询 一.数据库关系.article表和user表示多对一的关系 CREATE TABLE `article` ( `id` ) NOT NULL AUTO_INCREMENT, `user ...

  3. mybatis 14: 多对一关联查询

    业务背景 根据订单id查询订单的信息,以及该订单所属的客户的基本信息(不包括该客户自己的订单信息) 两张数据表 客户表 订单表 实体类 客户实体类:Customer private Integer i ...

  4. Mybatis学习总结四(关联查询)

    一.一对一查询 实例:查询所有订单信息,关联查询下单用户信息. Method1:使用resultType,定义订单信息po类,此po类中包括了订单信息和用户信息. public class Order ...

  5. NHibernate教程(11)--多对多关联查询

    本节内容 多对多关系引入 多对多映射关系 多对多关联查询 1.原生SQL关联查询 2.HQL关联查询 3.Criteria API关联查询 结语 多对多关系引入 让我们再次回顾在第二篇中建立的数据模型 ...

  6. Python--day64--找到作者关联的所有书籍对象、ORM多对多关联查询的原理

    找到当前作者关联的所有书籍对象: ORM多对多关联查询的原理: 编辑作者:

  7. mybatis多对多关联查询

    多对多关系 一个学生可以选多门课程,而一门课程可以由多个学生选择,这就是一个典型的多对多关联关系.所谓多对多关系,其实是由两个互反的一对多关系组成.即多对多关系都会通过一个中间表来建立,例如选课表.学 ...

  8. mybatis实现多表一对一,一对多,多对多关联查询

    原文:https://blog.csdn.net/m0_37787069/article/details/79247321 1.一对一关键字:association作用:针对pojo对象属性的映射  ...

  9. mybatis一对多关系的关联查询

    问题描述:实现两张表的关联查询 学生表: 班级表: 要实现学生管理信息中有所在班级的名称,即如下图所示 1.对应学生表的pojo类写全班级表中的字段(适用于要连接的表字段较少的情况) sql语句直接在 ...

  10. Mybatis框架基础入门(七)--关联查询

    1.一对一查询 1.1 使用resultType接收查询结果 修改pojo类 public class OrderUser extends order { private String usernam ...

随机推荐

  1. ES6之常用开发知识点:字符串的扩展与正则表达式的扩展(三)

    字符串的扩展 codePointAt JavaScript 内部,字符以 UTF-16 的格式储存,每个字符固定为2个字节.对于那些需要4个字节储存的字符(Unicode 码点大于0xFFFF的字符) ...

  2. Dubbo框架的1个核心设计点

    Java领域要说让我最服气的RPC框架当属Dubbo,原因有许多,但是最吸引我的还是它把远程调用这个事情设计得很有艺术. 1.Dubbo优点较多,我只钟情其一 1.1.优点 业内对于微服务之间调用的框 ...

  3. Unity中的光源类型(向前渲染路径进行光照计算)

    Unity中的光源类型 Unity中共支持4种光源类型: 平行光 点光源 聚光灯 面光源(在光照烘焙时才可以发挥作用) 光源的属性: 位置 方向(到某个点的方向) 颜色 强度 衰减(到某个点的衰减) ...

  4. 用PowerDesigner创建Oracle模型转为mysql模型

    一.首先打开PowerDesigner 1.File(位置:左上角)–>New Model–>Physical Date Model(物理数据模型) (1)DBMS选择MySQL5.0(版 ...

  5. Atcoder Beginner Contest 367

    A.Shout Everyday \(\text{Diff }43\) 给你 \(24\) 小时制下的 \(A,B,C\) 三个时刻,问 \(A\) 是否在 \([B,C]\) 范围内 考虑到先将 \ ...

  6. 信息打点-Web应用

    企业信息 小蓝本 https://sou.xiaolanben.com/pc 企业信息 爱企查 https://aiqicha.baidu.com/ 主要看知识产权 网络空间 FOFA https:/ ...

  7. 开源的键鼠共享工具「GitHub 热点速览」

    十一长假回来,我的手放在落灰的键盘上都有些陌生了,红轴竟敲出了青轴般的响声,仿佛在诉说对假期结束的不甘. 假期回归的首更,让我们看看又有什么好玩的开源项目冲上了开源热榜.一套键盘和鼠标控制多台电脑的工 ...

  8. Android10.0系统启动之Launcher(桌面)启动流程-[Android取经之路]

    Launcher的启动经过了三个阶段: 第一个阶段:SystemServer完成启动Launcher Activity的调用 第二个阶段:Zygote()进行Launcher进程的Fork操作 第三个 ...

  9. Putty 远程 连接kali Linux拒绝访问 refused connection

    1. 设置  ssh 文件 crtl + alt + t 代开终端 输入命令: vim /etc/ssh/sshd_config 说明 : 使用 vim 编辑器编辑 ssh 文件 : 说明: 修改第3 ...

  10. [Dest0g3 520迎新赛]funny_upload

    打开靶机抓包发现过滤代码 发现.htaccess能上传后传入图片马 发现内容对<?进行过滤 我们换一种方式写后门代码 <script language="php"> ...