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 ...
随机推荐
- 实战Spring4+ActiveMQ整合实现消息队列(生产者+消费者)
引言: 最近公司做了一个以信息安全为主的项目,其中有一个业务需求就是,项目定时监控操作用户的行为,对于一些违规操作严重的行为,以发送邮件(ForMail)的形式进行邮件告警,可能是多人,也可能是一个人 ...
- 20190716 NOIP模拟测试4 考试反思
总分 127分 满分300 第一题 礼物 10分 一道期望题,看起来挺简单,但对于概率与期望这一块我还不怎么会,花了一个小时调他,最后只QJ了一下10%的测试点 第二题 通讯 90分 显然的缩点求解, ...
- 树链剖分 [JLOI2014]松鼠的新家
[JLOI2014]松鼠的新家 时间限制: 1 Sec 内存限制: 128 MB 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达, ...
- Java开发实例大全:3月14日练习
import java.io.FileNotFoundException; import java.io.PrintStream; import java.math.BigDecimal; impor ...
- kali linux上安装ssh
1.暂停kali上的ssh进程 root@kali:~# sudo stop ssh 2.卸载ssh服务 root@kali:~# apt-get remove openssh-server 这里可能 ...
- 使用nvm管理多个不同版本的nodeJS之安装成功nodeJs之后使用npm报错的问题
使用nvm安装nodeJS之后,node -v命令可以正常使用,但是npm命令一直报“npm不是内部命令”的错误,深入研究之后得到以下解决方案: 搭建步骤: (1)下载nvm https://gi ...
- C#5.0新增功能01 异步编程
连载目录 [已更新最新开发文章,点击查看详细] 如果需要 I/O 绑定(例如从网络请求数据或访问数据库),则需要利用异步编程. 还可以使用 CPU 绑定代码(例如执行成本高昂的计算),对编写异步 ...
- python迭代器-迭代器取值-for循环-生成器-yield-生成器表达式-常用内置方法-面向过程编程-05
迭代器 迭代器 迭代: # 更新换代(其实也是重复)的过程,每一次的迭代都必须基于上一次的结果(上一次与这一次之间必须是有关系的) 迭代器: # 迭代取值的工具 为什么用迭代器: # 迭代器提供了一种 ...
- thinkphp 数据库操作
//所有的数据中,查出某个字段$result = $music->field('music')->select();$hotlist = M('News')->where('stat ...
- IIS身份验证和文件操作权限(一、身份验证配置)
最近有一个项目服务器需要升级,主要是Web项目.因为以前是只写代码,不管发布.所以在环境构筑方面就出现自己的知识盲点.盲点一:IIS的身份验证的作用盲点二:IIS的身份验证和文件操作权限的关系(重点) ...