MyBatis数据持久化(七)多表连接查询
本节继续以多表连接查询的案例介绍使用resultMap的好处,对于两张以上的表进行关联查询,当我们有选择的从不同表查询所需字段时,使用resultMap是相当方便的。例如我们有两张表,分别为用户表User和文章Article,通过外键进行关联,属于一对多的关系,一个用户对应多篇文章,我们有查询语句如下:
select u.username,a.title,a.content,a.posttime from article a,user u where u.uid = a.uid and u.username='小王'
查询的字段username属于user表,title、content、posttime属于article表,使用域对象进行映射显然是不合适的,不仅域对象的命名上困难,而且没有任何逻辑可言。如果读者有兴趣可以去看一下hibernate是怎么做的,这里不做介绍。
这时候我们必须使用resultMap进行映射,为了方便演示我们新建一张文章表article,建表语句如下:
CREATE TABLE `mybatis`.`article` (
`AID` INT NOT NULL AUTO_INCREMENT,
`TITLE` VARCHAR(200) NOT NULL,
`POSTTIME` TIME NOT NULL,
`CONTENT` VARCHAR(1600) NOT NULL,
`UID` INT NOT NULL,
PRIMARY KEY (`AID`),
UNIQUE INDEX `AID_UNIQUE` (`AID` ASC),
INDEX `userid_idx` (`UID` ASC),
CONSTRAINT `userid`
FOREIGN KEY (`UID`)
REFERENCES `mybatis`.`user` (`UID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_unicode_ci;
article表通过外键uid和user表进行关联,接着我们向article表中插入两条数据:
insert into article(TITLE,POSTTIME,CONTENT,UID) values('hello world',CURTIME(),'hello world!',1);
insert into article(TITLE,POSTTIME,CONTENT,UID) values('first article',CURTIME(),'first article!',1);
在User.xml中新增配置语句如下:
<resultMap type="hashmap" id="queryAticleInfoResult">
<result property="username" column="username"/>
<result property="title" column="title"/>
<result property="content" column="content"/>
<result property="posttime" column="posttime"/>
</resultMap>
<select id="queryAticleInfo" parameterType="hashmap" resultMap="queryAticleInfoResult">
select u.username,a.title,a.content,a.posttime from article a,user u where u.uid = a.uid and u.username=#{username}
</select>
新建测试类com.mybatis.exam5.MultiTableQry
,内容如下:
package com.mybatis.exam5;
import java.io.IOException;
import java.io.Reader;
import java.util.ArrayList;
import java.util.HashMap;
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 org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class MultiTableQry {
private Reader reader = null;
private SqlSessionFactory sessionFactory = null;
private SqlSession session = null;
@Before
public void before()
{
try {
reader = Resources.getResourceAsReader("SqlMapConfig.xml");
sessionFactory = new SqlSessionFactoryBuilder().build(reader);
//创建一个数据库会话
session = sessionFactory.openSession();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Test
@SuppressWarnings({ "rawtypes", "unchecked" })
public void testMultiTableQry()
{
HashMap map = new HashMap();
map.put("username", "小王");
ArrayList list = (ArrayList)session.selectList("User.queryAticleInfo",map);
System.out.println(list);
}
@After
public void after()
{
if(null != session)
{
session.close();
}
}
}
我们通过session.selectList方法查询出用户名为'小王'
的所有文章信息,该方法返回一个list,list中的每一个元素是一个HashMap对象,每一个对象中存放从数据库中查询出的一条记录。
打开Outline视图,在testMultiTableQry方法上点右键Debug As->Junit Test,控制台中输出:
[
{content=hello world!, title=hello world, username=小王, posttime=09:25:31},
{content=first article!, title=first article, username=小王, posttime=09:25:38}
]
可以看到通过resultMap成功將查询结果映射成HashMap。
博文源码:https://github.com/rongbo-j/mybatis-blog
MyBatis数据持久化(七)多表连接查询的更多相关文章
- Mysql表连接查询
原文地址: https://www.cnblogs.com/qiuqiuqiu/p/6442791.html 1.内联接(典型的联接运算,使用像 = 或 <> 之类的比较运算符).包括相等 ...
- MybatisPlus多表连接查询
一.序言 (一)背景内容 软件应用技术架构中DAO层最常见的选型组件为MyBatis,熟悉MyBatis的朋友都清楚,曾几何时MyBatis是多么的风光,使用XML文件解决了复杂的数据库访问的难题.时 ...
- SQL多表连接查询(详细实例)
转载博客:joeleo博客(http://www.xker.com/page/e2012/0708/117368.html) 本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:stud ...
- SQL多表连接查询
SQL多表连接查询 本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:student 截图如下: 表2:course 截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际 ...
- oracle(sql)基础篇系列(二)——多表连接查询、子查询、视图
多表连接查询 内连接(inner join) 目的:将多张表中能通过链接谓词或者链接运算符连接起来的数据查询出来. 等值连接(join...on(...=...)) --选出雇员的名字和雇员所 ...
- SQL表连接查询(inner join、full join、left join、right join)
SQL表连接查询(inner join.full join.left join.right join) 前提条件:假设有两个表,一个是学生表,一个是学生成绩表. 表的数据有: 一.内连接-inner ...
- SQL的多表连接查询
SQL的多表连接查询 多表连接查询具有两种规范,SQL92和SQL99规范. SQL92规范支持下列多表连接查询: (1)等值连接: (2)非等值连接: (3)外连接: (4)广义笛卡尔积: SQL9 ...
- django ORM model filter 条件过滤,及多表连接查询、反向查询,某字段的distinct
版权归作者所有,任何形式转载请联系作者.作者:petanne(来自豆瓣)来源:https://www.douban.com/note/301166150/ 1.多表连接查询:感觉django太NX了. ...
- SQL表连接查询
SQL表连接查询(inner join.full join.left join.right join) 表的数据有: 一.内连接-inner jion : 最常见的连接查询可能是这样,查出学生的名字和 ...
随机推荐
- 转:如何在Ubuntu 14.04中安装最新版Eclipse
想必很多开发人员都知道,Ubuntu 软件源中提供的并不是最新版本的 Eclipse,本教程就教大家如何在 Ubuntu 14.04 中快速安装 Eclipse 官方发布的最新版本. 到目前为止,Ec ...
- docker初安装的血泪史
最近docker很火,不管是朋友圈内还是公司内聊天都离不开docker,于是对docker产生了极大的好奇心,凭着一颗程序猿的好奇心开始了docker的安装血泪史. 首先我有一台从公司退役的本本x22 ...
- 流式计算新贵Kafka Stream设计详解--转
原文地址:https://mp.weixin.qq.com/s?__biz=MzA5NzkxMzg1Nw==&mid=2653162822&idx=1&sn=8c4611436 ...
- web前端页面优化——个人见解
web前端页面优化,我们从JavaScript.css.html这3个方面说下,我的见解,希望大神们能有刚好优化方法,一起探讨. 一. 有关javascript方面 优化见解. 1. 首先举个例子: ...
- 任何抛开业务谈大数据量的sql优化都是瞎扯
周三去某在线旅游公司面试.被问到了一个关于数据量大的优化问题.问题是:一个主外键关联表,主表有一百万数据,外键关联表有一千万的数据,要求做一个连接. 本人接触过单表数据量最大的就是将近两亿行历史数据( ...
- HDU 1513 Palindrome【LCS】
题意:给出一个字符串s,问至少加入多少个字母让它变成回文串 解题思路:求出该字符串与该字符串翻转后的最长公共子序列的长度,再用该字符串的长度减去最长公共子序列的长度即为所求 反思:因为题目所给的n的范 ...
- GCC中的强符号和弱符号及强引用和弱引用
1. 强符号和弱符号 1.1 u-boot和kernel中的__weak指令 u-boot和kernel比较普遍地使用了__weak来定义函数. 在include\linux\compiler-gcc ...
- C语言基本语法——预处理器和预处理指令
1.什么是预处理器 2.什么是预处理器指令 3.预处理器指令 4.宏指令 5.宏函数 6.宏函数的优缺点 7.条件编译指令 1.什么是预处理器 • 预处理器是一个程序,用来处理源程序中的预处理指令. ...
- 小程序做一个能够左右滑动切换的多tab页面
主要原理:使用 <swiper> 和 <scroll-view> 组件 代码片段: https://developers.weixin.qq.com/s/mLx4FWmF757 ...
- UVALive-8079 Making a Team 排列组合公式化简
题目链接:https://cn.vjudge.net/problem/UVALive-8079 题意 n个人组队,队伍人数小于等于n,每个队伍需要4个不同的职务的领导. 问这n个人可以组成多少队? n ...