准备工作

新建项目day03_eesy_03one2many复制day03_eesy_02dynamicSQL项目

1.账户表创建

CREATE TABLE `account` (`ID` INT(11) NOT NULL COMMENT '编号',`UID` INT(11) DEFAULT NULL COMMENT '用户编号',`MONEY` DOUBLE DEFAULT NULL COMMENT '金额',PRIMARY KEY  (`ID`),KEY `FK_Reference_8` (`UID`),CONSTRAINT `FK_Reference_8` FOREIGN KEY (`UID`) REFERENCES `user` (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
INSERT  INTO `account`(`ID`,`UID`,`MONEY`)
VALUES (1,46,1000),(2,45,1000),(3,46,2000);

2.User和Account实体类

//User未写get和set方法以及toString
public class User implements Serializable {private Integer id;private String username;private String sex;private String address;private Date birthday;
}
//Account未写get和set方法以及toString
public class Account implements Serializable {private Integer id;private Integer uid;private Double money;
}

3.IUserDao和IAccount接口

public interface IAccountDao {//查询所有账户List<Account> findAll();
}public interface IUserDao {//查询所有List<User> findAll();//根据id查询用户信息User findById(Integer userId);}

4.IUserDao.xml和IAccountDao.xml映射文件

//IUserDao.xml
<mapper namespace="com.itheima.dao.IUserDao"><!--查询所有--><select id="findAll" resultType="user">select * from user</select><!--根据id查询用户--><select id="findById" parameterType="INT" resultType="user">select * from user where id=#{userId};</select>
</mapper>
//IAccountDao.xml
<mapper namespace="com.itheima.dao.IAccountDao"><!--查询所有--><select id="findAll" resultType="account">select * from account</select>
</mapper>

5.AccountTest和MybatisTest测试类

//IAccountTestpublic class AccountTest {private InputStream in;private SqlSession sqlSession;private IAccountDao accountDao;//为了避免重复操作,将每次的初始化放到一个方法中@Before//用于在测试方法执行之前执行public void init() throws IOException {//1.读取配置文件in= Resources.getResourceAsStream("SqlMapConfig.xml");//2.获取SqlSessionFactory对象SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(in);//3.获取SqlSession对向sqlSession=factory.openSession(true);//4.获取代理对象accountDao=sqlSession.getMapper(IAccountDao.class);}//释放资源,放到一个方法中@After//测试方法执行之后执行public void destroy() throws IOException {//提交事务,否则不能执行成功(因为不允许自动提交事务)//sqlSession.commit();//6.释放资源sqlSession.close();in.close();}//测试查询所有@Testpublic void testFindAll(){List<Account> accounts=accountDao.findAll();for (Account account:accounts){System.out.println(account);}}
}//MybatisTest
public class MybatisTest {private InputStream in;private SqlSession sqlSession;private IUserDao userDao;//为了避免重复操作,将每次的初始化放到一个方法中@Before//用于在测试方法执行之前执行public void init() throws IOException {//1.读取配置文件in= Resources.getResourceAsStream("SqlMapConfig.xml");//2.获取SqlSessionFactory对象SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(in);//3.获取SqlSession对向sqlSession=factory.openSession(true);//4.获取代理对象userDao=sqlSession.getMapper(IUserDao.class);}//释放资源,放到一个方法中@After//测试方法执行之后执行public void destroy() throws IOException {//提交事务,否则不能执行成功(因为不允许自动提交事务)//sqlSession.commit();//6.释放资源sqlSession.close();in.close();}//查询所有@Testpublic void testFindAll() throws IOException {//5.执行方法List<User> users = userDao.findAll();for (User user : users) {System.out.println(user);}}
}

6.测试AccountTest类

查询所有账户,同时包含用户名称和地址,通过Account子类实现方式

account到user的一对一的查询

//IAccountDao接口//查询所有账户,并且带有用户名称和地址信息List<AccountUser> findAllAccount();//IAcountDao.xml映射文件
<!--查询所有账户同时包含用户名和地址信息--><select id="findAllAccount" resultType="accountuser">select a.*,u.username,u.address from account a,user uwhere u.id=a.uid</select>//AccountUser实体类
package com.itheima.domain;public class AccountUser extends Account{private String username;private String address;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}@Overridepublic String toString() {return super.toString()+"    AccountUser{" +"username='" + username + '\'' +", address='" + address + '\'' +'}';}
}//AccountTest测试类//测试查询所有账户,同时包含用户名称和地址@Testpublic void findAllAccount(){List<AccountUser> aus=accountDao.findAllAccount();for (AccountUser au:aus){System.out.println(au);}}

测试结果:

建立实体类关系的方式

//Account实体类//从表实体应该包含一个主表实体的对象引用private User user;public User getUser() {return user;}public void setUser(User user) {this.user = user;}//IAccountDao.xml映射文件<!--定义封装account和user的resultMap--><resultMap id="accountUserMap" type="account"><id property="id" column="aid"></id><result property="uid" column="uid"></result><result property="money" column="money"></result><!--一对一关系映射,配置封装user的内容--><association property="user" column="uid" javaType="user"><id property="id" column="id"></id><result property="username" column="username"></result><result property="address" column="address"></result><result property="sex" column="sex"></result><result property="birthday" column="birthday"></result></association></resultMap><!--查询所有--><select id="findAll" resultMap="accountUserMap">select u.*,a.id as aid,a.uid,a.money from account a,user uwhere u.id=a.uid</select>
//AccountTest测试类//测试查询所有@Testpublic void testFindAll(){List<Account> accounts=accountDao.findAll();for (Account account:accounts){System.out.println("---------每个account信息------------");System.out.println(account);System.out.println(account.getUser());}}

测试结果

User到account一对多的查询

//User实体类,多加入一个属性//一对多关系映射,主表实体应该包含从表实体的集合引用private List<Account> accounts;public List<Account> getAccounts() {return accounts;}public void setAccounts(List<Account> accounts) {this.accounts = accounts;}//IUserDao接口//查询所有,同时获取用户下所有账户的信息List<User> findAll();//IUserDao.xml映射文件<!--定义User的resultMap--><resultMap id="userAccountMap" type="user"><id property="id" column="id"></id><result property="username" column="username"></result><result property="address" column="address"></result><result property="sex" column="sex"></result><result property="birthday" column="birthday"></result><!--配置user对象中accounts集合的映射,property是配置集合的名字ofType是集合元素类型accounts--><collection property="accounts" ofType="account"><id property="id" column="id"></id><result property="uid" column="uid"></result><result property="money" column="money"></result></collection></resultMap><!--查询所有--><select id="findAll" resultMap="userAccountMap">select * from user u left outer join account a on u.id=a.uid
</select>//UserTest测试类//查询所有@Testpublic void testFindAll()  {//5.执行方法List<User> users = userDao.findAll();for (User user : users) {System.out.println("------每个用户信息-------");System.out.println(user);System.out.println(user.getAccounts());}}

测试结果:

多对多查询

1.创建role表和user_role表

CREATE TABLE `role` (`ID` INT(11) NOT NULL COMMENT '编号',`ROLE_NAME` VARCHAR(30) DEFAULT NULL COMMENT '角色名称',`ROLE_DESC` VARCHAR(60) DEFAULT NULL COMMENT '角色描述',PRIMARY KEY  (`ID`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
INSERT  INTO `role`(`ID`,`ROLE_NAME`,`ROLE_DESC`)
VALUES (1,'院长','管理整个学院'),(2,'总裁','管理整个公司'),(3,'校长','管理整个学校');
CREATE TABLE `user_role` (`UID` INT(11) NOT NULL COMMENT '用户编号',`RID` INT(11) NOT NULL COMMENT '角色编号',PRIMARY KEY  (`UID`,`RID`),KEY `FK_Reference_10` (`RID`),CONSTRAINT `FK_Reference_10` FOREIGN KEY (`RID`) REFERENCES `role` (`ID`),CONSTRAINT `FK_Reference_9` FOREIGN KEY (`UID`) REFERENCES `user` (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
INSERT  INTO `user_role`(`UID`,`RID`) VALUES (41,1),(45,1),(41,2);

2.Role实体类

public class Role implements Serializable {private Integer roleId;private String roleName;private String roleDesc;
}
//对应的get和set以及toString已省略

3.IRoleDao接口

package com.itheima.dao;import com.itheima.domain.Role;import java.util.List;public interface IRoleDao {//查询所有角色List<Role> findAll();
}

4.IRoleDao.xml映射文件

<mapper namespace="com.itheima.dao.IRoleDao"><!--查询所有--><!--定义role表的ResultMap--><resultMap id="roleMap" type="role"><id property="roleId" column="id"></id><result property="roleName" column="role_name"></result><result property="roleDesc" column="role_desc"></result></resultMap><select id="findAll" resultMap="roleMap">select * from role;</select>
</mapper>

基本配置完成,接下来实现多对多

实现所有角色,以及对应的用户信息

//Role实体类//多对多的关系映射,一个角色可以赋予多个用户private List<User> users;public List<User> getUsers() {return users;}public void setUsers(List<User> users) {this.users = users;}//IRoleDao.xml映射文件<mapper namespace="com.itheima.dao.IRoleDao"><!--查询所有--><!--定义role表的ResultMap--><resultMap id="roleMap" type="role"><!--column参数是sql语句查询后结果的返回封装,要根据查询后数据库表进行判断column值--><id property="roleId" column="rid"></id><result property="roleName" column="role_name"></result><result property="roleDesc" column="role_desc"></result><collection property="users" ofType="user"><id property="id" column="id"></id><result property="username" column="username"></result><result property="address" column="address"></result><result property="sex" column="sex"></result><result property="birthday" column="birthday"></result></collection></resultMap><!--查询所有--><select id="findAll" resultMap="roleMap">select u.*,r.id rid,r.role_name,r.role_desc from role rleft join user_role ur on r.id=ur.ridleft join user u on u.id=ur.uid</select>
</mapper>//RoleTest测试类//查询所有@Testpublic void testFindAll()  {//5.执行方法List<Role> roles = roleDao.findAll();for (Role role : roles) {System.out.println("------每个role信息-------");System.out.println(role);System.out.println(role.getUsers());}}

测试结果

实现用户到角色的1对多关系

//User实体类//多对多关系映射,一个用户可以有多个角色private List<Role> roles;public List<Role> getRoles() {return roles;}public void setRoles(List<Role> roles) {this.roles = roles;}//IUserDao.xml映射文件
<mapper namespace="com.itheima.dao.IUserDao"><!--定义User的resultMap--><resultMap id="userMap" type="user"><id property="id" column="id"></id><result property="username" column="username"></result><result property="address" column="address"></result><result property="sex" column="sex"></result><result property="birthday" column="birthday"></result><!--配置角色集合的映射--><collection property="roles" ofType="role"><id property="roleId" column="rid"></id><result property="roleName" column="role_name"></result><result property="roleDesc" column="role_desc"></result></collection></resultMap><!--查询所有--><select id="findAll" resultMap="userMap">select u.*,r.id rid,r.role_name,r.role_desc from user uleft join user_role ur on u.id=ur.uidleft join role r on r.id=ur.rid
</select>//UserTest测试文件//查询所有@Testpublic void testFindAll()  {//5.执行方法List<User> users = userDao.findAll();for (User user : users) {System.out.println("------每个用户信息-------");System.out.println(user);System.out.println(user.getRoles());}}

测试结果:

Mybatis(14)多表查询相关推荐

  1. 【Mybatis】MyBatis 实现多表查询

    大纲 Auto Mapping 单表实现(别名方式) <resultMap>实现单表配置 单个对象关联查询(N+1,外连接) 集合对象关联查询 注解开发 MyBatis 运行原理 准备:创 ...

  2. MyBatis 实现多表查询、resultMap 标签、MyBatis 注解、mybatis运行原理

    内容 Auto Mapping 单表实现(别名方式) 实现单表配置 单个对象关联查询(N+1,外连接) 集合对象关联查询 注解开发 MyBatis 运行原理 一.MyBatis 实现多表查询 Myba ...

  3. 【MyBatis】多表查询

    MyBatis的多表查询 表之间的关系:一对多,多对一,一对一,多对多. 一对多:一个班级对应多个学生 多对一:多个学生对应一个班级 一对一:一个人对应一个身份证号码 多对多:一个订单可以有多个商品, ...

  4. mybatis分页多表查询

    mybatis分页多表查询 我们常遇到一种情况,数据量比较大,如果使用前台分页,在前台如果有权限,有逻辑判断,都会大大降低页面加载的速度,我们需要分页,单表查询的网上方法很多,这里就不赘余了,多表关联 ...

  5. Mybatis实现关联表查询

    Mybatis实现关联表查询 6.1. 一对一关联 1). 提出需求 根据班级 id 查询班级信息(带老师的信息) 2). 创建表和数据 [](javascript:void(0)

  6. Mybatis连3表查询数据resultMap结果映射

    Mybatis连结3表查询数据resultMap结果映射 一.前言 Mybatis实现了sql与java代码的分离,达到了解耦合的目的,配置sql语句时有个resultType="" ...

  7. Mybatis系列(三):Mybatis实现关联表查询

    原文链接:http://www.cnblogs.com/xdp-gacl/p/4264440.html 一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 ...

  8. Mybatis 实现关联表查询

    一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...

  9. MyBatis 实现关联表查询

    一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...

  10. MyBatis中多表查询(多表查询语句实现)重点

    –查询所有学生所在班级的信息(一对一) –班级查询学生的操作(一对多) –遇到的问题: 查询的SQL语句非常的简单,但是如何把查询的数据接受这个就是一个问题 [1]把每一个实体中的字段拿出来组建成一个 ...

最新文章

  1. Dask.distributed创建client时出现报错
  2. C语言--switch case语句
  3. ADB 操作手机的粘贴板
  4. caffe检测图片是否包含人脸_caffe入门-人脸检测1
  5. mysql 递归_「MySQL」 - SQL Cheat Sheet - 未完成
  6. python的cubes怎么使用_如何使用python中的opengl?
  7. 报错,npm ERR! code ENOLOCAL
  8. paip.ecshop邮件模板修改一个密码找回 一个留言回复
  9. Python入门之经典函数实例
  10. 光照贴图(个人笔记)
  11. python右对齐 数字,python怎么让数字右对齐
  12. wps画流程图交叉弧形_word流程图-WPS绘制流程图的正确打开方式,超级简单
  13. npm安装依赖报错:npm ERR! A complete log of this run can be found in: npm ERR! C:\Users\misal\AppData\R
  14. 生成领料单(编号:20110704A1153)
  15. 遇到这样的事,是挺难受的
  16. 索尼手机android怎么连,索尼SmartWatch 2 SW2 连接手机图文教程
  17. 新一代的数据库备份解决方案--Oracle数据库
  18. maven 设置打包路径为模块_Maven项目的子模块不能打成jar包输出到lib目录
  19. 解三元一次方程c语言,解三元一次方程的c语言程序
  20. java pdm 解析_GitHub - resgain/PDMParser: PDMParser是一个用来解析Powerdesigner pdm文件的一个简单工具...

热门文章

  1. 台式机也颤抖!ROG Strix S5AS性能强悍到底
  2. Dubbo 新编程模型之外部化配置 1
  3. 配置LINUX的DNS主辅服务器
  4. redis源码阅读--hashTable
  5. mysql format 格式化 返回值
  6. wxString中文出错的解决方法
  7. SVN 代码迁出,导出,同步至生产环境脚本
  8. php $_post多个,使用PHP检查多个$ _ POST字词
  9. 信息学奥赛一本通 2033:【例4.19】阶乘之和
  10. 信息学奥赛一本通(2029:【例4.15】水仙花数)