MyBatis多表查询resultMap设定

article/2025/10/7 8:49:13

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

Result Maps 是什么

ResultMap 属性

一、Java数据访问接口

二、XML实现

 1、*分步查询 + 延迟加载

三、Test

1.读入数据

总结


Result Maps 是什么

   resultMap 元素是 MyBatis 中最重要最强大的元素。它可以让你从 90% 的 JDBC ResultSets 数据提取代码中解放出来, 并在一些情形下允许你做一些 JDBC 不支持的事情。 实际上,在对复杂语句进行联合映射的时候,它很可能可以代替数千行的同等功能的代码。 ResultMap 的设计思想是,简单的语句不需要明确的结果映射,而复杂一点的语句只需要描述它们的关系就行了。

ResultMap 属性

  1. constructor - 用于在实例化类时,注入结果到构造方法中 idArg - ID 参数;标记出作为 ID 的结果可以帮助提高整体性能 arg - 将被注入到构造方法的一个普通结果
  2. id – 一个 ID 结果;标记出作为 ID 的结果可以帮助提高整体性能
  3. result – 注入到字段或 JavaBean 属性的普通结果
  4. association – 一个复杂类型的关联;许多结果将包装成这种类型 嵌套结果映射 – 关联可以指定为一个 resultMap 元素,或者引用一个
  5. collection – 一个复杂类型的集合 嵌套结果映射 – 集合可以指定为一个 resultMap 元素,或者引用一个
  6. discriminator – 使用结果值来决定使用哪个 resultMap
  7. case – 基于某些值的结果映射 嵌套结果映射
  8. – 一个 case 也是一个映射它本身的结果,因此可以包含很多相 同的元素,或者它可以参照一个外部的 resultMap。

提示:以下是本篇文章正文内容,下面案例可供参考

一、Java数据访问接口

ublic interface EmployeeDao {/*** 使用as别名的方式查询所有员工*/public List<Employee> selectAll();/*** 使用resultMap的方式*/public List<Employee> selectAll2();/*** 关联查询*/public List<Employee> selectAll3();/*** 关联查询:使用association 标签来指定关联的javaBean的封装方式*/public List<Employee> selectAll4();/*** 分步查询方法*/public Employee selectStep(int eid);}

二、XML实现

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.etc.dao.EmployeeDao"><cache></cache><select id="selectAll" resultType="com.etc.bean.Employee" useCache="true">SELECT eid AS id,ename AS name,eaddr AS address FROM employee</select><!--创建resultMap column属性:数据库中的名称 property:实体类的名称--><resultMap id="resultMap1" type="com.etc.bean.Employee"><id column="eid" property="id"></id><result column="ename" property="name"></result><result column="eaddr" property="address"></result></resultMap><select id="selectAll2" resultMap="resultMap1">select * from employee</select><!-- 联表查询,使用resultMap--><resultMap id="resultMap2" type="com.etc.bean.Employee"><id column="eid" property="id"></id><result column="ename" property="name"></result><result column="eaddr" property="address"></result><result column="d_did" property="dept.id"></result><result column="d_dname" property="dept.name"></result></resultMap><select id="selectAll3" resultMap="resultMap2">select e.eid,e.ename,e.eaddr,d.did d_did,d.dname d_name from employee e,department d where e.did = d.did</select><!-- 联表查询,使用association--><resultMap id="resultMap3" type="com.etc.bean.Employee"><id column="eid" property="id"></id><result column="ename" property="name"></result><result column="eaddr" property="address"></result><association property="dept" javaType="com.etc.bean.Department"><result column="d_did" property="id"></result><result column="d_dname" property="name"></result></association></resultMap><select id="selectAll4" resultMap="resultMap3">select e.eid,e.ename,e.eaddr,d.did d_did,d.dname d_name from employee e,department d where e.did = d.did</select><!-- 分步查询--><resultMap id="resultMap4" type="com.etc.bean.Employee"><id column="eid" property="id"></id><result column="ename" property="name"></result><result column="eaddr" property="address"></result><!-- 想要完成分步查询 还要使用association 里面不用再次设定(前提是你的实体类和数据库表字段一一对应) --><association property="dept" select="com.etc.dao.DepartmentDao.findById" column="did"></association></resultMap><select id="selectStep" resultMap="resultMap4" >select * from employee where eid = #{id}</select></mapper>

 1、分步查询 + 延迟加载

  • 配置延迟加载,在config.xml中设置为延迟加载,注意配置顺序
  • 使用延迟加载方法,先去查询简单的sql(最好单表,也可以关联查询),再去按需要加载关联查询的其它信息。

