一、创建部门表和员工表:

创建部门信息表`t_department`,其中包括`id`, `name`

CREATE TABLE t_department (
        id INT AUTO_INCREMENT,
        name VARCHAR(20) UNIQUE NOT NULL,
        PRIMARY KEY(id)
    ) DEFAULT CHARSET=UTF8;

往部门表中插入数据:

INSERT INTO t_department (name) VALUES 
        ('UI'), ('RD'), ('TEST');

创建员工信息表t_user

CREATE TABLE t_user(

  id INT PRIMARY KEY AUTO_INCREMENT,

  username VARCHAR(20) ,

  password VARCHAR(20) ,

  age int ,

  phone VARCHAR(20) ,

  email VARCHAR(20) ,

  is_Delete int

)DEFAULT CHARSET=UTF8;

往员工表中插入数据:

INSERT
INTO t_user
VALUES(null,'张三','123456',23,'110','11111@qq.com',1),(null,'历史','123456',23,'110','11111@qq.com',1),(null,'孙悟空','123456',23,'110','11111@qq.com',2),(null,'李白','123456',23,'110','11111@qq.com',2),(null,'八戒','123456',23,'110','11111@qq.com',2);

插入数据错误:

https://www.cnblogs.com/package-java/p/10494380.html

在查询时,`<select>`节点必须指定结果的类型,可以通过`resultType`属性来指定,也可以通过`resultMap`属性来指定。
 
当有直接对应的查询结果时,可以使用`resultType`,取值一般是实体类的类型,或VO类的类型。
 
某些查询可能需要将查询结果进行特殊的封装,例如查询时存在1对多、多对多、多对1等关系,则需要使用`resultMap`来配置封装的方式。

二、创建实体类:

1、Vo类的实体类,因为部门只有三个,三个部门里面可能有很多员工,所以把员工封装到List集合中,由于将多条信息明细存储到了list中,因此查询后将不再出现重复数据,达到了去重的效果

  1. package cn.tedu.mybatis.vo;
  2.  
  3. import java.io.Serializable;
  4. import java.util.List;
  5.  
  6. import cn.tedu.mybatis.entity.User;
  7.  
  8. public class DepartmentVO implements Serializable {
  9.  
  10. private static final long serialVersionUID = -6442405812964981459L;
  11.  
  12. private Integer did;
  13. private String name;
  14. private List<User> users;
  15.  
  16. public Integer getDid() {
  17. return did;
  18. }
  19.  
  20. public void setDid(Integer did) {
  21. this.did = did;
  22. }
  23.  
  24. public String getName() {
  25. return name;
  26. }
  27.  
  28. public void setName(String name) {
  29. this.name = name;
  30. }
  31.  
  32. public List<User> getUsers() {
  33. return users;
  34. }
  35.  
  36. public void setUsers(List<User> users) {
  37. this.users = users;
  38. }
  39.  
  40. @Override
  41. public String toString() {
  42. return "DepartmentVO [did=" + did + ", name=" + name + ", users=" + users + "]";
  43. }
  44.  
  45. }

2、员工类:

  1. package cn.tedu.mybatis.entity;
  2.  
  3. import java.io.Serializable;
  4.  
  5. public class User implements Serializable {
  6.  
  7. private static final long serialVersionUID = 7323921614984096421L;
  8.  
  9. private Integer id;
  10. private String username;
  11. private String password;
  12. private Integer age;
  13. private String phone;
  14. private String email;
  15. private Integer isDelete;
  16. private Integer did;
  17.  
  18. public Integer getId() {
  19. return id;
  20. }
  21.  
  22. public void setId(Integer id) {
  23. this.id = id;
  24. }
  25.  
  26. public String getUsername() {
  27. return username;
  28. }
  29.  
  30. public void setUsername(String username) {
  31. this.username = username;
  32. }
  33.  
  34. public String getPassword() {
  35. return password;
  36. }
  37.  
  38. public void setPassword(String password) {
  39. this.password = password;
  40. }
  41.  
  42. public Integer getAge() {
  43. return age;
  44. }
  45.  
  46. public void setAge(Integer age) {
  47. this.age = age;
  48. }
  49.  
  50. public String getPhone() {
  51. return phone;
  52. }
  53.  
  54. public void setPhone(String phone) {
  55. this.phone = phone;
  56. }
  57.  
  58. public String getEmail() {
  59. return email;
  60. }
  61.  
  62. public void setEmail(String email) {
  63. this.email = email;
  64. }
  65.  
  66. public Integer getIsDelete() {
  67. return isDelete;
  68. }
  69.  
  70. public void setIsDelete(Integer isDelete) {
  71. this.isDelete = isDelete;
  72. }
  73.  
  74. public Integer getDid() {
  75. return did;
  76. }
  77.  
  78. public void setDid(Integer did) {
  79. this.did = did;
  80. }
  81.  
  82. @Override
  83. public String toString() {
  84. return "User [id=" + id + ", username=" + username + ", password=" + password + ", age=" + age + ", phone="
  85. + phone + ", email=" + email + ", isDelete=" + isDelete + ", did=" + did + "]";
  86. }
  87. }

