MyBatis 学习(四)之 SQL 映射文件

目录

1 SQL 映射文件介绍

2 select 元素

3 insert 元素

4 update 和 delete 元素

5 sql 元素       

6 parameterType 元素

7 resultType 元素

8 resultMap 元素(重要)

9 参考文档


1 SQL 映射文件介绍

        映射器是 MyBatis 中最复杂并且是最重要的组件。它由一个接口和 SQL 映射文件(或者注解)组成。在映射器中我们可以配置各类 SQL、动态 SQL、缓存、存储过程、级联等复杂的内容。

以下是 SQL 映射文件的部分元素介绍

元素描述
cache该命名空间的缓存配置
cache-ref引用其它命名空间的缓存配置
resultMap描述如何从数据库结果集中加载对象,它是最复杂也是最强大的元素
sql可被其它语句引用的可重用语句块
select映射查询语句
insert映射插入语句
update映射更新语句
delete映射删除语句

2 select 元素

select 元素表示 SQL 的 select 语句,用于查询,以下是 select 元素的部分属性

属性

描述
id在命名空间中唯一的标识符,可以被用来引用这条语句
parameterType将会传入这条语句的参数类的全类名或别名。这个属性是可选的,因为 MyBatis 可以通过类型处理器(TypeHandler) 推断出具体传入语句的参数,默认值为未设置(unset)
resultType从这条语句中返回的期望类型的类的全类名或别名。 注意如果返回的是集合,那应该设置为集合包含的类型,而不是集合本身。可以使用 resultType 或 resultMap,但不能同时使用
resultMap外部 resultMap 的命名引用。结果集的映射是 MyBatis 最强大的特性,如果你对其理解透彻,许多复杂映射的情形都能迎刃而解。可以使用 resultMap 或 resultType,但不能同时使用
flushCache将其设置为 true 后,只要语句被调用,都会导致本地缓存和二级缓存被清空,默认值:false
useCache将其设置为 true 后,将会导致本条语句的结果被二级缓存缓存起来,默认值:对 select 元素为 true
timeout这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为未设置(unset)(依赖驱动)
fetchSize这是一个给驱动的提示,尝试让驱动程序每次批量返回的结果行数和这个设置值相等。 默认值为未设置(unset)(依赖驱动)
statementTypeSTATEMENT,PREPARED 或 CALLABLE 中的一个。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED
resultSetTypeFORWARD_ONLY,SCROLL_SENSITIVE, SCROLL_INSENSITIVE 或 DEFAULT(等价于 unset) 中的一个,默认值为 unset (依赖驱动)
databaseId如果配置了数据库厂商标识 (databaseIdProvider) 并且存在两个相同的语句,一个带 databaseId 而另一个不带,MyBatis 会优先加载带有 databaseId 的语句。如果 databaseId 与当前数据库匹配,则不带 databaseId 的相同语句将被忽略。未设置 databaseId 使用通用 SQL 规则
resultOrderedresultOrdered:这个设置仅对嵌套结果 select 语句适用:如果为 true,就是假设包含了嵌套结果集或是分组,这样的话当返回一个主结果行的时候,就不会发生有对前面结果集的引用的情况。 这就使得在获取嵌套的结果集的时候不至于导致内存不够用。默认值:false
resultSets这个设置仅对多结果集的情况适用。它将列出语句执行后返回的结果集并给每个结果集一个名称,名称是逗号分隔的

3 insert 元素

属性

