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 ...
随机推荐
- CentOS中对MySql的root用户重置密码
由于一般的修改ini文件来完成无密码登录数据库容易造成较大风险,所以使用修改启动服务参数的方式来更新user表,达到无密码登陆的目的. 1.关闭系统下运行的mysql服务 (1)杀掉进程号达到关闭目的 ...
- Java第四次作业——面向对象高级特性(继承和多态)
Java第四次作业--面向对象高级特性(继承和多态) (一)学习总结 1.学习使用思维导图对Java面向对象编程的知识点(封装.继承和多态)进行总结. 2.阅读下面程序,分析是否能编译通过?如果不能, ...
- RDBMS与数据库之间的关系
什么是数据库? 数据库就是用来存放数据的仓库,它是一种特殊的文件. 什么是关系型数据库? 关系型数据库就是指建立在关系模型基础上的数据库,通常由多张表组成,这些表之间存在一定的关系. 什么是RDBMS ...
- 《Graph Neural Networks: A Review of Methods and Applications》阅读笔记
本文是对文献 <Graph Neural Networks: A Review of Methods and Applications> 的内容总结,详细内容请参照原文. 引言 大量的学习 ...
- python+selenium 批量执行时出现随机报错问题【已解决】
出现场景:用discover方法批量执行py文件,出现随机性的报错(有时a.py报错,有时b.py报错...),共同特点:均是打开新窗口后,切换最新窗口,但定位不到新窗口的元素,超时报错.由于个人项目 ...
- linux weblogic12.1.3.0卸载过程
主要是一开始以为跟之前版本一样有uninstall.sh,但却找不到. 最后google 才发现改了个名字,deinstall.sh 可能后面的版本都是这个脚本了吧. 先进入脚本目录,命令:cd /h ...
- 什么是常量?变量? if语句介绍
1.python 的历史 2004 年 Django 的产生 phyton2与 python3 的区别 Python2:源码不统一,有重复的代码功能 Python3:源码统一,没有有重复的代码功能 2 ...
- CF356E - Xenia and String Problem
也许更好的阅读体验 \(\mathcal{Description}\) 定义一种字符串\(gray\)串满足: 长度为奇数 正中间的字母只出现一次 左右两端相同,左右两端也是gray串 一个\(gra ...
- Hadoop值Partition分区
分区操作 为什么要分区? 要求将统计结果按照条件输出到不同文件中(分区).比如:将统计结果按 照手机归属地不同省份输出到不同文件中(分区) 默认 partition 分区 /** 源码中:numRed ...
- C++ Primer 第五版 一些遇到的注意点记录。
第8章 8.2 p283 示例里有一句 ostream *old_tie = cin.tie(nullptr);//old_tie指向当前关联到cin的流 一开始不理解为什么不是无关联,查过tie() ...