【Mybatis】XML映射文件

news2025/1/19 11:26:37

目录

 11.3XML映射文件

        1.select

         2.insert、update、delete

        3.Sql 

        4.parameters(参数) 

        5.resultMap

        6.resultMap 使用示例 

        (1)在先前创建的数据库stu中创建表student 2,并插入若干条数据,代码如下:

        (2)创建工程mybatis_ResultMap_demo。 

        (3)创建实体对象映射数据库表。 

        (4)创建映射接口和映射文件。

        (5)测试。


 11.3XML映射文件

        

        xml和dtd 部分是必须填写且不需要配置的部分每次使用时,只需要将这部分复制到文件顶部即可。

        mapper 元素是整个映射文件的容器,所有的SQL映射都包含在这个元素中,mapper本身有一个参数namespace,即命名空间这个命名空间就是文件所对应的接口文件的Java类只有当这个命名空间被配置时,才可以直接通过访问Java接口的方法实现SOL调用。

        映射器是MyBatis最复杂且最重要的组件它由一个接口加上XML文件(或者注解)组成。在映射器中可以配置参数、SOL 语句、存储过程、缓存等内容,并且通过简易的映射规则映射到指定的POJO或者其他对象上,映射器能有效消除JDBC底层的代码。

        MyBatis的映射器也可以使用注解完成,但可读性较差,企业中应用不广,官方亦不推荐使用。

        1.select

        

查询语句是 MyBatis 中最常用的元素之一,多数应用也都是查询比修改要频繁。对每个插入、更新或删除操作,通常对应多个查询操作。这是 MyBatis 的基本原则之一,也是将焦点和精力放到查询和结果映射的原因。对简单类别的查询元素是非常简单的。例如:

<select id="selectPerson" parameterType="int" resultType="hashmap">

        SELECT *FROM PERSON WHERE ID=#{id}

</select>

        这个语句被称为selectPerson,使用一个int(或Integer)类型的参数,并返回一个HashMap类型的对象,其中的键是列名,值是列对应的值。

        注意参数标识 #{id},其告诉 MyBatis创建一个PreparedStatement (预处理语)参数使用JDBC,这样的一个参数在SOL中会由一个“?”来标识,并被传递到一个新的预处理语句中,类似于以下的JDBC代码(不是MyBatis的代码):

String selectPerson ="SELECT* FROM PERSON WHEREID=?";

PreparedStatement ps = conn.prepareStatement(selectPerson); ps.setInt(1,id);

        当然,这需要很多单独的JDBC 的代码来提取结果并将它们映射到对象实例中,这就是MyBatis 节省时间的原因。我们需要深入了解参数和结果映射。select 元素有很多属性允许用户配置,以决定每条语句的作用细节。关于select元素主要属性的描述参见表11-2。

                                        表11-2select元素的主要属性描述

属性

描述

id

在命名空间中唯一的标识符,可以被用来引用这条语句

parameterType

将会传入这条语句的参数类的完全限定名或别名。这个属性是可选的,因为 MyBatis 可以通过TypeHandler 推断出具体传入语句的参数,默认值为unset

resultMap

外部resultMap的命名引用。结果集的映射是MyBatis 最强大的特性若能对其有一个很好地理解则许多复杂映射的情形都能迎刃而解。可以使用resultMap或resultType,但不能同时使用

flushCache

如果设置为true,则任何时候只要语句被调用,都会导致本地缓存和二级缓存被清空,默认值为false

useCache

如果设置为true,则将会导致本条语句的结果被二级缓存,select元素默认值为true

timeout

这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为unset(依赖驱动)

fetchSize

这是尝试影响驱动程序每次批量返回的结果行数和这个设置值相等。默认值为 unset(依赖驱动)

statementType

值为STATEMENT、PREPARED或CALLABLE之一。这会让MyBatis分别使用JDBC中的

Statement、PreparedStatement 或CallableStatement,默认值为PREPARED

resultSetType

值为FORWARDONLY、SCROLL SENSITIVE 或SCROLL INSENSITIVE 之一默认值为 umset(依赖驱动),是结果集的类型

databaseld

如果配置了databaseIdProvider,则MyBatis会加载所有的不带databaseId 或匹配当前databaseId语句;如果带或者不带databaseId的语句都有,则不带的会被忽略

         2.insert、update、delete

        数据操纵语句 insert、update 和 delete 在它们的实现中非常相似。

        

<insert Id=“insertAuthor” parameterType=“domain.blogAuthor” flushCache=“true” 

statementType=“PREPARED”keyProperty=“”keyColumn=“”useGeneratedKeys=“”

