Mybatis最入门---ResultMaps实例篇(一对多查询)

[一步是咫尺,一步即天涯]

接上文,我们来演示在实际开发中,如何配置和使用resultMap实现一对多查询。

准备工作:

a.操作系统 :win7 x64

b.基本软件:MySQL,Mybatis,Spring,SQLyog,Tomcat,web基础

特别的,作为演示程序,还请各位看官不要纠结数据库的细节内容

-------------------------------------------------------------------------------------------------------------------------------------

1.首先,复制上文工程,重命名为Mybatis05,工程结构图如下:

2.上文中,我们演示了:一个人对应一条个人信息。但是,如果我们根据部门来查询用户的话,就是典型的一对多的关系了。为了演示一对多关系查询的实现,我们需要现在数据库中,创建一个部门表。所有表结构如下:

各表中的数据如下:

3.鉴于篇幅的关系,重复的文件请各位看官参照上文创建,这里我们只说明有修改的文件。

4.新增Departments.java文件,具体内容如下:

package com.csdn.ingo.entity;

import java.io.Serializable;
import java.util.List;

/**
*@author 作者 E-mail:ingo
*@version 创建时间:2016年4月21日下午9:07:15
*类说明
*/
@SuppressWarnings("serial")
public class Departments implements Serializable{

	private String id;
	private String departmentName;
	private List<UserInfo> userInfos;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getDepartmentName() {
		return departmentName;
	}
	public void setDepartmentName(String departmentName) {
		this.departmentName = departmentName;
	}
	public List<UserInfo> getUserInfos() {
		return userInfos;
	}
	public void setUserInfos(List<UserInfo> userInfos) {
		this.userInfos = userInfos;
	}
	public Departments(String id, String departmentName, List<UserInfo> userInfos) {
		super();
		this.id = id;
		this.departmentName = departmentName;
		this.userInfos = userInfos;
	}
	public Departments() {
		super();
		// TODO Auto-generated constructor stub
	}
	@Override
	public String toString() {
		return "Departments [id=" + id + ", departmentName=" + departmentName + ", userInfos=" + userInfos.toString() + "]";
	}

}

5.新增DepartmentsDao.java文件,具体内容如下:

package com.csdn.ingo.dao;

import com.csdn.ingo.entity.Departments;

/**
*@author 作者 E-mail:ingo
*@version 创建时间:2016年4月21日下午9:09:33
*类说明
*/
public interface DepartmentsDao {
	Departments findDepartmentById(String id);
}

6.新增DepartmentsDaoMapper.xml文件,具体内容如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.csdn.ingo.dao.DepartmentsDao">
	<resultMap type="Departments" id="DepartmentsResult">
		<id property="id" column="id" />
		<result property="departmentName" column="departmentName" />
		<collection property="userInfos" column="id" select="com.csdn.ingo.dao.UserInfoDao.findUserInfoByDepartmentId"></collection>
	</resultMap>
	<select id="findDepartmentById" parameterType="String" resultMap="DepartmentsResult">
		select * from departments where id=#{id}
	</select>
</mapper> 

7.修改UserInfoDao.java,具体内容如下:

public interface UserInfoDao {
	UserInfo findUserInfoById(String id);

	UserInfo findUserInfoByDepartmentId(String id);
}

8.在UserInfoMapper.xml,新增如下内容:

<select id="findUserInfoByDepartmentId" parameterType="String" resultMap="UserInfoResult">
		select * from userinfo where department=#{id}
	</select> 

9.新增单元测试方法:

