【Spring】— 映射文件

news2025/2/24 0:09:25

映射文件

映射文件是MyBatis框架中十分重要的文件。在映射文件中,<mapper>元素是映射文件的根元素,其他元素都是它的子元素。映射文件中的主要元素如下所示。

<mapper>
    <!--映射查询语句,可自定义参数,返回结果集等-->
    <select/>
    <!--映射插入语句,执行后返回一个整数,代表插入的条数-->
    <insert/>
    <!--映射更新语句,执行后返回一个整数,代表更新的条数-->
    <update/>
    <!--映射删除语句,执行后返回一个整数,代表删除的条数-->
    <delete/>
    <!--用于定义一部分SQL,然后可被其他语句引用此SQL-->
    <sql/>
    <!--给定命名空间的缓存配置-->
    <cache/>
    <!--其他命名空间缓存配置的引用-->
    <cache-ref/>
    <!--用来描述如何从数据库结果集中加载对象-->
    <resultMap/>
</mapper>

select元素

<select>元素用于映射查询语句,从数据库中读取数据,并组装数据给业务开发人员。示例如下:

 <select id="findUserById" parameterType="Integer" resultType="com.ssm.po.User">
        select * from t_user where id=#{id}
</select>

上述语句中的唯一标识为findUserById,它接收一个Integer类型的参数,并返回一个User类型的对象。

<select>元素中,除了上述示例代码中的几个属性外,还有其他可以配置的属性,如下表所示。

在这里插入图片描述

insert元素

<insert>元素用于映射插入语句,在执行完元素中定义的SQL语句后,会返回一个表示插入记录数的整数。<insert>元素的配置示例如下:

<insert id="addUser" parameterType="com.ssm.po.User" flushCache="true" 
        statementType="PREPARED" keyProperty="id" keyColumn="" useGeneratedKeys="" timeout="20">
    insert into t_user(username, jobs, phone)values (#{username}, #{jobs},#{phone})
</insert>

<insert>元素的属性与<select>元素的属性大部分相同,但还包含3个特有属性(仅对insert和update有用),如下表所示。

在这里插入图片描述
执行插入操作后,很多时候我们会需要返回插入成功的数据生成的主键值,此时就可以通过上面所讲解的3个属性来实现。

【示例】如果使用的数据库支持主键自动增长(如MSQL),那么可以通过keyProperty属性指定PO类的某个属性接收主键返回值(通常会设置到id属性上),然后将useGeneratedKeys的属性值设置为true。使用上述配置执行插入后,会返回插入成功的行数以及插入行的主键值。可以通过如下代码测试。

    @Test
    public void addUserTest() throws Exception {
        String resourse = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resourse);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //创建User对象,并向对象中添加数据
        User user = new User();
        user.setUsername("tom");
        user.setJobs("worker");
        user.setPhone("17339880001");
        int rows = sqlSession.insert("com.ssm.mapper.UserMapper.addUser", user);
        //输出插入数据的主键id值
        System.out.println(user.getId());
        if (rows > 0) {
            System.out.println("成功添加" + rows + "条数据!");
        } else {
            System.out.println("添加数据失败!");
        }
        sqlSession.commit();
        sqlSession.commit();
    }

