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

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

所谓一对一多表查询,举个例子:我们有很多国家,每一个国家只有一个领导人(假设),我们需要根据id查询国家信息,带上领导人的信息。

创建数据表

设计表的时候,我们需要考虑由于是一对多关系,我们需要在国家表里面使用一个字段对应领导人的信息。

#创建数据库
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 ,`mid` INT(10) NOT NULL,PRIMARY KEY(`cid`)) ENGINE = MyISAM;
CREATE TABLE `test`.`minister` ( `mid` INT(10) NOT NULL AUTO_INCREMENT ,`mname` VARCHAR(20) NOT NULL,PRIMARY KEY(`mid`)) ENGINE = MyISAM; #初始化数据表
INSERT INTO `country` (`cid`, `cname`, `mid`) VALUES ('1', 'aaa', '1');
INSERT INTO `country` (`cid`, `cname`, `mid`) VALUES ('2', 'bbb', '2');
INSERT INTO `country` (`cid`, `cname`, `mid`) VALUES ('3', 'ccc', '3'); INSERT INTO `minister` (`mid`, `mname`) VALUES ('1', 'sam');
INSERT INTO `minister` (`mid`, `mname`) VALUES ('2', 'jane');
INSERT INTO `minister` (`mid`, `mname`) VALUES ('3', 'jone');

数据表如下:



实体类

country对应的实体类:

public class Country {
private Integer cid;
private String cname;
private Minister minister; 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 Minister getMinister() {
return minister;
} public void setMinister(Minister minister) {
this.minister = minister;
} @Override
public String toString() {
return "Country{" +
"cid=" + cid +
", cname='" + cname + '\'' +
", minister=" + minister +
'}';
}
}

Minister对应的实体类:

public class Minister {
private Integer mid;
private String mname;
@Override
public String toString() {
return "Minister [mid=" + mid + ", mname=" + mname + "]";
}
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;
} }

MybatisUtils工具类,用于获取单例的sqlSession对象:

public class MyBatisUtils {
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>

我们的两个接口(对应mapper文件中的两个sql语句):

public interface ICountryDao {
Country selectCountryById(int cid);
Country selectCountryById2(int cid);
}

mapper文件,有两种写法,一种是嵌套结果,一种是嵌套查询

  • 嵌套结果的就是使用一条sql完成查询,需要在自己定义的resultMap里面使用<association></association>来组织结果属性。

  • 嵌套查询也有一个<association></association>,但是在最外面的<select>标签并没有将所有需要的东西查询出来,而是在<association></association>里面指定需要关联查询的sql语句的id,这样的方式就是懒加载:

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

单元测试:

public class MyTest {
private ICountryDao dao;
private SqlSession sqlSession;
@Before
public void Before(){
sqlSession=MyBatisUtils.getSqlSession();
dao=sqlSession.getMapper(ICountryDao.class);
}
@Test
public void TestselectCountryById(){
Country country=dao.selectCountryById(1);
System.out.println(country);
} @Test
public void TestselectCountryById2(){
Country country=dao.selectCountryById2(1);
System.out.println(country);
} @After
public void after(){
if(sqlSession!=null){
sqlSession.close();
}
} }

结果:

[service] 2018-07-12 15:23:38,971 - dao.ICountryDao.selectCountryById -537  [main] DEBUG dao.ICountryDao.selectCountryById  - ==>  Preparing: select cid,cname,mid from country where cid=?
[service] 2018-07-12 15:23:39,004 - dao.ICountryDao.selectCountryById -570 [main] DEBUG dao.ICountryDao.selectCountryById - ==> Parameters: 1(Integer)
[service] 2018-07-12 15:23:39,037 - dao.ICountryDao.selectMinisterByCountry -603 [main] DEBUG dao.ICountryDao.selectMinisterByCountry - ====> Preparing: select mid,mname from minister where mid=?
[service] 2018-07-12 15:23:39,037 - dao.ICountryDao.selectMinisterByCountry -603 [main] DEBUG dao.ICountryDao.selectMinisterByCountry - ====> Parameters: 1(Integer)
[service] 2018-07-12 15:23:39,040 - dao.ICountryDao.selectMinisterByCountry -606 [main] DEBUG dao.ICountryDao.selectMinisterByCountry - <==== Total: 1
[service] 2018-07-12 15:23:39,041 - dao.ICountryDao.selectCountryById -607 [main] DEBUG dao.ICountryDao.selectCountryById - <== Total: 1
Country{cid=1, cname='aaa', minister=Minister [mid=1, mname=sam]}

【作者简介】

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

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

  1. 7.Mybatis关联表查询(这里主要讲的是一对一和一对多的关联查询)

    在Mybatis中的管理表查询这里主要介绍的是一对一和一对多的关联查询的resultMap的管理配置查询,当然你也可以用包装类来实现.不过这里不说,做关联查询的步骤可以简单的总结为以下的几步: 1.分 ...