三、创建接口和抽象方法:

  1. package cn.tedu.mybatis.mapper;
  2.  
  3. import cn.tedu.mybatis.vo.DepartmentVO;
  4.  
  5. public interface DepartmentMapper {
  6.  
  7. DepartmentVO findById(Integer id);
  8.  
  9. }

四、SQL语句的映射:

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
  3. "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
  4.  
  5. <mapper namespace="cn.tedu.mybatis.mapper.DepartmentMapper">
  6. <!-- namespace:抽象类绝对路径 -->
  7. <resultMap id="Department_VO_Map"
  8. type="cn.tedu.mybatis.vo.DepartmentVO">
         <!-- id节点:配置主键 -->
  9. <!-- type:实体类绝对路径 -->
  10. <!-- column:查询结果中的列名 -->
  11. <!-- property:以上type属性对应的数据类型中的属性名(类里面的属性) -->
  12. <id column="did" property="did"/>
  13. <!-- result节点:配置普通字段 -->
  14. <result column="name" property="name"/>
  15. <!-- collection节点:配置List集合类型的属性,用于1对多的查询 -->
  16. <!-- ofType:在List里放的是什么类型 -->
  17. <collection property="users"
  18. ofType="cn.tedu.mybatis.entity.User">
  19. <id column="uid" property="id"/>
  20. <result column="username" property="username"/>
  21. <result column="password" property="password"/>
  22. <result column="age" property="age"/>
  23. <result column="phone" property="phone"/>
  24. <result column="email" property="email"/>
  25. <result column="isDelete" property="isDelete"/>
  26. </collection>
  27. </resultMap>
  28.  
  29. <select id="findById"
  30. resultMap="Department_VO_Map">
  31. SELECT
  32. t_department.id AS did,
  33. name,
  34. t_user.id AS uid,
  35. username,
  36. password,
  37. age,
  38. phone,
  39. email,
  40. is_delete
  41. FROM
  42. t_department
  43. INNER JOIN
  44. t_user
  45. ON
  46. t_user.did=t_department.id
  47. WHERE
  48. t_department.id=#{id}
  49. </select>
  50.  
  51. </mapper>

> 以上代码中,自定义别名是因为需要区分查询结果中的列的名称,并不是因为需要与数据类型中的属性对应,关于查询结果的列名与数据类型的属性名的对应,可以通过`<resultMap>`中的配置来完成!

五、测试:

  1. package cn.tedu.mybatis.mapper;
  2.  
  3. import org.junit.After;
  4. import org.junit.Before;
  5. import org.junit.Test;
  6. import org.springframework.context.support.AbstractApplicationContext;
  7. import org.springframework.context.support.ClassPathXmlApplicationContext;
  8.  
  9. import cn.tedu.mybatis.vo.DepartmentVO;
  10.  
  11. public class DepartmentMapperTestCase {
  12.  
  13. AbstractApplicationContext ac;
  14. DepartmentMapper mapper;
  15.  
  16. @Before
  17. public void doBefore() {
  18. ac = new ClassPathXmlApplicationContext("spring-dao.xml");
  19. mapper = ac.getBean("departmentMapper", DepartmentMapper.class);
  20. }
  21.  
  22. @After
  23. public void doAfter() {
  24. ac.close();
  25. }
  26.  
  27. @Test
  28. public void findById() {
  29. Integer id = 2;
  30. DepartmentVO data
  31. = mapper.findById(id);
  32. System.out.println(data);
  33. }
  34.  
  35. }

