【Spring】— 映射文件

目录

    • 映射文件
      • select元素
      • insert元素
      • update元素和delete元素
      • sql元素
      • resultMap元素

映射文件

映射文件是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。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【owt】WebrtcNode, subscribe-sdp offer 流程(1)

sdp offer 流程 1. AmqpClient - New message received sdp offer 的消息 2023-04-26T21:54:19.790 - DEBUG: AmqpClient - RpcServer New message received {method: onTransportSignaling,args: [b149e44bb10d4e91bd162a8c6806ae7b,{sdp: v0\r\n o- 7177131362423164715 …

生活-考驾照2

昨日已通过科目一&#xff0c;接下来&#xff0c;向着科目二出发&#xff01;&#xff01;&#xff01; 考试注意事项 就考前一周死命刷题&#xff0c;至少一天有三次93以上的记录&#xff0c;我也就最后一天达到90&#xff0c;之前一直马路杀手刷题&#xff0c;我就在网页版…

WRF模式应用:天气预报、模拟分析观测气温、降水、风场、水汽和湿度、土地利用变化、土壤及近地层能量水分通量、土壤、水体、植被等相关气象变量

查看原文>>>高精度气象模拟软件WRF(Weather Research Forecasting)技术及案例应用 气候是多个领域&#xff08;生态、水资源、风资源及碳中和等问题&#xff09;的主要驱动因素&#xff0c;合理认知气候变化有利于解释生态环境变化机理及过程&#xff0c;而了解现在、…

Alibaba Arthas学习与使用

Alibaba Arthas学习与使用 目录 下载安装卸载退出快捷键重点部分: 命令 dashboardthreadjvmsyspropsysenvvmoptiongetstaticognlscsmjadmcredefinedumpclassloadermonitorwatchtracestackttoptionsprofiler 下载安装 # 下载 curl -O https://alibaba.github.io/arthas/art…

如何在多个端口上运行 SSH 服务器?

SSH&#xff08;Secure Shell&#xff09;是一种用于安全远程访问和管理服务器的协议。默认情况下&#xff0c;SSH服务器在Linux系统上使用22号端口进行通信。但是&#xff0c;有时我们可能需要在多个端口上运行SSH服务器&#xff0c;以满足特定的需求或增强服务器的安全性。 本…

SQL审核工具Yearning搭建及使用

一、背景 实际的业务场景中&#xff0c;我们难免会直接对生产库的数据进行修改。很多朋友都是发sql给运维&#xff0c;然后运维执行。过程不可控&#xff0c;出错几率很大。 而且没有审核&#xff0c;不知道提交的具体是什么sql&#xff0c;极有可能是删库跑路的sql&#xff0…

实验二十一、积分运算电路的输出波形分析

一、题目 利用 Multisim 分析图1所示两个积分运算电路的输出波形&#xff0c;输入电压为 200 Hz、幅值为 1 V 的方波信号。 图 1 图1\,\, 图1 二、仿真电路 在 Multism 中搭建图1所示的两个电路&#xff0c;如图2所示。为了防止电路中的直流增益过大&#xff0c;故在电容上…

【Python FTP/SFTP】零基础也能轻松掌握的学习路线与参考资料

一、Python FTP/SFTP的学习路线 Python FTP/SFTP是Python语言的两种常用的文件传输协议。在学习Python网络编程过程中&#xff0c;学习FTP/SFTP是非常重要的一步。下面给出Python FTP/SFTP的学习路线&#xff1a; 了解FTP/SFTP协议 在开始学习Python FTP/SFTP之前&#xff0…

【六一】【海思SS528】GPIO寄存器操作 - 使能GPIO管脚输出高、低电平

目录 一、概述二、配置复用控制寄存器&#xff0c;使能GPIO功能三、配置GPIO_DIR寄存器&#xff0c;选择输出四、配置GPIO_DATA寄存器&#xff0c;输出高电平五、测试 一、概述 这篇文章根据海思SS528芯片提供的《22AP30 H.265编解码处理器用户指南.pdf》文档(文档路径&#xf…

TPO69 01|Why Snakes Have Forked Tongues P5P6|阅读真题精读|17:50~19:35

17:00&#xff5e;17:50 吃饭 目录 P56 生词 段落大意 P5段落大意 P6段落大意 题目 【5】事实信息题|定位准确非常重要✅ 【6】事实信息题|定位准确非常重要✅ 【7】推理题|文章是否提及|不要过度推理 【8】修辞目的题|举例一般为了说明✅ 【9】句子插入题|in other words|同义…

读数据压缩入门笔记01_数据压缩导读

1. 建立在数据压缩上的世界 1.1. 数据压缩技术最让人惊异之处在于&#xff0c;它与过去40年里个人计算的很多重大改变有关&#xff0c;但很少有人知道这一点 1.2. 我们当下生活在其中的这个计算世界&#xff0c;完全建立在数据压缩算法之上 1.3. 图像的压缩 1.3.1. 1978年 …

Matcher: Segment Anything with One Shot Using All-Purpose Feature Matching 论文精读

Matcher: Segment Anything with One Shot Using All-Purpose Feature Matching 论文链接&#xff1a;[2305.13310] Matcher: Segment Anything with One Shot Using All-Purpose Feature Matching (arxiv.org) 代码链接&#xff1a;aim-uofa/Matcher: Matcher: Segment Anyt…

图的邻接矩阵表示

设图有n个顶点&#xff0c;则邻接矩阵是一个n*n的方阵&#xff1b;若2个顶点之间有边&#xff0c;则方阵对应位置的值为1&#xff0c;否则为0&#xff1b; 看几个例子&#xff1b; 此图的邻接矩阵是 0 1 1 1 1 0 1 0 1 1 0 1 1 0…

计算机网络基础知识(七)—— 什么是HTTPS协议?你听我“瞎掰”

文章目录 01 | 工作原理02 | SSL/TLS协议2.1 | 握手协议2.2 | 更换密码协议&#xff08;Change Cipher Spec Protocol&#xff09;2.3 | 警告协议&#xff08;Alert Protocol&#xff09;2.4 | 应用数据协议&#xff08;Application Data Protocol&#xff09; 03 | 加密算法3.…

南大通用数据库-Gbase-8a-报错集锦-02-metadata is incomplete on localhost

一、版本信息 名称值CPUIntel(R) Core(TM) i5-1035G1 CPU 1.00GHz操作系统CentOS Linux release 7.9.2009 (Core)内存3G逻辑核数2Gbase8a版本8.6.2-R43 二、问题原因 由于gbase.table_distribution存储了所有引擎为express的表元数据信息&#xff0c;如果此表出现数据损坏&a…

【五】设计模式~~~创建型模式~~~单例模式(Java)

【学习难度&#xff1a;★☆☆☆☆&#xff0c;使用频率&#xff1a;★★★★☆】 5.1. 模式动机 对于系统中的某些类来说&#xff0c;只有一个实例很重要&#xff0c;例如&#xff0c;一个系统中可以存在多个打印任务&#xff0c;但是只能有一个正在工作的任务&#xff1b;一…

Hystrix 服务熔断

书籍,人,借阅服务之间相互调用, 高度耦合, 一旦一个服务故障, 其他服务会雪崩, 和多米诺骨牌一样 Hystrix 熔断器, 保险丝 服务降级 提供补救措施发给请求者, 服务可用, 能力下降了 borrow-service 导入依赖 <dependency><groupId>org.springframework.cloud&l…

【MySQL新手到通关】第六章 时间日期函数

文章目录 1.获取日期时间函数1.1 获取当前日期时间1.2 获取当前日期1.3 获取当前时间 2.日期格式化★★★2.1 日期转指定格式字符串2.2 字符串转日期 3.日期间隔3.1 增加日期间隔 ★★★3.2 减去一个时间间隔★★★3.3 日期相差天数&#xff08;天&#xff09;3.4 相差时间&…

使用Chat gpt提高Android开发效率

简介 在过去几周里&#xff0c;我进行了一项令人大开眼界的实验&#xff0c;将 Chat-GPT&#xff08;我使用的是 Bing Chat&#xff0c;它在后台使用了 GPT-4&#xff0c;并且可以免费使用&#xff09;融入到我的日常 Android 开发工作流程中&#xff0c;以探索它是否能够提高…

DAY04_JDBC快速入门JDBC API详解SQL防注入数据库连接池JDBC综合练习

目录 1 JDBC1.1 JDBC概念1.2 JDBC本质 1.3 JDBC好处 2 JDBC快速入门2.1 编写代码步骤2.2 具体操作 3 JDBC API详解3.1 DriverManager3.2 Connection3.2.1 获取执行对象3.2.2 事务管理 3.3 Statement3.4 ResultSet3.4.1 ResultSet案例 3.5 PreparedStatement3.5.1 SQL注入3.5.2 …