描述
id在命名空间中唯一的标识符,可以被用来引用这条语句
parameterType将会传入这条语句的参数的类全限定名或别名。这个属性是可选的,因为 MyBatis 可以通过类型处理器(TypeHandler)推断出具体传入语句的参数,默认值为未设置(unset)
flushCache将其设置为 true 后,只要语句被调用,都会导致本地缓存和二级缓存被清空,默认值:(对 insert、update 和 delete 语句)true
timeout这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为未设置(unset)(依赖数据库驱动)
statementType可选 STATEMENT,PREPARED 或 CALLABLE。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED
useGeneratedKeys(仅适用于 insert 和 update)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系型数据库管理系统的自动递增字段),默认值:false
keyProperty(仅适用于 insert 和 update)指定能够唯一识别对象的属性,MyBatis 会使用 getGeneratedKeys 的返回值或 insert 语句的 selectKey 子元素设置它的值,默认值:未设置(unset)。如果生成列不止一个,可以用逗号分隔多个属性名称。不能和keyColumn连用
keyColumn(仅适用于 insert 和 update)设置生成键值在表中的列名,在某些数据库(像 PostgreSQL)中,当主键列不是表中的第一列的时候,是必须设置的。如果生成列不止一个,可以用逗号分隔多个属性名称。不能和keyProperty连用
databaseId同 select 元素

主键回填

        在 MyBatis 中,若表中的主键设置为自增,插入数据时没有插入主键,但是又想获得数据库中该条数据的主键,那么可以通过设置 useGeneratedKeys=”true”,然后再把 keyProperty 设置到目标属性(如 User 类中的 id 属性)上来获得该值。