utimeout=“20”>

<update id=“updateAuthor” parameterType=“domain.blog.Author” flushCache=“true”

statementType=“PREPARED” timeout=“20”>

<delete id=“deleteAuthorr” parameterType=“domain.blog.Author” flushCache=“true”

statementType=“PREPARED” timeout=“20”>

         

        insert、update和delete元素的主要属性描述如表11-3所示

        表11-3 insert、update和delete 元素的主要属性描述

        下面是insert、update和delete语句的示例

属性

描述

id

命名空间中的唯一标识符,可被用来代表这条语句

parameterType

将要传入语句的参数的完全限定类名或别名。这个属性是可选的,因为 MyBatis 可以通过TypeHandler推断出具体传入语句的参数,默认值为unset

parameterMap

STATEMENT、PREPARED或CALLABLE之一。这会让MyBatis分别使用StatementPreparedStatement或CallableStatement,默认值为PREPARED

flushCache

将其设置为 tue,任何时候只要语句被调用,都会导致本地缓存和二级缓存都被清空,默认值为true(对应插入、更新和删除语句)

statementType

STATEMENT、PREPARED或CALLABLE之一。这会让MyBatis 分别使用 Statement PreparedStatement或CallableStatement,默认值为PREPARED

useGeneratedKeys

(仅对insert和update 有用)这会令MyBatis 使用JDBC的getGeneratedKeys 方法来获取由数据库内部生成的主键(如像MySOL和SOLServer 这样的关系数据管理系统的自动递增字段),默认值为false

keyProperty

(仅对insert 和update 有用)唯一标记一个属性,MyBatis 会通过 getGeneratedKeys的返回值或者通过 insert 语的 selectKey 子元素设置其键值,默认为 unset。如果希望得到多个生成的列,则也可以是逗号分隔的属性名称列表

keyColumn

(仅对msert和update 有用)通过生成的键值设置表中的列名这个设置在某些数据库(如PostgreSQL)中是必需的,当主键列不是表中的第一列时需要设置。如果希望得到多个生成的列,则也可以是逗号分隔的属性名称列表

        下面是insert、update和delete语句的示例。

        

<insert id=“addStudent” parameterType=“student”

insert into

student(sno,name,sex,age,deptno)