  2. MyBatis学习总结(三)——多表关联查询与动态SQL

    在上一章中我们学习了<MyBatis学习总结(二)——MyBatis核心配置文件与输入输出映射>,这一章主要是介绍一对一关联查询.一对多关联查询与动态SQL等内容. 一.多表关联查询 表与 ...

  3. 三、mybatis多表关联查询和分布查询

    前言 mybatis多表关联查询和懒查询,这篇文章通过一对一和一对多的实例来展示多表查询.不过需要掌握数据输出的这方面的知识.之前整理过了mybatis入门案例和mybatis数据输出,多表查询是在前 ...

  4. JAVA入门[9]-mybatis多表关联查询

    概要 本节要实现的是多表关联查询的简单demo.场景是根据id查询某商品分类信息,并展示该分类下的商品列表. 一.Mysql测试数据 新建表Category(商品分类)和Product(商品),并插入 ...

  5. mybatis多表关联查询之resultMap单个对象

    resultMap的n+1方式实现多表查询(多对一) 实体类 创建班级类(Clazz)和学生类(Student),并在Student中添加一个Clazz类型的属性,用于表示学生的班级信息. mappe ...

  6. Spring Boot入门系列(十七)整合Mybatis,创建自定义mapper 实现多表关联查询!

    之前讲了Springboot整合Mybatis,介绍了如何自动生成pojo实体类.mapper类和对应的mapper.xml 文件,并实现最基本的增删改查功能.mybatis 插件自动生成的mappe ...

  7. MyBatis 中两表关联查询MYSQL (14)

    MyBatis 中两表关联查询MYSQL 1.创建数据库表语句 2.插入测试数据 3.pom文件内容 <?xml version="1.0" encoding="U ...

  8. MyBatis 多表关联查询

    多表关联查询 一对多 单条SQL实现. //根据部门编号查询出部门和部门成员姓名public dept selectAll() thorws Excatipon; //接口的抽象方法 下面是对应接口的 ...

  9. Mybatis多表关联查询字段值覆盖问题

    一.错误展示 1.首先向大家展示多表关联查询的返回结果集 <resultMap id="specialdayAndWorktimeMap type="com.hierway. ...

随机推荐

  1. 属于同一网段的ip是不是就在同一个局域网?

    参考文章链接: https://zhidao.baidu.com/question/350887200.html?qbl=relate_question_0&word=%D4%DA%D2%BB ...

  2. 使用php进行微信小程序图片安全验证

    想用到微信公众平台的图片识别系统,结果报错{"errcode":41005,"errmsg":"media data missing hint: [x ...

  3. 轻松理解HTTP缓存策略

    上一篇文章我写了koa-static的源码解析,其中用到了HTTP的缓存策略,给返回的静态文件设置了一些缓存的头,比如Cache-Control之类的.于是我就跟朋友讨论了一下HTTP的缓存策略: 朋 ...

  4. Jenkins自动化部署服务器及git 提交及git tag标签版本更新流程,超详细!

    工作中部署的项目和服务器较多时就用上了Jenkins进行自动部署 优点 不用在连接单独的服务器进行更新项目,再启动项目服务的操作了 更新部署都是自动的,比较方便.适合大批量的部署 一.git流程部分 ...

  5. Git提交错了不用慌,这三招帮你修改记录

    大家好,今天我们来聊聊git当中一个很重要的功能--历史记录的修改. 有的时候我们会突然发现某个地方需要修改,最常见的某个不应该被提交的文件被提交了进来.我们希望它不只是在后序的版本当中不再出现,而是 ...

  6. feig中调用其他微服务接口无反应

    1.调用微服务时get请求接口中不能使用@RequestBody注解,不然接口调用无反应.post接口中可以使用@RequestBody注解

  7. 686. Repeated String Match判断字符串重复几次可以包含另外一个

    public static int repeatedStringMatch(String A, String B) { //判断字符串a重复几次可以包含另外一个字符串b,就是不断叠加字符串a直到长度大 ...

  8. git 只提交部分文件 拉取pull远程仓库

    正常的团队开发中,在提交代码push之前要先pull拉取远程仓库的代码.而拉取pull操作需要先commit修改的文件才能成功. 那么问题来了,当我只想push提交部分代码的时候,同样需要pull拉取 ...

  9. JAVA JVM助记符

    ldc:将int/float/String类型的常量值从常量池中推送至栈顶(栈顶的值是即将要用的) bipush:将单字节(-128 ~ 127)的常量值从常量池中推至栈顶 sipush:将一个短整型 ...

  10. 短信平台开发,G客短信系统功能介绍

    G客短信群发平台功能介绍 支持HTTP 接口 .CMPP SMPP等 这里只有基本功能介绍 联系微信:290615413 QQ:290615413 一:客户端功能 1:首页仪表盘 首页包含 2:发送短 ...