<insert id="insertUser" parameterType="com.entity.User" useGeneratedKeys="true" keyProperty="id">insert into person(name, age, sex)values (#{name}, #{age}, #{sex});
</insert>
//添加一个用户数据
@Test
public void testInsertUser() {String statement = "com.mapper.UserMapper.insertUser";User user = new User();user.setName("孙尚香");user.setAge(24);user.setSex("女");int i = sqlSession.insert(statement, user);System.out.println( (i>0)? "添加成功!":"添加失败!");//提交插入的数据sqlSession.commit();sqlSession.close();// 输出返回的主键值System.out.println("返回的主键值=" + user.getId());
}

自定义主键并且可以在 Java 中通过属性获得该值

在 MyBatis 中可以通过 selectKey 元素自定义主键,以下是其属性介绍

  • keyProperty:selectKey 需要设置的目标属性
  • resultType:结果类型
  • order:可以设置为 BEFORE 或 AFTER ,表示先设置主键,后执行插入语句或先执行插入语句,后设置主键
<insert id="insertUser" parameterType="com.entity.User" ><selectKey keyProperty="id" resultType="int" order="BEFORE">select ROUND(RAND()*1000)</selectKey>insert into person(id, name, age, sex)values (#{id}, #{name}, #{age}, #{sex});
</insert>
@Test
public void testInsertUser() {String statement = "com.mapper.UserMapper.insertUser";User user = new User();user.setName("郑旦");user.setAge(24);user.setSex("女");int i = sqlSession.insert(statement, user);System.out.println( (i>0)? "添加成功!":"添加失败!");//提交插入的数据sqlSession.commit();sqlSession.close();// 输出返回的主键值System.out.println("返回的主键值=" + user.getId());
}

  

4 update 和 delete 元素

        update 和 delete 元素在使用上比较简单,所以这里把它们放在一起论述。它们和 insert 元素的属性差不多,执行完后也会返回一个整数,用来表示该 SQL 语句影响了多少条数据库记录。

<!-- 根据 id 更新用户 -->
<update id="updateUser">update person set name = #{name},age = #{age},sex = #{sex} where id = #{id}
</update>
<!-- 根据 id 删除用户 -->
<delete id="deleteUser" parameterType="int">delete from person where id = #{id}
</delete>

5 sql 元素       

        sql 元素是用来定义可重用的 sql 代码片段,这样在字段比较多的时候,以便在其它语句中使用。需要结合 include 元素一起使用,以下是代码示例。

<!--定义sql代码片段-->
<sql id="userCols">id,username,age,sex
</sql>
<!-- 查询所有用户 -->
<select id="selectAllUser" resultType="com.entity.User">select <include refid="userCols"/> from person
</select>

6 parameterType 元素

parameterType 元素可以输入以下类型:

  • Java 基本数据类型
  • POJO 类型
  • Map 类型
<!-- 通过 普通数据类型 int 查询一个用户 -->
<select id="selectUserById" parameterType="int" resultType="com.entity.User">select * from person where id = #{id};
</select><!-- 通过 POJO 类型 User 添加用户-->
<insert id="insertUser" parameterType="com.entity.User">insert into person(id,username,age,sex) values (#{id},#{username},#{age},#{sex});
</insert><!-- 通过 嵌套 POJO 类型 查询一个用户,QueryVo 类中定义了 User user 属性 -->
<select id="selectUserByUserNameAndAge" parameterType="com.entity.QueryVo" resultType="com.entity.User">select * from person where name = #{user.name} and age = #{user.age};
</select><!-- 通过 Map 类型 查询一个用户, HashMap<String, Object> map = new HashMap<>(); 
map.put("name","赵飞燕"); map.put("age",24); 通过 key 获得 map 中的 value-->
<select id="selectUserByMap" parameterType="hashmap" resultType="com.entity.User">select * from person where name = #{name} and age = #{age};
</select>

7 resultType 元素

resultType 元素和 parameterType 元素用法差不多,一个是输出,一个是输入。resultType 元素可以输出以下类型:

  • Java 基本数据类型
  • POJO 对象
  • POJO 对象列表
  • Map 对象列表
<!-- 统计用户总数量,输出为一个整数 int -->
<select id="countUsers" resultType="int">select count(1) from person
</select><!-- 通过 id 查询一个用户,输出为一个 User -->
<select id="selectUserById" parameterType="int" resultType="com.entity.User">select * from personwhere id = #{id};
</select><!-- 查询所有用户,输出为一个 List<User> 列表 -->
<select id="selectAllUser" resultType="com.entity.User">select * from person
</select><!-- 查询所有用户, 输出为一个 List<HashMap<String, Object>> Map 列表-->
<select id="selectAllUser" resultType="hashmap">select * from person
</select>

8 resultMap 元素(重要)

        我们在使用 resultType 的时候,需要保证数据库表中的字段名和表对应实体类的属性名称一致才行(包括驼峰命名规则)。那不一致怎么办,查询的时候可以给列名起个别名,但是一般不建议这样做,而是通过 resultMap 元素进行一个转换。

<!-- id:唯一标识,type:需要映射的 Java 类型-->
<resultMap id="userMap" type="com.entity.User"><!-- 与主键字段的对应,property对应实体属性,column对应表字段 --><id property="userId" column="id"/><!-- 与非主键字段的对应,property对应实体属性,column对应表字段 --><result property="userName" column="username"/><result property="userAge" column="age"/><result property="userSex" column="sex"/>
</resultMap><!-- 查询所有用户,返回集为resultMap类型,resultMap的value上面配置的 id=userMap 要一致-->
<select id="selectAllUser" resultMap="userMap">select * from person
</select>

上述代码是不是很眼熟,在 MyBatis 案例中使用了 @ResultMap 注解来实现上述代码

resultMap 元素的组成

<!-- autoMapping:指定是否自动映射查询结果的列到 Java 对象的属性。
默认为开启(true),如果设置为 false,则需要手动配置每个属性的映射关系 -->
<resultMap id="标识" type="输出类型" extends="继承其他 <resultMap>" autoMapping="自动映射"><constructor><!--构造器注入属性值--><!-- 构造器标识,一般为主键 --><!-- column对应表字段,name对应实体属性 --><idArg column="id" name="userId" javaType="int"/><!-- 构造器参数 --><arg column="username" name="userName" javaType="string"/> </constructor><!-- id 与主键字段的对应,property对应实体属性,column对应表字段 --><id property="userId" column="id"/><!-- result 与非主键字段的对应,property对应实体属性,column对应表字段 --><result property="userName" column="username"/><association/><!--高级映射,一对一映射--><collection /><!--高级映射,一对多映射--><discriminator><case/></discriminator><!--根据返回的字段的值封装不同的类型-->
</resultMap>

9 参考文档

Mybatis3详解(四)----SQL映射文件详解(XxxMapper.xml) - 唐浩荣 - 博客园 (cnblogs.com)

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

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

相关文章

Vue(3.3.4)+three.js(0.161.0)实现3D可视化地图

一.前言 由于最近在学习three.js,所以观摩了一下掘金&#xff0c;csdn等网站上的有关这部分的内容&#xff0c;刚好看到一个带你入门three.js——从0到1实现一个3d可视化地图 - 掘金 (juejin.cn)&#xff0c;再加上我的专业属性是地理相关&#xff0c;可以说是专业对口&#xf…

存储xss实现获取cookie(本地实战)

实战更能体验收获&#xff01;&#xff01;&#xff01; 环境准备&#xff1a; 1.phpstudy 2.dvwa靶场 实战 首先我们在phpstudy指定的localhost网站目录下编写一个xss.php文件&#xff0c;内容如下&#xff1a; <?php $cookie $_GET[cookie]; $ip getenv (REMOTE_…

electron+vue3全家桶+vite项目搭建【28】封装窗口工具类【2】窗口组,维护窗口关系

文章目录 引入实现效果思路主进程模块渲染进程模块测试效果 引入 demo项目地址 窗口工具类系列文章&#xff1a; 封装窗口工具类【1】雏形 我们思考一下窗口间的关系&#xff0c;窗口创建和销毁的一些动作&#xff0c;例如父子窗口&#xff0c;窗口组合等等&#xff0c;还有…

【前端素材】推荐优质在线高端家具电商网页Classi平台模板(附源码)

一、需求分析 1、系统定义 在线高端家具商城是一个专门销售高端家具产品的电子商务平台&#xff0c;旨在为消费者提供购买高品质家具的便捷渠道。 2、功能需求 在线高端家具商城是一个专门销售高端家具产品的电子商务平台&#xff0c;旨在为消费者提供购买高品质家具的便捷…

Maven高级(黑马学习笔记)

Maven 是一款构建和管理 Java 项目的工具。 分模块设计与开发 介绍 所谓分模块设计&#xff0c;顾名思义指的就是我们在设计一个 Java 项目的时候&#xff0c;将一个 Java 项目拆分成多个模块进行开发。 1). 未分模块设计的问题 如果项目不分模块&#xff0c;也就意味着所有…

node.js和electron安装

文章目录 一、node.js安装1.node.js下载安装2.设置镜像 二、其它问题1.文件夹创建错误2.electron安装错误 一、node.js安装 1.node.js下载安装 参考B站视频node.js安装&#xff0c;没有按视频中设置镜像 2.设置镜像 参考&#xff1a;https://npmmirror.com/ npm config se…

十八:Java8新特性

文章目录 01、Java8概述02、Java8新特性的好处03、并行流与串行流04、Lambda表达式4.1、Lambda表达式使用举例4.2、Lambda表达式语法的使用14.3、Lambda表达式语法的使用2 05、函数式(Functional)接口5.1、函数式接口的介绍5.2、Java内置的函数式接口介绍及使用举例 06、方法引…

Hgame题解(第二星期)

Hgame题解&#xff08;第二星期&#xff09; Web Select More Courses 打开靶机发现是一个登陆页面&#xff0c;根据题目提示下载弱密码字典&#xff0c;通过BP爆破获得用户密码为qwert123 登陆后进入下一个页面&#xff0c;由于学分已满无法选课&#xff0c;所以需要先进行…

回归预测 | Matlab实现BiTCN基于双向时间卷积网络的数据回归预测

回归预测 | Matlab实现BiTCN基于双向时间卷积网络的数据回归预测 目录 回归预测 | Matlab实现BiTCN基于双向时间卷积网络的数据回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现BiTCN基于双向时间卷积网络的数据回归预测&#xff08;完整源码和数据&a…

推荐莹莹API管理系统PHP源码

莹莹API管理系统PHP源码附带两套模板,PHP版本要求为5.6至8.0之间&#xff0c;已测试通过的版本为7.4。 需要安装PHPSG11加密扩展。 已测试&#xff1a;宝塔/主机亲测成功搭建&#xff01; 演示地 址 &#xff1a; runruncode.com/php/19698.html 安装说明&#xff08;适用于宝…

深入理解c指针(六)

目录 九、函数指针数组 1、字符指针变量 2、数组指针变量 3、二维数组传参的本质 4、函数指针变量 4.1 分析《C陷阱和缺陷》中的两端代码 4.2 typedef关键字 5、函数指针数组 6、函数指针数组的用途---转移表 九、函数指针数组 1、字符指针变量 在指针的类型中我们知道…

【C++精简版回顾】15.继承派生

1.继承派生的区别 继承&#xff1a;子继父业&#xff0c;就是子类完全继承父类的全部内容 派生&#xff1a;子类在父类的基础上发展 2.继承方式 1.public继承为原样继承 2.protected继承会把public继承改为protect继承 3.private继承会把public&#xff0c;protected继承改为pr…

怎么抠图把把人物扣下来?简单快捷的抠图方法

相信很多新手小白在初入设计行业时&#xff0c;对于抠图怎么把人物扣下来都是一头雾水。抠图作为设计中常用的一种技术&#xff0c;能够帮助我们快速提取图片中的某个部分&#xff0c;进行合成或者修改。对于老手来说&#xff0c;抠图或许是再熟悉不过的操作&#xff0c;但对于…

c语言---数组(超级详细)

数组 一.数组的概念二. 一维数组的创建和初始化2.1数组的创建2.2数组的初始化错误的初始化 2.3 数组的类型 三. 一维数组的使用3.1数组的下标3.2数组元素的打印3.2数组元素的输入 四. 一维数组在内存中的存储五. 二维数组的创建5.1二维数组的概念5.2如何创建二维数组 六.二维数…

【嵌入式学习】QT-Day4-Qt基础

简单实现闹钟播报&#xff0c;设置时间&#xff0c;当系统时间与设置时间相同时播报语音5次&#xff0c;然后停止。如果设置时间小于当前系统时间&#xff0c;则弹出消息提示框&#xff0c;并清空输入框。 #include "my_clock.h" #include "ui_my_clock.h&quo…

批量处理图片,像素随心所欲,创意无限释放!

在数字化时代&#xff0c;图片批量处理已成为设计、摄影、电商等多个领域不可或缺的一部分。然而&#xff0c;传统的图片批量处理方式往往效率低下&#xff0c;难以满足现代人对高效和精准的需求。现在&#xff0c;我们为您带来了一款一键图片批量处理工具&#xff0c;让您自由…

【Vue】更换浏览器默认 logo

更换浏览器默认logo为自定义图片 一. 浏览器默认 logo二. 替换为自定义logo三. 步骤3.1 转换大小3.1.1 查看图片尺寸3.1.2 修改尺寸&#xff08;为32px 32px&#xff09; 3.2 替换成功 一. 浏览器默认 logo 二. 替换为自定义logo 三. 步骤 3.1 转换大小 将自定义 logo 转为323…

docker搭建zookeeper集群

文章目录 1. 集群搭建2. Leader选举3. Zookeeper集群角色 1. 集群搭建 这里我们使用docker-compose 搭建伪集群 version: 3.1 services:zoo1:image: zookeeperrestart: alwayscontainer_name: zoo1ports:- 2181:2181volumes:- /home/zk/zoo1/data:/data- /home/zk/zoo1/datal…

React富文本编辑器开发(二)

我们接着上一节的示例内容&#xff0c;现在有如下需求&#xff0c;我们希望当我们按下某个按键时编辑器有所反应。这就需要我们对编辑器添加事件功能onKeyDown, 我们给 Editor添加事件&#xff1a; SDocor.jsx import { useState } from react; import { createEditor } from…

协方差矩阵计算

文章目录 协方差矩阵计算原理python实现 协方差矩阵 协方差矩阵反映了两个随机变量变化时是同向还是反向的&#xff08;相关性&#xff09;。 如果协方差>0&#xff0c;则说明这两个随机变量同向变化。 协方差矩阵<0&#xff0c;则说明是反向变化。 协方差矩阵0&#xf…