如果使用的数据库不支持主键自动增长(如Oracle),或者支持增长的数据库取消了主键自增的规则,就可以使用MyBatis提供的另一种方式来自定义生成主键,具体配置示例如下。

  <insert id="insertUser" parameterType="com.ssm.po.User">
            <selectKey keyProperty="id" resultType="Integer" order="BEFORE">
                select if(max(id) is null , 1, max(id)+1) as newId from t_user
            </selectKey>
            insert into t_user(id, username, jobs, phone) values (#{id}, #{username}, #{jobs},#{phone})
</insert>

在执行上述示例代码时,<selectKey>元素会首先运行,它会通过自定义的语句来设置数据表中的主键(如果t_uesr表中没有记录,就将id设置为1,否则将id的最大值加1作为新的主键),然后调用插入语句。

<selectKey>元素在使用时可以设置以下几种属性。

<selectKey 
	keyProperty="id" 
	resultType="Integer" 
	order="BEFORE"
	statement="PREPARED">

在上述<selectKey>元素的几个属性中,keyProperty、resultType和statement的作用与前面讲解的相同。order属性可以被设置为BEFORE或AFTER。如果设置为BEFORE,那么它会先执行<selectKey>元素中的配置来设置主键,再执行插入语句;如果设置为AFTER,那么它会先执行插入语句,再执行<selectKey>元素中的配置内容。

update元素和delete元素

<update>元素和<delete>元素的使用比较简单,它们的属性配置也基本相同(<delete>元素中不包含表中的3个属性),其常用属性如下所示。

<update
	id="updateUser"
	parameterType="com.ssm.po.User"
	flushCache="true"
	statementType="PREPARED"
	timeout="20">
<delete
	id="deleteUser"
	parameterType="com.ssm.po.User"
	flushCache="true"
	statementType="PREPARED"
	timeout="20">

从上述配置代码中可以看出,<update>元素和<delete>元素的属性基本与<select>元素中的属性一致。与<insert>元素一样,<update>元素和<delete>元素在执行完之后,也会返回一个表示影响记录条数的整数,其使用示例如下。

  	更新用户信息 
    <update id="updateUser" parameterType="com.ssm.po.User">
       update t_user set username=#{username}, jobs=#{jobs}, phone=#{phone} where id=#{id}
    </update>

     删除用户信息 
    <delete id="deleteUser" parameterType="Integer">
       delete from t_user where id=#{id}
    </delete>

sql元素

在一个映射文件中,通常需要定义多条SQL语句,这些SQL语句的组成可能有一部分是相同的(如多条select语句中都查询相同的id、username、jobs字段),如果每一个SQL语句都重写一遍相同的部分,势必会增加代码量,导致映射文件过于臃肿。那么有没有什么办法将这些SQL语句中相同的组成部分抽取出来,然后在需要的地方引用呢?答案是肯定的,我们可以在映射文件中使用MyBatis提供的<sql>元素来解决上述问题。

<sql>元素的作用是定义可重用的SQL代码片段,然后在其他语句中引用这一代码片段。例如,定义一个包含id、username、jobs和phone字段的代码片段:

<sql id ="user Columns">id,username,jobs,phone</sql>

这一代码片段可以包含在其他语句中使用,具体如下:

<select id="findUserById" parameterType="Integer" resultType="com.ssm.po.User">
     select <include refid="user Columns">
     from t_user
     where id =#{id}
</select>

在上述代码中,使用元素的refid属性引用了自定义的代码片段,refid属性值为自定义代码片段的id。

resultMap元素

<resultMap>元素表示结果映射集,主要作用是定义映射规则、级联更新以及定义类型转化器等。< resultMap>元素中包含一些子元素,元素结构如下所示。

<!--resultMap的元素结构-->
<resultMap type="" id="">
	<constructor>     <!--类在实例化时,用来注入结果到构造方法中-->
	<idArg />     <!--ID参数,标记结果为ID-->
	<arg />     <!--注入到构造方法的一个普通结果--> 
	</constructor>
	<id />     <!--用于表示那个列是主键-->  
	<result />     <!--注入到字段或JavaBeab属性的普通结果-->
	<association property="" />  <!--用于一对一关联-->  
	<collection property="" />   <!--用于一对多关联--> 
	<discriminator iavaType="">   <!--使用结果值来决定使用哪个结果映射--> 
		<case value="" />     <!--基于某些值的结果映射--> 
	</discriminator>
</resultMap>

<resultMap>元素的type属性表示需要映射的POJO,id属性是这个resultMap的唯一标识。它的子元素<constructor>用于配置构造方法(当一个POJO中未定义无参的构造方法时,就可以使用<constructor>元素进行配置)。子元素<id>用于表示哪个列是主键,而<result>用于表示POJO和数据表中普通列的映射关系。<association><collection>用于处理多表时的关联关系,而<discriminator>元素主要用于处理一个单独的数据库查询返回很多不同数据类型结果集的情况。

在默认情况下,MyBatis程序在运行时会自动地将查询到的数据与需要返回的对象的属性进行匹配赋值(需要表中的列名与对象的属性名称完全一致)。然而实际开发时,数据表中的列和需要返回的对象的属性可能不会完全一致,这种情况下MyBatis是不会自动赋值的。此时,就可以使用<resultMap>元素进行处理,示例代码UserMapper.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.ssm.mapper.UserMapper">

    <resultMap type="com.ssm.po.User.UserMapper" id="resultMap">
       <id property="id" column="t_id"/>
        <result property="name" column="t_username"/>
        <result property="age" column="t_age"/>
    </resultMap>
    <select id="findAllUser" resultMap="resultMap">-->
            select * from t_user 
    </select>
</mapper>

<resultMap>的子元素<id><result>的property属性表示User类的属性名,column属性表示数据表t_user的列名。<select>元素的resultMap属性表示引用上面定义的resultMap。接下来可以在配置文件中引入UserMapper.xml。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/583071.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python日期带时区转换工具类总结

文章目录 1.背景2. 遇到的坑3. 一些小案例3.1 当前日期、日期时间、UTC日期时间3.2 昨天、昨天UTC日期、昨天现在这个时间点的时间戳3.3 日期转时间戳3.4 时间戳转日期3.5 日期加减、小时的加减 4. 总结5. 完整的编码 1.背景 最近项目是国际项目&#xff0c;所以需要经常需要用…

docker 解析DNS失败

问题现象&#xff1a; 我之前在docker里部署的容器&#xff0c;今天突然访问不了了&#xff0c;一开始我以为是容器的问题&#xff0c;将容器restart&#xff0c;销毁重建&#xff0c;都没有解决。 最后准备重启docker service&#xff0c;在重启之前&#xff0c;看了一眼dock…

接口自动化测试,从常规到动态再到全局断言,Postman让你居家必备!

目录 引言&#xff1a; 常规断言 动态参数断言 全局断言 总结 引言&#xff1a; Postman是一款非常流行的API接口测试工具&#xff0c;它以其易用性和强大的功能得到了广泛的应用。其中Postman断言功能是我们进行接口自动化测试时非常关键的一个环节。在接口测试中&#…

【正则入门】

语法 . &#xff08;点&#xff09; 匹配除换行符&#xff08;\n、\r&#xff09;之外的任何单个字符&#xff0c;相等于 [^\n\r]。 [\s\S] 匹配所有。\s 是匹配所有空白符&#xff0c;包括换行&#xff0c;\S 非空白符&#xff0c;不包括换行。 \d [0-9] \D 非数字&#xff1…

CISCN2023-Crypto

CISCN2023-Crypto 基于国密SM2算法的密钥分发可信度量Sign_in_passwdBB84badkey1 基于国密SM2算法的密钥分发 非预期&#xff0c;直接search能找到明文 curl -d "nameha&schoolhznu&phone110" http://123.56.244.196:30817/api/logincurl -d "id984ae…

【线程池】实现多线程并发定时任务

文章目录 一、为什么需要配置多线程定时任务二、单线程定时任务三、多线程定时任务 一、为什么需要配置多线程定时任务 springboot中通过注解 Scheduled 注解的方法都是一个定时执行的任务, 默认都是单线程的,就算是多个定时任务也是在同一个单线程(scheduled-1)中运行, 如果其…

离线版Gerber查看器+PCB/PCBA检测神器新功能!

一、CAM离线版——华秋CAM│专业Gerber查看器 公司电脑不能连接网络&#xff1f;不慌&#xff0c;我们完全离线且无需账号登录&#xff01; 磁盘空间不够拒绝下载&#xff1f;别怕 &#xff0c;我们安装包仅20M可随便分享&#xff01; 不会使用CAM350导入Gerber&#xff1f;没事…

APP开发死亡潮来临 小程序是否会取而代之?

移动互联网的发展&#xff0c; APP开发行业也迎来了它的大时代。据有关数据显示&#xff0c;2017年上半年国内新增的 App数量达到了创纪录的449万款&#xff0c;用户使用时长超过了200亿分钟。移动互联网已成为名副其实的“流量”产业&#xff0c;也因此诞生出一大批 APP开发公…

PostgreSQL 基础(一)-- 新手教程

PostgreSQL 12 官网 github 世界上最先进的开源关系数据库 1、新手入门 1.1 安装 当然&#xff0c;在使用PostgreSQL之前&#xff0c;你需要安装它。PostgreSQL可能已经安装在您的站点上&#xff0c;或者因为它包含在您的操作系统发行版中&#xff0c;或者因为系统管理员已…

【了不起的芯片 - 读书笔记】CPU 的制作流程 ( 晶圆制作 | 光刻机光刻流程 | 蚀刻过程 | 涂层过程 | 重复上述步骤若干次 | 芯片封装 )

文章目录 一、晶圆制作二、光刻机光刻流程三、蚀刻过程四、涂层过程五、重复上述步骤若干次六、芯片封装 一、晶圆制作 晶圆制作是半导体芯片制造的关键过程&#xff0c;它涉及将硅晶片&#xff08;或其他半导体材料&#xff09;转化为可以用于集成电路制造的基础材料。下面是晶…

ERP的需求分析

目录 什么是需求分析? 开发背景 01、系统模块 02、基础资料 供应商信息</

JDK21:Java21的新特性

背景 定于9月推出的Java21计划现在包括一个关键封装机制API和32位Windows端口的弃用。 Java开发工具包&#xff08;JDK&#xff09;21将于9月作为Oracle标准Java实现的下一个长期支持版本&#xff0c;现在有13个功能被正式提出&#xff0c;最近几天又增加了两个功能。 最新的…

ATECLOUD云测试平台新能源电机测试系统:高效、可扩展的测试利器

随着全球对环境保护的日益重视&#xff0c;新能源的发展越来越受到关注。电动汽车作为新能源领域的重要组成部分&#xff0c;其性能和质量对于消费者来说至关重要。为了确保电动汽车的性能和质量&#xff0c;测试系统平台解决方案变得越来越重要。本文将介绍一种基于ATECLOUD智…

10分钟学会sovits第一篇

So-vits-svc 基于端到端架构的VITS和soft-vc&#xff0c;用户只需准备几十分钟到几个小时不等的语音或歌声数据&#xff0c;就能制作&#xff08;训练&#xff09;属于自己的 AI 声库 &#xff08;前提是你的显卡足够给力&#xff09;&#xff0c;将一段语音或歌声转换为你想要…

上饶广信区个体私营经济协会新班子力争打造全国样板

5月26日下午&#xff0c;江西省上饶市广信区个体私营经济协会第二届理事会暨会员代表大会在上饶京都国际大酒店隆重召开&#xff0c;来自协会的200多名理事会员单位及社会各界嘉宾、媒体代表共计300余人参加了此次大会。本次大会成功举行了换届大会&#xff0c;通过举手表决方式…

解决启动tomcat出现的The JRE_HOME environment variable is not defined correctly问题~

错误描述如下&#xff1a; 解决办法&#xff1a; 首先打开环境变量的编辑位置检查你的环境变量是否配置完成&#xff1a; 环境变量配置如果没有问题&#xff0c;但启动tomcat还是出现上述错误&#xff0c;则可进行下述步骤&#xff1a; 找到目标文件&#xff1a; 右击对其进行…

R-Meta分析与【文献计量分析、贝叶斯、机器学习等】多技术融合实践与拓展进阶

目录 专题一 Meta分析的选题与文献计量分析CiteSpace应用 专题二 Meta分析与R语言数据清洗及相关应用 专题三 R语言Meta分析与精美作图 专题四 R语言Meta回归分析 专题五 R语言Meta诊断分析与进阶 专题六 R语言Meta分析的不确定性及贝叶斯应用 专题七 深度拓展机器学习在…

Word控件Spire.Doc 【其他】教程(3):使用 Marco 加载 Word 、删除 Marco

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

【现实生活实际应用】【公交车换乘算法——算法用在公交车】【bfs在图论】【单源最短路-如何根据图意构建图,最重要】最优乘车【sstream输入】

问题出现了 其实我们构图的时候&#xff0c; 我们已经知道1 - 3 - 5 那么我们直接让1 连到 3 和 5 表示直达 如果出现另一路 4 7 3 6 则3最终连接的是 5 和 6 从1开始&#xff0c;先走到了 3 和 5 然后bfs宽搜到3&#xff08;此时就表示换乘了&#xff0c;因为1直达的已经都遍历…

分布式网络通信框架(十五)——Mprpc项目总结

程序调用时序图 下图介绍了项目代码的调用时序&#xff0c;从rpc服务提供方开始看 简单描述项目、实现了怎样的功能&#xff1f;采用了哪些技术栈 这个项目是基于C语言实现的一个RPC分布式网络通信框架项目&#xff0c;使用CMake在Linux平台上构建编译环境。它可以将任何单体…