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

创建部门信息表`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中,因此查询后将不再出现重复数据,达到了去重的效果

package cn.tedu.mybatis.vo;

import java.io.Serializable;
import java.util.List; import cn.tedu.mybatis.entity.User; public class DepartmentVO implements Serializable { private static final long serialVersionUID = -6442405812964981459L; private Integer did;
private String name;
private List<User> users; public Integer getDid() {
return did;
} public void setDid(Integer did) {
this.did = did;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public List<User> getUsers() {
return users;
} public void setUsers(List<User> users) {
this.users = users;
} @Override
public String toString() {
return "DepartmentVO [did=" + did + ", name=" + name + ", users=" + users + "]";
} }

2、员工类:

package cn.tedu.mybatis.entity;

import java.io.Serializable;

public class User implements Serializable {

    private static final long serialVersionUID = 7323921614984096421L;

    private Integer id;
private String username;
private String password;
private Integer age;
private String phone;
private String email;
private Integer isDelete;
private Integer did; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} 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 Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} public String getPhone() {
return phone;
} public void setPhone(String phone) {
this.phone = phone;
} public String getEmail() {
return email;
} public void setEmail(String email) {
this.email = email;
} public Integer getIsDelete() {
return isDelete;
} public void setIsDelete(Integer isDelete) {
this.isDelete = isDelete;
} public Integer getDid() {
return did;
} public void setDid(Integer did) {
this.did = did;
} @Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", password=" + password + ", age=" + age + ", phone="
+ phone + ", email=" + email + ", isDelete=" + isDelete + ", did=" + did + "]";
}
}

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

package cn.tedu.mybatis.mapper;

import cn.tedu.mybatis.vo.DepartmentVO;

public interface DepartmentMapper {

    DepartmentVO findById(Integer id);

}

四、SQL语句的映射:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd"> <mapper namespace="cn.tedu.mybatis.mapper.DepartmentMapper">
<!-- namespace:抽象类绝对路径 -->
<resultMap id="Department_VO_Map"
type="cn.tedu.mybatis.vo.DepartmentVO">
     <!-- id节点:配置主键 -->
<!-- type:实体类绝对路径 -->
<!-- column:查询结果中的列名 -->
<!-- property:以上type属性对应的数据类型中的属性名(类里面的属性) -->
<id column="did" property="did"/>
<!-- result节点:配置普通字段 -->
<result column="name" property="name"/>
<!-- collection节点:配置List集合类型的属性,用于1对多的查询 -->
<!-- ofType:在List里放的是什么类型 -->
<collection property="users"
ofType="cn.tedu.mybatis.entity.User">
<id column="uid" property="id"/>
<result column="username" property="username"/>
<result column="password" property="password"/>
<result column="age" property="age"/>
<result column="phone" property="phone"/>
<result column="email" property="email"/>
<result column="isDelete" property="isDelete"/>
</collection>
</resultMap> <select id="findById"
resultMap="Department_VO_Map">
SELECT
t_department.id AS did,
name,
t_user.id AS uid,
username,
password,
age,
phone,
email,
is_delete
FROM
t_department
INNER JOIN
t_user
ON
t_user.did=t_department.id
WHERE
t_department.id=#{id}
</select> </mapper>

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

五、测试:

package cn.tedu.mybatis.mapper;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import cn.tedu.mybatis.vo.DepartmentVO; public class DepartmentMapperTestCase { AbstractApplicationContext ac;
DepartmentMapper mapper; @Before
public void doBefore() {
ac = new ClassPathXmlApplicationContext("spring-dao.xml");
mapper = ac.getBean("departmentMapper", DepartmentMapper.class);
} @After
public void doAfter() {
ac.close();
} @Test
public void findById() {
Integer id = 2;
DepartmentVO data
= mapper.findById(id);
System.out.println(data);
} }

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. VC工程里,如何编译汇编语言的文件

    最近老是有朋友问,VC工程里,如何编译汇编语言的文件,接下来就说一下步骤: 1.将汇编语言文件,加入到工程里: 2.在Solution Explorer窗口中右键单击Visual C++项目,选择Bu ...

  2. c# ExecuteScalar()

    ExecuteScalar这个方法是从数据库中检索单个值返回值是object类型,必须用与它在数据库里存放的类型相同类型或者可以转换成的类型,比如数据是nchar类型值为 "123" ...

  3. Unity 导入的模型检测不到碰撞

    解决方案 添加Mesh Collider和rigidbody,并且Collider里边2个勾要勾上. 这是我碰到的问题.如果没解决你的问题,别打我,逃~

  4. router+x

    vue-router官方的路由管理器 包含的功能: ——绑定方法进行跳转   路由嵌套   写的不一样搜索的路由路径也不一样   二级路由   设置默认路由   导航守卫: 用于强制跳转或者取消的方式 ...

  5. BZOJ 3527: [Zjoi2014]力 FFT_卷积

    Code: #include <cmath> #include <cctype> #include <cstdio> #include <cstring> ...

  6. 【WPF】这可能是全网最全的拖拽实现方法的总结

    原文地址 https://www.cnblogs.com/younShieh/p/10811456.html 前文 本文只对笔者学习掌握的一般的拖动问题的实现方法进行整理和讨论,包括窗口.控件等内容的 ...

  7. ECharts树图节点过多时取消缩放,调整容器高度自适应内容变化

    问题现象 使用ECharts树图,在数据维度大,节点过多时,所看到的内容会重叠交错,无法查看. 原因 在给定ECharts树图容器尺寸后,无论数据多么庞大或者稀少,数据始终会尝试在给定容器内撑满.全部 ...

  8. webpack实战---安装操作

    什么是webpack? 他有什么优点?     首先对于很多刚接触webpack人来说,肯定会问webpack是什么?它有什么优点?我们为什么要使用它?     Webpack是前端一个工具,可以让各 ...

  9. ASP.NET-dropdownlist默认值

    可以在第三个选项中定义一个默认值,但是返回数据的时候就不需要这种类似"请选择名称"之类的提示了,所以在构造seleclt option的时候,要在option中的属性中加上sele ...

  10. [Google Guava] 2.2-新集合类型

    转自:并发编程网 原文链接:http://ifeve.com/google-guava-newcollectiontypes/ 链接博客其他文章中还有更多的guava其他功能的描述,有空可慢慢看. G ...