三、Test

public class EmployeeDaoTest {EmployeeDao employeeDao = null;@Beforepublic void common(){try {String resources = "configuration.xml";InputStream inputStream = Resources.getResourceAsStream(resources);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession(true);employeeDao = sqlSession.getMapper(EmployeeDao.class);} catch (IOException e) {e.printStackTrace();}}@Testpublic void selectAll(){List<Employee> list = employeeDao.selectAll();for (Employee employee:list) {System.out.println(employee);}}@Testpublic void selectAll2(){List<Employee> list = employeeDao.selectAll2();for (Employee employee:list) {System.out.println(employee);}}@Testpublic void selectAll3(){List<Employee> list = employeeDao.selectAll3();for (Employee employee:list) {System.out.println(employee);System.out.println("\t"+employee.getDept().getId()+"\t"+employee.getDept().getName());}}@Testpublic void selectAll4(){List<Employee> list = employeeDao.selectAll4();for (Employee employee:list) {System.out.println(employee);System.out.println("\t"+employee.getDept().getId()+"\t"+employee.getDept().getName());}}@Testpublic void selectStep(){Employee employee = employeeDao.selectStep(10008);System.out.println("resultMap4");System.out.println(employee.getName());System.out.println(employee.getDept().getName());}
}



http://chatgpt.dhexx.cn/article/tFgmayoD.shtml

相关文章

JS字符串替换指定字符

碰到一个后端数据同步过来的xml文本段&#xff0c;内容里写死的宽度 在1920*1080的分辨率屏幕上&#xff0c;显示有问题&#xff0c;由于数据量太多&#xff0c;前端单独拿数据再处理一遍 RegExp方法&#xff1a; function replaceAll(str, find, replace) {return str.repla…

shell内置字符串替换

shell变量赋值语法&#xff1a; 使用规则解释单引号所见即所得&#xff0c;即输出时会将单引号内的所有內容都原样输出&#xff0c;或者描述为单引号里面看到的是什么就会输出什么&#xff0c;这称为强引用双引号 (默认)输出双引号内的所有内容&#xff1b;如果内容中有命令(…

python字符串替换

str.replace(old, new[, max]) 参数 old – 将被替换的子字符串。 new – 新字符串&#xff0c;用于替换old子字符串。 max – 可选字符串, 替换不超过 max 次 返回值 返回字符串中的 old&#xff08;旧字符串&#xff09; 替换成 new(新字符串)后生成的新字符串&#xff0c;如…

C++ 字符串替换

好久没有更新了&#xff0c;最近有点忙&#xff0c;今天抽点时间给大家水 写一篇关于替换字符串字符的文章 替换函数 string类型的字符串可以用swap函数来替换字符&#xff0c;例如&#xff1a; 冒泡排序 #include <bits/stdc.h> using namespace std;int main () {i…

Python字符串替换方法replace

