elasticsearch多表关联查询_Mybatis【15】 Mybatis如何实现一对一的情况多表关联查询?...
注:代码已托管在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里面使用来组织结果属性。
嵌套查询也有一个,但是在最外面的标签并没有将所有需要的东西查询出来,而是在里面指定需要关联查询的
sql
语句的id
,这样的方式就是懒加载:
<?xml version="1.0" encoding="UTF-8"?>mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="dao.ICountryDao">
<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"/>
<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: 1Country{cid=1, cname='aaa', minister=Minister [mid=1, mname=sam]}
【作者简介】:
秦怀,公众号【秦怀杂货店】作者,技术之路不在一时,山高水长,纵使缓慢,驰而不息。这个世界希望一切都很快,更快,但是我希望自己能走好每一步,写好每一篇文章,期待和你们一起交流。
此文章仅代表自己(本菜鸟)学习积累记录,或者学习笔记,如有侵权,请联系作者核实删除。人无完人,文章也一样,文笔稚嫩,在下不才,勿喷,如果有错误之处,还望指出,感激不尽~
- END -
elasticsearch多表关联查询_Mybatis【15】 Mybatis如何实现一对一的情况多表关联查询?...相关推荐
- mybatis mysql 模糊查询_MyBatis Oracle、MySQL、DB2、SQLServer的like模糊查询
Oracle数据库: select * from t_user where name like '%'||#{search_name}||'%' 或者 select * from t_user whe ...
- 手把手教你用站长工具综查询网站域名在各个平台的权重情况 站长工具综查询
网站权重是根据流量值来判断网站的权重值.权重值是属于第三方评估就有参考的意义. 了解网站的权重可以助于SEO专员找到工作的方向.使用站长工具综合查询可以看到网站在各个平台的权重情况. 用站长工具综合查 ...
- 7.Mybatis关联表查询(这里主要讲的是一对一和一对多的关联查询)
视频地址:http://edu.51cto.com/sd/be679 在Mybatis中的管理表查询这里主要介绍的是一对一和一对多的关联查询的resultMap的管理配置查询,当然你也可以用包装类来实 ...
- mybatis多条件批量查询_Mybatis【14】 Mybatis如何实现一对多查询?
注:代码已托管在GitHub上,地址是:https://github.com/Damaer/Mybatis-Learning ,项目是mybatis-10-one2many,需要自取,需要配置mave ...
- mybatis02映射动态sql关联查询spring整合mybatis
2019独角兽企业重金招聘Python工程师标准>>> 输入映射和输出映射: 动态sql: 关联查询_一对一: 关联查询_一对多: 一对一,一对多操作的区别: 一对一,resultM ...
- mysql一次查询无关联多个表_面试官:为什么mysql不建议执行超过3表以上的多表关联查询?...
点关注,不迷路:持续更新Java架构相关技术及资讯热文!!! 概述 前段时间在跟其他公司DBA交流时谈到了mysql跟PG之间在多表关联查询上的一些区别,相比之下mysql只有一种表连接类型:嵌套循环 ...
- mybatis框架实现一对多、多对多关系查询,以及递归查询(单表多级分类:省市区三级地址查询)
mybatis框架练习 mybatis框架中,包括实体类(这些实体类与数据库中的字段属性相对应),mybatis的配置文件(即mybatis-config.xml,这个配置文件用于连接实体类和orm( ...
- mysql面试关联查询语句_MySQL百万级、千万级数据多表关联SQL语句调优
作者:成金之路 www.cnblogs.com/uttu/p/6384541.html 本文不涉及复杂的底层数据结构,通过explain解释SQL,并根据可能出现的情况,来做具体的优化,使百万级.千万 ...
- c3p0 参数 模糊查询_mybatis之动态sql,模糊查询,结果集处理,mybatis分页及特殊字符处理...
目标及项目目录结构 目标 1.mybatis动态sql 2.模糊查询 3.查询返回结果集的处理 4.分页查询 5.特殊字符处理 项目的目录结构 1.mybatis动态sql If.trim.forea ...
最新文章
- tomcat高并发的配置
- Korn Shell: typeset
- 回溯法+奇偶剪枝——Hdu 1010 Tempter of the Bone
- 隐式马可夫模型(hidden markov model,HMM)
- c++冒泡排序(附完整源码)
- 腾讯云,物联网通信产品,动态注册步骤
- CLR运行时细节 - 继承多态的实现
- 牛客题霸 [ 	判断一棵二叉树是否为搜索二叉树和完全二叉树] C++题解/答案
- 玩转Python? 一文总结30种Python的窍门和技巧,不可错过哈!
- 让人欲罢不能的量子学
- a标签写链接地址跳转到下载企业微信app页面
- Spring cloud实现服务注册及发现
- String.GetEnumerator 方法的C#例子
- Confluence 6 配置数字格式
- Axure RP 8.1最新激活码
- 中科大EPC课程查询自动选课
- 网站资源:分享7个实用好玩的在线网站,值得收藏!
- 商家门店会员管理,只要这五步,稳步提升销售额
- placement new 讲解
- .NET 对于构建系统应用的探索历程