values(#{sno}#{name},#{sex},#{age},#{dept_no})

</insert>

<update id=“updateStudent” parameterType=“student”>

update student set name

=#{name},sex=#{sex},age=#{lage},dept_no=#{dept_no}

where sno=#{sno}

</update>

<delete id=“deletestudent” uparameterType=“String”>

delete from student

where sno=#{sno}

</delete>

        3.Sql 

        这个元素可以被用来定义可重用的 SOL代码段,可以包含在其他语句中。例如:

        

<sql id=“userColumns”>

${alias}.id,${alias}.username,${alias}.password

</sq1>

        这个SQL片段可以被包含在其他语句中。例如:

        

<select id=“selectUsers” resultType=“map”>

Select

<include>refid=“userColumns”><property name=“alias” value=“t1”/></include>,

</select>

        4.parameters(参数) 

        在MyBatis中,参数是非常强大的元素。类似于之前的语句,简单参数示例如下。

       

<select id=“selectUsers” parameterType=“int”resultType="User”>

select id,username,password from users where id= #{id}

</select>

        这个示例说明了一个非常简单的命名参数映射。参数类型被设置为int,这里的参数名是id,也可以是其他名称。参数为简单数据类型的,都与此类似。以下示例中参数类型是一个对象,MyBatis的处理方式不同于简单数据类型。

<insert id="insertUser"parameterType="User">

Insert into users(id,username,password)

values(#{id},#{username},#{password})

</insert>

        如果User类型的参数对象传递到了语句中,则id、userame和password 属性将会被查找,它们的值就会被传递到预处理语句的参数中。 

        5.resultMap

       resultMap是映射中最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。resultMap 定义的主要是一个结果集的映射关系,也就是SOL到Java Bean 的映射关系定义。

        下面是简单映射语句的示例,但没有明确的resultMap。例如:

        

<select id=“selectUsers” resultType=“map”>

select id,username, hashedPassword from some_table where id = #{id}

</select>

        resultType=“map”表示返回的数据是一个Map集合(使用列名作为key列值作为value)。虽然数据被封装成Map集合返回,但是Map ”集合并不能很好地描述一个领域模型。可以使用JavaBeans或POJOs来作为领域模型描述数据MyBatis对两者都支持来看下面这个JavaBean:

        


public class User {

    private int id;
    private String username;
    private String hashedPassword;
    public int setId(int id) {
        This.id=id;
    }
    public void getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username=username;
    }
    public String getHashedPassword() {
        return hashedPassword;
    }
    public void setHashedPassword(String hashedPassword) {
        this.hashedPassword=hashedPassword;
    }
}

         基于JavaBean的规范,上面这个类有3个属性:id、username和hashedPassword。这些在select语句中会精确匹配到列名。

        这样的一个JavaBean可以被映射到结果集,就像映射到HashMap一样简单。

        

<select id=“selectUsers” parameterType=“int” resultType=“com.someapp.model.User”>

select id,username,hashedPassword from some table where id = #{id}

</select>

        以下使用了类型别名,使用它们时可以不输入类的全路径。例如:

         

<!--在XML配置文件中-->

<typeAlias type=“com.someapp,model.User” alias=“User”/>

<!--在SOL映射的XML文件中-->

<select id=“selectUsers” parameterType=“int”resultType=“User”>

select id,username hashedPassword from some table where id = #{id}

</select>

         在这些情况下,MyBatis会在幕后自动创建一个resultMap,基于属性名来映射列到JavaBean 的属性上。如果列名没有精确匹配,则可以在列名上使用 select 字句的别名(一个标准的SOL特性)来匹配标签。例如:

        

<select id=“selectUsers” parameterType=“int” resultType=“User”>

select

  user_id as “id”,

  user_name as “userName”,

  hashed_password as “hashedPassword”

from some_table

where id = #{id}

</select>

        resultMap最常见的使用方式如下所示,这也是解决列名不匹配的另外一种方式。

        

<resultMap id=“userResultMap” type= “User”>

<id property= “id” column= “user_id” />

<result property= “username” column= “user_name” />

<result property= “password” column= “hashed_password” />

</resultMap>

        引用此语句时使用resultMap 属性即可(注意,这里去了resultType属性)。例如:

        

<select id= “selectUsers” parameterType= “int” resultMap= “userResultMap”>

select user_id, user_name, hashed_password from some_table where id=#{id}

</select>

        6.resultMap 使用示例 

        (1)在先前创建的数据库stu中创建表student 2,并插入若干条数据,代码如下:

        

DROP TABLE IF EXISTS `student_2`;

CREATE TABLE `student_2` (

`stu_sno` varchar(100) NOT NULL DEFAULT '',

`stu_name` varchar(100) NOT NULL,

`stu_sex` varchar(8) DEFAULT NULL,

`stu_age` int(3) DEFAULT NULL,

`stu_dept_no` varchar(60) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `student_2` VALUES ('20231505', 'Marry', '女', '18', '260');

INSERT INTO `student_2` VALUES ('20231506', '王宝宝', '男', '22', '2602');

INSERT INTO `student_2` VALUES ('20231508', '李勇', '男', '20', '2605');

INSERT INTO `student_2` VALUES ('20231509', '刘娟', '女', '19', '2605');

        (2)创建工程mybatis_ResultMap_demo。 

        在idea 中创建Maven Project,在“GroupID”文本框中输入“com.mialab”,在“ArtifactID”文本框中输入“mybatis_ResultMap_demo”。最终完成的mybatis_ResultMap_demo工程目录及文件如图11-4所示,student2初始表数据如图11-5所示。

        

                                                 图11-4 mybatis_ResultMap_demo工程目录及文件

        

                                                        图11-5 student2表中的数据

        (3)创建实体对象映射数据库表。 

        Student对象用于映射student _2 表,Student.java 主要代码如下(此处get方法、set方法和toString方法略:

        

public class Student {
	private String sno;
	private String name;
	private String sex;
	private int age;
	private String dept_no;
   ...
}

        (4)创建映射接口和映射文件。

        接口StudentMapper.java的主要代码如下:

        

public interface StudentMapper {
	public List<Student> getSudentAll();
}

        映射文件StudentMapper.xml的主要代码如下:

        

<mapper namespace="com.mialab.mybatis_ResultMap_demo.mapper.StudentMapper">
	<resultMap id="studentResultMap" type="student">
		<id property="sno" column="stu_sno" />
		<result property="name" column="stu_name" />
		<result property="sex" column="stu_sex" />
		<result property="age" column="stu_age" />
		<result property="dept_no" column="stu_dept_no" />
	</resultMap>

	<select id="getSudentAll" resultMap="studentResultMap">
		select * from student_2
	</select>
</mapper>

        

        这里column属性表示数据库表的列名,property 表示数据库列映射到返回类型的属性。<resultMap id=“studentResultMap”type=“student”>中的id 是resultMap 的唯一标识符,type则表示 resultMap的实际返回类型。“student”是类型别名,表示的是“com.mialab.mybatis_ResultMap_demo.domain.Student", 在mybatis-config.xml中有声明。

        <id property="sno" column="stu_ sno" />中的id表示这个对象的主键(或者唯一标识),property表示POJO的属性名称,column 表示数据库表的列名。这样,POJO就和数据库SQL的结果一一对应起来了 。

        (5)测试。

        main方法的主要测试代码如下:

StudentMapper mapper = session.getMapper(StudentMapper.class);
List<Student> stu_list = mapper.getSudentAll();
for(Student stu:stu_list) {
	//System.out.println(stu);
	log.info(stu);
}

        运行ResultMap_ Main 的main方法,控制台显示内容如下:

        

DEBUG [main] - ==>  Preparing: select * from student_2 
DEBUG [main] - ==> Parameters: 
DEBUG [main] - <==      Total: 4
 INFO [main] - Student [sno=20231505, name=Marry, sex=女, age=18, dept_no=260]
 INFO [main] - Student [sno=20231506, name=王宝宝, sex=男, age=22, dept_no=2602]
 INFO [main] - Student [sno=20231508, name=李勇, sex=男, age=20, dept_no=2605]
 INFO [main] - Student [sno=20231509, name=刘娟, sex=女, age=19, dept_no=2605]

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

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

相关文章

Qt项目---简单的计算器

在这篇技术博客中&#xff0c;我们将介绍如何使用Qt框架实现一个简单的计算器应用。我们将使用C编程语言和Qt的图形用户界面库来开发这个应用&#xff0c;并展示如何实现基本的算术操作。 项目设置 首先&#xff0c;我们需要在Qt Creator中创建一个新的Qt Widgets应用程序项目…

7.物联网操作系统互斥信号量

优先级翻转问题 优先级翻转功能需求 优先级翻转功能实现 一。实验&#xff1a;优先级翻转问题 1.优先级翻转的解释 &#xff08;1&#xff09;有三个任务&#xff0c;一个任务L优先级最低&#xff0c;一个任务M优先级为中间&#xff0c;一个任务H优先级为最高。 &#xff08…

SpringBoot集成企业微信群聊机器人消息

目录 参考文档概述一、功能作用二、应用场景三、 群机器人发送限制四、创建机器人1、添加2、群机器人Webhook地址 五、发送消息1、文本 text请求体 图文连接 news 参考文档 官方文档 企业微信群机器人应用 概述 现在很多企业都在使用企业微信进行工作交流&#xff0c;自从企…

静态路由下一跳地址怎么确定(静态路由配置及讲解)

一、用到的所有命令及功能 ①ip route-static 到达网络地址 子网掩码 下一跳 // 配置静态路由下一跳指的是和当前网络直接连接的路由器的接口地址非直连网段必须全部做路由路径是手工指定的&#xff0c;在大规模网络上不能用&#xff0c;效率低&#xff0c;路径是固定的稳定的…

寻找旋转排序数组中的最小值——力扣153

文章目录 题目描述解法 二分法 题目描述 解法 二分法 int findMin(vector<int>& nums){int l0, rnums.size()-1;while(l<r){int mid (lr)/2;if(nums[mid]<nums[r]) rmid;else lmid1;}return nums[l];}

基于freeRTOS的垃圾桶(cubeMX)

前言&#xff1a;最近学习了freertos的任务、队列、互斥量、任务标志位等理论知识&#xff0c;看着都会就怕一练就废&#xff0c;于是打算做些项目巩固一下&#xff0c;加深一下对freertos知识的理解。 一、项目介绍 项目简单需求&#xff1a; 检测靠近时&#xff0c;垃圾桶自…

APUE学习62章终端(二): stty命令特殊字符终端标志

1. stty命令 stty命令的英文解释: 很明显stty有一个-F参数 所以准确的说: stty命令是设置当前终端驱动程序(也有可能直接配置了硬件&#xff0c;这点目前不清楚)的属性&#xff0c;使当前终端的驱动程序能够使能/去使能一些特殊字符的识别与处理等等 2. stty命令的结构 3. 终端…

Python web实战之 Django 的 ORM 框架详解

本文关键词&#xff1a;Python、Django、ORM。 概要 在 Python Web 开发中&#xff0c;ORM&#xff08;Object-Relational Mapping&#xff0c;对象关系映射&#xff09;是一个非常重要的概念。ORM 框架可以让我们不用编写 SQL 语句&#xff0c;就能够使用对象的方式来操作数据…

总结946

6:40起床 7&#xff1a;15~8:00早读&#xff0c;07年tex1,2 8:10~10:12 880第二章选填&#xff0c;题目有些综合&#xff0c;错的有些多呀&#xff0c;不要紧&#xff0c;拿下它&#xff0c;就有进步了。 10:28~11:27重做强化18讲6道题 12&#xff1a;10~2:15吃饭睡觉&…

MySQL 三大日志日志:undo log、redo log、binlog

目录 一条SQL的执行流程 为什么需要 undo log&#xff1f; undo log 是如何刷盘&#xff08;持久化到磁盘&#xff09;的&#xff1f; 为什么需要 Buffer Pool&#xff1f; Buffer Pool 缓存什么&#xff1f; Undo 页是记录什么&#xff1f; 查询一条记录&#xff0c;就只需…

代码随想录算法训练营第三十二天 | Leetcode随机抽题检测

Leetcode随机抽题检测 46 全排列未看解答自己编写的青春版重点题解的代码日后复习重新编写 78 子集未看解答自己编写的青春版重点题解的代码日后复习重新编写 17 电话号码的字母组合未看解答自己编写的青春版重点题解的代码日后复习重新编写 39 组合总和未看解答自己编写的青春…

SpringBoot项目增加logback日志文件

一、简介 在开发和调试过程中&#xff0c;日志是一项非常重要的工具。它不仅可以帮助我们快速定位和解决问题&#xff0c;还可以记录和监控系统的运行状态。Spring Boot默认提供了一套简单易用且功能强大的日志框架logback&#xff0c;本文将介绍如何在Spring Boot项目中配置和…

使用AIGC工具提升安全工作效率

新钛云服已累计为您分享760篇技术干货 在日常工作中&#xff0c;安全人员可能会涉及各种各样的安全任务&#xff0c;包括但不限于&#xff1a; 开发某些安全工具的插件&#xff0c;满足自己特定的安全需求&#xff1b;自定义github搜索工具&#xff0c;快速查找所需的安全资料、…

HTML基础介绍2

表单格式化 ctrld&#xff1a;复制选中行数的所有代码 ctrlx&#xff1a;删除代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>表单综合案例</title> </head> <body> <!--…

(AcWing)01背包问题

有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 ii 件物品的体积是 vi&#xff0c;价值是 wi。 求解将哪些物品装入背包&#xff0c;可使这些物品的总体积不超过背包容量&#xff0c;且总价值最大。 输出最大价值。 输入格式 第一行两个整数N&#xff0c;V&…

0基础学习VR全景平台篇 第76篇:全景相机-圆周率全景相机如何直播推流

圆周率科技&#xff0c;成立于2012年&#xff0c;是中国最早投身嵌入式全景算法研发的团队之一&#xff0c;亦是全球市场占有率最大的全景算法供应商。相继推出一体化智能屏、支持一键高清全景直播的智慧全景相机--Pilot Era和Pilot One&#xff0c;为用户带来实时畅享8K的高清…

【AGI】世界首次实现室温超导LK-99

论文&#xff1a;The First Room-Temperature Ambient-Pressure Superconductor GPT论文总结&#xff1a; 根据所提供的信息&#xff0c;这篇论文报道了一种在室温和常压下工作的室温超导体LK-99。LK-99的超导性是通过微小的结构畸变引起的&#xff0c;而不是通过温度和压力等外…

快速部署外卖系统:利用现代工具简化开发流程

在竞争激烈的外卖市场中&#xff0c;快速部署高效稳定的外卖系统是餐饮企业成功的关键之一。本文将介绍如何利用现代工具简化外卖系统的开发流程&#xff0c;并附带代码示例&#xff0c;帮助开发者快速搭建功能完备、用户友好的外卖平台。 1. 简介 在外卖业务快速增长的背景…

c++编写坦克大战(同年回忆)全网最全的讲解

c编写坦克大战 项目前言 需要熟练的掌握c语言&#xff0c;c。熟练掌握各种数据类型和数据结构。拥有优秀的文档阅读能力&#xff08;设计EasyX图形库的使用&#xff09;&#xff0c;拥有一个漂亮温柔的女朋友。 环境准备 我这里使用的是VS2022,还需要安装EasX图形库。安装教程…

C算法——生成牌 洗牌算法

生成牌 // // Created by Lenovo on 2022-06-11-下午 3:15. // 作者&#xff1a;小象 // 版本&#xff1a;1.0 //#include <stdio.h> #include <time.h> #include <stdlib.h>#define M 1 // 基数 #define N 20 // 洗牌次数 #define TOTAL_NUMS (N - M 1) …