字符串替换方法replace str1 .replace(old_str&#xff0c;new_str&#xff0c;count)字符串的替换&#xff0c;将str1中的 old_str 替换成new_str old_str:将要被替换的字符串 new_str:新的字符串&#xff0c;替换成的字符串# count:替换的次数,默认是全部替换 返回值:得到一个…

Java字符串替换的方法

java中字符串替换方法主要有三种&#xff0c;分别是replace()、replaceAll()和replaceFirst()&#xff0c;这三种方法可以在三种不同情况应用&#xff0c;下面就由我来具体说明这三种方法的应用情况吧。 replace() replace的参数是char和CharSequence&#xff0c;即可以支持字…

sed 字符串替换

1. sed替换的基本语法为: sed s/原字符串/替换字符串/ 单引号里面,s表示替换,三根斜线中间是替换的样式,特殊字符需要使用反斜线”\”进行转义。 2. 单引号” ‘ ’”是没有办法用反斜线”\”转义的,这时候只要把命令中的单引号改为双引号就行了,格式如下&#xff1a; # 要…

字符串的替换

一、字符串“打劫&#xff01;我有枪”&#xff0c;“枪”是敏感词汇&#xff0c;替换为“*”&#xff0c;并输出打印 二、字符串“北京欢迎你”&#xff0c;替换字符为“郑州欢迎你们”&#xff0c;并输出打印 package work.twelve;/* 一、字符串“打劫&#xff01;我有枪”…

两种字符串替换的方法

1.语法&#xff1a; public String replace(CharSequence target,CharSquence replacement) 注&#xff1a;旧字符换成新字符 示例&#xff1a;店小二在菜单上写下一个馒头一文&#xff0c;“一个”二字容易被他人添上一笔变成“十个”&#xff0c;于是决定把“一”替换成汉字…

7-8 字符串替换 (15 分)

7-8 字符串替换 &#xff08;15 分&#xff09; 本题要求编写程序&#xff0c;将给定字符串中的大写英文字母按以下对应规则替换&#xff1a; 输入格式&#xff1a; 输入在一行中给出一个不超过80个字符、并以回车结束的字符串。 输出格式&#xff1a; 输出在一行中给出替…

全网最全Spring面试题之高级篇整理总结(共25题,附超详细解答)

1、什么是 Spring 框架&#xff1f;Spring 框架有哪些主要模块&#xff1f; Spring 框架是一个为 Java 应用程序的开发提供了综合、广泛的基础性支持的 Java 平台。Spring 帮助开发者解决了开发中基础性的问题&#xff0c;使得开发人员可以专注于应用程序的开发。 Spring 框架本…

spring常见面试题(2023最新)

目录 前言1.spring是什么2.spring的设计核心是什么3.IOC和AOP面试题4.spring的优点和缺点5.spring中bean的作用域6.spring中bean的注入方式7.BeanFactory 和 ApplicationContext有什么区别&#xff1f;8.循环依赖的情况&#xff0c;怎么解决&#xff1f;9.spring中单例Bean是线…

spring面试题及答案

关注公众号&#xff0c;获取更多面试题及答案。 69道Spring面试题 1.什么是spring? Spring是个java企业级应用的开源开发框架。Spring主要用来开发Java应用&#xff0c;但是有些扩展是针对构建J2EE平台的web应用。Spring框架目标是简化Java企业级应用开发&#xff0c;并通过…

【2022版】Spring面试题整理(含答案解析)

1、不同版本的 Spring Framework 有哪些主要功能&#xff1f; 2、什么是 Spring Framework&#xff1f; Spring 是一个开源应用框架&#xff0c;旨在降低应用程序开发的复杂度。它是轻量级、松散耦合的。它具有分层体系结构&#xff0c;允许用户选择组件&#xff0c;同时还为 …

Spring面试题大全含答案共79题(2022最全spring超级葵花宝典)

1. 什么是spring? Spring 是个java企业级应用的开源开发框架。Spring主要用来开发Java应用&#xff0c;但是有些扩展是针对构建J2EE平台的web应用。Spring 框架目标是简化Java企业级应用开发&#xff0c;并通过POJO为基础的编程模型促进良好的编程习惯。 2. 使用Spring框架的…

2022最新Spring面试题附完整答案

Spring面试题 一、单选题 1.Spring是年发布的( ) A.2022 B.2004 C.2006 D.2008 2.Spring中的对象的作用域不包括( ) A.session B.servletContext C.singleton D.proptotype 3.在Spring的配置文件中定义了如下代码&#xff0c;说法正确的是( ) <bean id”studen…

Spring面试题(2020最新版)

Java面试总结&#xff08;2021优化版&#xff09;已发布在个人微信公众号【技术人成长之路】&#xff0c;优化版首先修正了读者反馈的部分答案存在的错误&#xff0c;同时根据最新面试总结&#xff0c;删除了低频问题&#xff0c;添加了一些常见面试题&#xff0c;对文章进行了…

Spring面试题(2022版)

序列号内容链接1Java基础知识面试题&#xff08;2022版&#xff09;https://blog.csdn.net/qq_43061290/article/details/1240237972Java集合容器面试题&#xff08;2022版&#xff09;https://blog.csdn.net/qq_43061290/article/details/1240433633Java异常面试题&#xff08…

springIOC面试题

1.什么是spring Spring是分层的 Java SE/EE应用 full-stack 轻量级开源框架&#xff0c;以 IoC和AOP为内核。含有七大核心模块 2. 简单描述spring的七大模块 (1)Spring Core&#xff1a;核心容器提供了Spring的基本功能。核心容器的核心功能是用Ioc容器来管理类的依赖关系&am…

77道Spring面试题以及参考答案(2021年最新版)

77道Spring面试题以及参考答案&#xff08;2021年最新版&#xff09;&#xff0c;分享给大家~ 一、Spring概述 1. 什么是spring&#xff1f; Spring是一个轻量级Java开发框架&#xff0c;最早有Rod Johnson创建&#xff0c;目的是为了解决企业级应用开发的业务逻辑层和其他各…