Mybatis中<resultMap>用法(主要用于一对多去重)的更多相关文章

  1. mybatis中resultMap配置细则

    resultMap算是mybatis映射器中最复杂的一个节点了,能够配置的属性较多,我们在mybatis映射器配置细则这篇博客中已经简单介绍过resultMap的配置了,当时我们介绍了resultMa ...

  2. Mybatis中resultMap的基础配置

    一.概述 resultMap 元素是 MyBatis 中最重要最强大的元素.它就是让你远离 90%的需要从结果集中取出数据的 JDBC 代码的那个东西,而且在一些情形下允许你做一些 JDBC 不支持的 ...

  3. mybatis中resultMap的使用

    在mybatis中,使用<select>标签,必须要设置resultType属性 或 resultMap属性 否则会报错! resultType一般是返回简单类型的查询结果,涉及一张表 可 ...

  4. 在mybatis中resultMap与resultType的区别

    MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMapresultType是直接表示返回类型的,而resultMap则是对外部ResultMa ...

  5. Mybatis中resultMap与resultType区别

    MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则是对外部ResultM ...

  6. mybatis中resultMap引发的吐血bug

    简单的讲: 问题背景:如果在写mybatis中的resultMap时,不下心将resultMapde id写成映射接口的名字,会发生什么? 结论:单元测试进度条卡住但不报错, Tomcat运行不报错, ...

  7. MyBatis 中 resultMap 详解

    resultMap 是 Mybatis 最强大的元素之一,它可以将查询到的复杂数据(比如查询到几个表中数据)映射到一个结果集当中.如在实际应用中,有一个表为(用户角色表),通过查询用户表信息展示页面, ...

  8. mybatis中实现一对一,一对多查询

    在实际的开发中我们经常用到的是一对一查询和一对多查询.而多对多的实现是通过中间来实现,这里就没有给出来了 比如: 订单和用户是一对一的关系(一个订单只能对应一个用户) 订单和订单明细是一对多的关系(一 ...

  9. MyBatis中collection (一对一,一对多)

    MyBatis学习:http://www.mybatis.org/mybatis-3/zh/index.html 大对象InsuranceDetailsVO: com.quicksure.mobile ...

随机推荐

  1. c#初学12-12-为什么mian函数必须是static的

    c#初学12-12-为什么mian函数必须是static的 c#程序刚开始启动的时候都会有唯一一个入口函数main()函数, 而非静态成员又称实例成员,必须作用于实例.在程序刚开始运行的时候,未建立任 ...

  2. GCC中的弱符号与强符号

    GCC中的弱符号与强符号 我们经常在编程中碰到一种情况叫符号重复定义.多个目标文件中含有相同名字全局符号的定义,那么这些目标文件链接的时候将会出现符号重复定义的错误.比如我们在目标文件A和目标文件B都 ...

  3. easyUI datagrid表头的合并

    图列: js代码 function initConfigTable(param){ $("#mulConfigureTableBox").empty(); $("#mul ...

  4. Xcode10适配——Error:Multiple commands produce

    今天苹果正式推送了iOS12,今天上午就更新了最新的iOS,及Xcode10.这次更新还行,不需要我们对以前的项目紧急修复,大动手术. 用Xcode10跑之前的项目,也就报了一种类型的错误:Multi ...

  5. Vue双向绑定原理(源码解析)---getter setter

       Vue双向绑定原理      大部分都知道Vue是采用的是对象的get 和set方法来实现数据的双向绑定的过程,本章将讨论他是怎么利用他实现的. vue双向绑定其实是采用的观察者模式,get和s ...

  6. UVALive-8077 Brick Walls 找规律

    题目链接:https://cn.vjudge.net/problem/UVALive-8077 题意 有一个用砖头磊起来的墙,现在又有一只蚂蚁,想沿着砖缝从起点跑到终点. 问最短路长度. 思路 找规律 ...

  7. [中文] 以太坊(Ethereum )白皮书

    以太坊(Ethereum ):下一代智能合约和去中心化应用平台 翻译|巨蟹 .少平 译者注|中文读者可以到以太坊爱好者社区(www.ethfans.org)获取最新的以太坊信息. 当中本聪在2009年 ...

  8. MHA 主从切换过程及日志分析

    本文主要在MHA 切换日志的角度分析MHA切换的过.MHA故障切换过程如下图所示 第一部分:开启MHA 监控 通过分析日志,得到以下步骤: 1.读取MHA manager 节点的配置文件,并检查配置文 ...

  9. 紫书 例题8-2 UVa 11605(构造法)

    这道题方法非常的巧妙, 两层的n*n, 第一层第I行全是第I个国家, 第二层的第j列全是第j个国家.这样能符合题目的条件.比如说第1个国家, 在第一层的第一行全是A, 然后在第二层的第一行就有ABCD ...

  10. 【转】C# winform 加载网页 模拟键盘输入自动接入访问网络

    [转]C# winform 加载网页 模拟键盘输入自动接入访问网络 声明: 本文原创,首发于博客园 http://www.cnblogs.com/EasyInvoice/p/6070563.html  ...