Mybatis学习笔记之---多表查询(1)
Mybatis多表查询(1)
(一)举例(用户和账户)
一个用户可以有多个账户
一个账户只能属于一个用户(多个账户也可以属于同一个用户)
(二)步骤
1、建立两张表:用户表,账户表,让用户表和账户表之间具备一对多的关系:需要使用外键在账户表中添加
2、建立两个实体类:用户实体类和账户实体类,让用户和账户的实体类能体现出来一对多的关系
3、建立两个配置文件,用户的配置文件账户的配置文件
4、实现配置:当我们查询用户时,可以同时得到用户下所包含的账户信息当我们查询账户时,可以同时得到账户的所属用户信息
(三)代码实现

1.pom.xml
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.41</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency> </dependencies>
2.Users.java
package entity;
import java.util.List;
public class Users {
private int uid;
private String username;
private String password;
//一对多的关系映射,主表实体应该包含从表实体的集合引用
private List<Account> accounts;
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public List<Account> getAccounts() {
return accounts;
}
public void setAccounts(List<Account> accounts) {
this.accounts = accounts;
}
@Override
public String toString() {
return accounts+
"uid=" + uid +
", username='" + username + '\'' +
", password='" + password + '\''
;
}
}
3.Account.java
package entity;
public class Account {
private int aid;
private String accountname;
private int uid;
private Users users;
public int getAid() {
return aid;
}
public void setAid(int aid) {
this.aid = aid;
}
public String getAccountname() {
return accountname;
}
public void setAccountname(String accountname) {
this.accountname = accountname;
}
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public Users getUsers() {
return users;
}
public void setUsers(Users users) {
this.users = users;
}
@Override
public String toString() {
return
"aid=" + aid +
", accountname='" + accountname + '\'' +
", uid=" + uid
;
}
}
4.UsersAccount.java
package entity;
public class UsersAccount extends Account{
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "uid="+super.getUid()+",aid="+super.getAid()+", username='" + username + '\'' +
", password='" + password + '\'' +",accountname="+super.getAccountname();
}
}
5.SqlMapperConfig.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPEconfiguration
PUBLIC"-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--mybatis的主配置文件-->
<configuration>
<!--配置环境-->
<environments default="mysql">
<!--配置mysql环境-->
<environment id="mysql">
<!--配置事务的类型-->
<transactionManager type="JDBC"></transactionManager>
<!--配置数据源(连接池)-->
<dataSource type="POOLED">
<!--配置连接数据库的4个基本信息-->
<property name="driver" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/zml01?useUnicode=true&characterEncoding=utf-8"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
</dataSource>
</environment>
</environments>
<!--指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件-->
<mappers>
<mapper resource="dao/UserDao.xml"></mapper>
<mapper resource="dao/AccountDao.xml"></mapper>
</mappers>
</configuration>
6.UserDao.java
package dao;
import entity.Users;
import java.util.List;
public interface UserDao {
List<Users> findAll();
Users find(int id);
}
7.UserDao.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPEmapper
PUBLIC"-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="dao.UserDao">
<!--定义Users的resultMap -->
<resultMap id="userAccountMap" type="entity.Users">
<id property="uid" column="uid"></id>
<result property="username" column="username"></result>
<result property="password" column="password"></result>
<!--配置Users对象中Account集合的映射,一对多的关系映射-->
<collection property="accounts" ofType="entity.Account">
<id property="aid" column="aid"></id>
<result property="accountname" column="accountname"></result>
<result property="uid" column="uid"></result>
</collection>
</resultMap>
<!--查询所有,左外连接,返回左边表的所有数据-->
<select id="findAll" resultMap="userAccountMap">
select * from users u left outer join account a on u.uid=a.uid
</select>
<!--根据ID查询-->
<select id="find" resultType="entity.Users">
select * from users where uid=#{uid}
</select>
</mapper>
8.UserTest.java
package test;
import dao.UserDao;
import entity.Users;
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;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class UserTest {
private InputStream in;
private SqlSession sqlSession;
private UserDao UserDaoImpl;
@Before
public void init() throws IOException {
//1.读取配置文件
in= Resources.getResourceAsStream("SqlMapperConfig.xml");
//2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
SqlSessionFactory factory=builder.build(in);
//3.使用工厂生产SqlSession对象
sqlSession=factory.openSession();
//4.使用SqlSession创建dao接口的代理对象
UserDaoImpl=sqlSession.getMapper(UserDao.class);
}
@After
public void destroy() throws IOException {
//提交事务
sqlSession.commit();
//6.释放资源
sqlSession.close();
in.close();
}
/**
* 查询所有
* @throws IOException
*/
@Test
public void findall() throws IOException {
//5.使用代理对象执行方法
List<Users> users=UserDaoImpl.findAll();
for(Users u:users){
System.out.println(u);
}
}
}
9.AccountDao.java
package dao;
import entity.Account;
import entity.UsersAccount;
import java.util.List;
public interface AccountDao {
List<Account> findAll();
List<UsersAccount> find();
}
10.AccountDao.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPEmapper
PUBLIC"-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="dao.AccountDao">
<!--定义封装Account和Users的resultMap-->
<resultMap id="accountUsersMap" type="entity.Account">
<id property="aid" column="aid"></id>
<result property="accountname" column="accountname"></result>
<result property="uid" column="uid"></result>
<!--一对一的关系映射,配置封装users的内容-->
<association property="users" column="uid" javaType="entity.Users">
<id property="uid" column="uid"></id>
<result property="username" column="username"></result>
<result property="password" column="password"></result>
</association>
</resultMap>
<!--查询所有 ,内连接-->
<select id="findAll" resultMap="accountUsersMap">
select a.*,u.username,u.password from account a,users u where a.uid=u.uid
</select>
<select id="find" resultType="entity.UsersAccount">
select a.*,u.username,u.password from account a,users u where a.uid=u.uid
</select>
</mapper>
11.AccountTest.java
package test;
import dao.AccountDao;
import dao.UserDao;
import entity.Account;
import entity.Users;
import entity.UsersAccount;
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;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class AccountTest {
private InputStream in;
private SqlSession sqlSession;
private AccountDao AccountDaoImpl;
@Before
public void init() throws IOException {
//1.读取配置文件
in= Resources.getResourceAsStream("SqlMapperConfig.xml");
//2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
SqlSessionFactory factory=builder.build(in);
//3.使用工厂生产SqlSession对象
sqlSession=factory.openSession();
//4.使用SqlSession创建dao接口的代理对象
AccountDaoImpl=sqlSession.getMapper(AccountDao.class);
}
@After
public void destroy() throws IOException {
//提交事务
sqlSession.commit();
//6.释放资源
sqlSession.close();
in.close();
}
/**
* 查询所有
* @throws IOException
*/
@Test
public void findall() throws IOException {
//5.使用代理对象执行方法
List<Account> account=AccountDaoImpl.findAll();
for(Account a:account){
System.out.println(a);
System.out.println(a.getUsers());
}
}
/**
* 查询用户的所有订单
* @throws IOException
*/
@Test
public void find() throws IOException {
//5.使用代理对象执行方法
List<UsersAccount> ua=AccountDaoImpl.find();
for(UsersAccount a:ua){
System.out.println(a);
}
}
}
Mybatis学习笔记之---多表查询(1)的更多相关文章
- Mybatis学习笔记之---多表查询(2)
Mybatis多表查询(2) (一)举例 用户和角色 一个用户可以有多个角色,一个角色可以赋予多个用户 (二)步骤 1.建立两张表:用户表,角色表,让用户表和角色表具有多对多的关系.需要使用中间表,中 ...
- MyBatis学习总结——实现关联表查询(转)
原文链接:孤傲苍狼 一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关 ...
- mybatis学习 十二 多表查询
Mybatis 实现多表查询方式: (1)业务装配.对两个表编写单表查询语句,在业务(Service)把查询的两个结果进行关联. (2)使用Auto Mapping特性,在实现两表联合查询时通过别名完 ...
- MyBatis学习总结(五)——关联表查询的实现
一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...
- Oracle学习笔记_04_多表查询
一.概念: 1.多表连接有以下几种分法: (1)内连接 vs 外连接 (左.右.满) (2)等值连接 vs 不等值连接 (3)非自连 ...
- MySQL学习笔记8——多表查询
多表查询 多表查询 *合并结果集 *连接查询 *子查询 合并结果集 *要求被合并的表中,列的类型和列数相同(实际上是查询的结果集列类型和列数相同即可) *UNION,去除重复行 *UNION ALL, ...
- MySQL数据库学习笔记----MySQL多表查询之外键、表连接、子查询、索引
本章主要内容: 一.外键 二.表连接 三.子查询 四.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复 ...
- MySql 在cmd下的学习笔记 —— 有关多表查询的操作(内连接,外连接,交叉连接)
mysql> create table test5( -> id int, ) -> )engine myisam charset utf8; Query OK, rows affe ...
- Mybatis学习——一对多关联表查询
1.实体类 public class Student { private int id; private String name; } public class Classes { private i ...
随机推荐
- 截图编辑器 PicPick Biz v4.1.6/v5.0.3 Lite 绿色便携版
下载地址:点我 PicPick 是由NGWIN 软件科技公司推出的一款实用的.多功能屏幕截图与图像编辑神器.软件具备屏幕截取.取色器.调色板.放大镜.标尺.量角器.坐标轴.白板等功能,支持全屏.活动窗 ...
- 数据结构丨N叉树
遍历 N叉树的遍历 树的遍历 一棵二叉树可以按照前序.中序.后序或者层序来进行遍历.在这些遍历方法中,前序遍历.后序遍历和层序遍历同样可以运用到N叉树中. 回顾 - 二叉树的遍历 前序遍历 - 首先访 ...
- 【转载】DOMContentLoaded与load的区别
DOMContentLoaded与load的区别 (1)在chrome浏览器的开发过程中,我们会看到network面板中有这两个数值,分别对应网 络请求上的标志线,这两个时间数值分别代表什么? ( ...
- 解决jenkins 发送邮件图片乱码问题
1.在本地mac上测试邮件发送正常 发送邮件内容图片没有乱码 2.公司测试服务器是一台windows2008的系统jmeter + ant jenkins 安装完成后 设置邮件发送格式模板,设置附件 ...
- P4071 [SDOI2016]排列计数 题解
分析: 线性求逆元:https://blog.csdn.net/qq_34564984/article/details/52292502 代码: #include<cstdio> usin ...
- NOIP2018&2013提高组T1暨洛谷P5019 铺设道路
题目链接:https://www.luogu.org/problemnew/show/P5019 花絮:普及蒟蒻终于A了一道提高的题目?emm,写一篇题解纪念一下吧.求过! 分析: 这道题我们可以采用 ...
- 用tcp协议实现一个并发的socketserver 进行密文登录
先在客户端进行摘要,客户端把用户名作为盐. 然后在服务端进行二次摘要,用固定的盐(不能让别人知道你的盐是什么),然后存到文件中,密文存储.或者和文件中的密文对比. 这样即使在网络上用户信息被截获,和存 ...
- python 之 并发编程(线程理论,开启线程的两种方式,进程与线程的区别,线程对象的其他方法)
9.9 线程理论 1.什么是线程 线程指的是一条流水线的工作过程 进程根本就不是一个执行单位,进程其实是一个资源单位,一个进程内自带一个线程,线程才是执行单位 2.进程VS线程 同一进程内的线程们共享 ...
- WGS84坐标与web墨卡托投影坐标转换
许久没有使用坐标转换,记忆有些模糊了,以后还是会用到,先将WGS84与web墨卡托转换复习一下: 1.84转web墨卡托 //核心公式 平面坐标x = 经度*20037508.34/108 平面坐标y ...
- Metrics类型
Metrics类型 在上一小节中我们带领读者了解了Prometheus的底层数据模型,在Prometheus的存储实现上所有的监控样本都是以time-series的形式保存在Prometheus内存的 ...