@Test
	public void testSeletDepartment() {
		DepartmentsDao userDao = sqlSession.getMapper(DepartmentsDao.class);
		String id = "2";
		Departments curUser = userDao.findDepartmentById(id);
		if(curUser!=null){
			log.info("成功找到用户:"+curUser.toString());
		}

10.测试方法,运行单元测试方法,观察控制台有如下输出:

成功找到用户:Departments [id=2, departmentName=销售部, userInfos=[UserInfo [userid=customer, department=2, position=售前, mobile=33334444, gender=1, [email protected]], UserInfo [userid=customer2, department=2, position=售后, mobile=55556666, gender=1, [email protected]]]]
 INFO [main] - 方法执行后调用

鉴于截图大小的关系,我们单独给出运行结果,请各位读者做参考。

--------------------------------------------------------------------------------------------------------------------------------------------------------

特别的:请读者特别关注表之间的关系,resultMap的书写方式,collection的书写方式,column的配置,如有疑问,请参考前面《Mybatis最入门---ResultMaps高级用法(上)》中的内容

--------------------------------------------------------------------------------------------------------------------------------------------------------

如果又细心的读者,或许已经发现,我们设计的表结构关系是user表--->userinfo表--->departments表。换句话说,我们使用user表中的变量是无法查到部门表的信息的。另外,我们实际也遇到这样的例子,人员的属性中存在多个集合属性,如,基本信息是一个集合,兴趣爱好是一个集合等等。有时为了完整的描述一个对象,需要使用多个集合属性来描述。因此,我们在这里在演示一个对象中多个集合的查询操作的实现。

1.首先,我们要在User中增加department属性,如下:【注意:我们只修改对象,并没有修改数据库】

@SuppressWarnings("serial")
public class User implements Serializable{

	private String id;
	private String password;
	private UserInfo userInfo;
	private Departments department;
//....set
//...get
//...构造函数
//..toString()
}

2.修改UserMapper.xml中的resultMap,修改之后的内容为:

<resultMap type="user" id="UserResult">
		<id property="id" column="id" />
		<result property="password" column="password" />
		<association property="userInfo" column="userid"
			select="com.csdn.ingo.dao.UserInfoDao.findUserInfoById"></association>
		<association property="department" column="department"
			select="com.csdn.ingo.dao.DepartmentsDao.findDepartmentById"></association>
	</resultMap>

3.新建单元测试方法,如下:

	@Test
	public void testSeletDepartmentAndInfo() {
		try{
		UserDao userDao = sqlSession.getMapper(UserDao.class);
		String id = "admin";
		User curUser = userDao.findUserInfoById(id);
		if(curUser!=null){
			log.info("成功找到用户:"+curUser.toString());
		}
		}catch(Exception e){
			e.printStackTrace();
		}
	}

4.测试方法:运行单元测试,观察控制台输出,有如下结果;

完整输出为:

成功找到用户:User [id=admin, password=admin, userInfo=UserInfo [userid=admin, department=1, position=工程师, mobile=11112222, gender=1, [email protected]], department=Departments [id=1, departmentName=开发部, userInfos=[UserInfo [userid=admin, department=1, position=工程师, mobile=11112222, gender=1, [email protected]]]]]
 - 

输出内容仅供参考,各位看官只要看到类似输出即可。

-------------------------------------------------------------------------------------------------------------------------------------

至此,Mybatis最入门---ResultMaps实例篇(一对多查询)结束

特别备注:

这两篇的实例,请各位看官一定手动敲一遍,遇到不懂配置的地方请查看前文详细说明。

时间: 2024-10-10 20:56:23

Mybatis最入门---ResultMaps实例篇(一对多查询)的相关文章

Mybatis最入门---ResultMaps高级用法(上)

[一步是咫尺,一步即天涯] 接上文,我们基本的单表查询使用上文中的方式已经能够达到目的.但是,我们日常的业务中也存在着多表关联查询,结果是复杂的数据集合等等.本文我们就来介绍ResultMaps的高级用法,本文,我们先介绍基本的概念,具体用法实例在下一篇中专门演示给大家.敬请期待! ------------------------------------------------------------------------------------------------------------

Mybatis最入门---ResultMaps高级用法(下)

[一步是咫尺,一步即天涯] 接上文,本文我们继续来叙述Mybatis中resultMap的高级用法,类似的,我们先给大家叙述基本的概念及用法,具体实例在后文中再做演示,敬请期待! ------------------------------------------------------------------------------------------------------------------------------------- 上文,我们说到了"has-many"这个问

MyBatis基本入门篇

No.1 基础 框架核心 1. mybatis配置文件,包括Mybatis全局配置文件和Mybatis映射文件,其中全局配置文件配置了数据源.事务等信息:映射文件配置了SQL执行相关的 信息. 2. mybatis通过读取配置文件信息(全局配置文件和映射文件),构造出SqlSessionFactory,即会话工厂. 3. 通过SqlSessionFactory,可以创建SqlSession即会话.Mybatis是通过SqlSession来操作数据库的. 4. SqlSession本身不能直接操作

MonoRail学习-入门实例篇

1.到官方网站下载安装文件,地址如下: http://www.castleproject.org/index.php/Castle:Download目前最新版本Beta5(您也可以不需要下载,直接使用实例代码中lib中的dll) 2.添加对Castle.MonoRail.Framework.dllCastle.MonoRail.Framework.Views.CompositeView.dllCastle.MonoRail.Framework.Views.NVelocity.dllNVeloci

实体框架(Entity Framework)快速入门--实例篇

在上一篇 <实体框架(Entity Framework)快速入门> 中我们简单了解的EF的定义和大体的情况,我们通过一步一步的做一个简单的实际例子来让大家对EF使用有个简单印象,看操作步骤 第一步:创建控制台项目 这个就不多说了,如果新建项目你还不知道,那先去学学基础吧. 第二步:创建实体模型 在项目上右击 添加新建项目→Ado .Net 实体数据模型 如下图所示: 第三步:与现有的 数据库 进行连接生成EF实体 在做这步之前,首先确定你是否已经有现有数据库,当然在这提供我自己的数据库脚本.

Asp.Net MVC2.0 Url 路由入门---实例篇

本篇主要讲述Routing组件的作用,以及举几个实例来学习Asp.Net MVC2.0 Url路由技术. 接着上一篇开始讲,我们在Global.asax中注册一条路由后,我们的请求是怎么转到相应的View的呢?Controller和Action是怎么解析的?这就是Routing组件干的事情了. Routing的作用:它首先是获取到View传过来的请求,并解析Url请求中Controller和Action以及数据,其次他将识别出来的数据传递给Controller的Action(Controller

mybatis入门篇2 --- mybatis的部分配置信息以及连表查询,分步查询

接下来看一下我们的mybatis的进一步操作,熟悉一下相关配置信息,以及多参数查询,连表查询,以及分布查询的功能. 首先mybatis的中文文档就是:https://mybatis.org/mybatis-3/zh/configuration.html#environments 首先看一下三个数据库表,user,order,user_order,这是一个多对多关系. userId对应user表的id, orderId对应order表的id 本次对于user表没有记性一对多的操作,仅查询user表

Mybatis入门(六)联查之一对多

上一章说了多对一,很多学生被一个老师教,这一章是一个老师教很多学生 目录基本没有变化只是改了配置文件: 2.配置文件: TeacherMapper接口类: package com.hdlf.dao; import com.hdlf.pojo.student; import com.hdlf.pojo.teacher; import java.util.List; public interface TeacherMapper { //方式一 teacher getteacher(int tid);

Mybatis最入门---动态查询(if)

[一步是咫尺,一步即天涯] 前面我们花费很多篇幅来介绍核心元素<resultMap>的使用,在日常开发中,基本的静态的查询情况已经足够对付.但有些时候,我们想寻求一个能够根据参数自动调整SQL查询的方法.如,学校教导主任发现一个学生违反校纪校规,但是并没有当场抓住该学生,于是,他通过已经掌握的学生信息如[性别],[年纪],[身高]等信息来查询符合条件的学生.但是,这些信息的数量每次得到的数量都是不同的.换句话说,我们在设计系统时,无法确定传入参数的数量.也没有获得一个足以唯一确定这个对象的主键