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.hqwc.cn/news/502357.html

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

相关文章

逆变器专题(16)-构网型逆变器与跟网型逆变器

相应仿真原件请移步资源下载 现如今&#xff0c;常规的逆变器控制方法主要分为跟网型以及构网型逆变器 跟网型逆变器即常规意义上的并网逆变器&#xff0c;即输出电流直接接入大电网&#xff0c;通常为电流源型逆变器&#xff0c;其输出电流的相位与频率时随着电网电压而随时进…

GitHub Copilot extension activation error: ‘No access to GitHub Copilot found‘

好不容易学生认证通过了&#xff0c;打开vscode用copilot结果一直报这个错误。我的原因是&#xff1a;还未给copilot授权&#xff0c; 通过了学生认证后要进入这里进行授权&#xff1a;

常见外设学习以及无线通信频率

常见外设 UART UART&#xff08;Universal Asynchronous Receiver/Transmitter&#xff0c;通用异步收发器&#xff09;是一种异步、串行、全双工的通信总线。 UART 有3根线&#xff0c;分别是&#xff1a;发送线&#xff08;TX&#xff09;、接收线&#xff08;RX&#xff…

抽象类与抽象方法

文章目录 抽象类抽象类的特点 抽象方法抽象方法的特点 模板设计模式模板设计模式能解决的问题示例 #抽象类与抽象方法 抽象类 用abstract关键字来修饰一个类时&#xff0c;这个类就叫抽象类。 public abstract 类名{... }抽象类的特点 1&#xff09;抽象类不能被实例化。 2&…

新闻网站封锁AI爬虫 AI与新闻媒体博弈继续

随着ChatGPT等新兴AI模型的兴起&#xff0c;它们所依赖的网络爬虫正面临来自全球主流新闻网站的大规模封锁。Richard Fletcher博士团队对十个国家主流新闻网站的统计发现&#xff0c;到2023年底&#xff0c;48%的网站屏蔽了OpenAI的爬虫&#xff0c;24%屏蔽了Google的爬虫。那么…

批量自动加好友神器!微信快速扩友秘籍!

对于一些个人或者企业来说&#xff0c;传统的人工添加好友方式往往会出现效率低下&#xff0c;费时费力的问题。那么&#xff0c;有没有一种快速、便捷、安全的方式来解决这个问题呢&#xff1f;答案当然是肯定的&#xff0c;那就是通过使用微信管理系统来解决这一问题。 在微…

缓存穿透解决方案之布隆过滤器

布隆过滤器可以快速判断数据是否存在&#xff0c;避免从数据库中查询数据是否存在&#xff0c;减轻数据库的压力 布隆过滤器是由一个初值为0的bit数组和N个哈希函数&#xff0c;可以用来快速的判断某个数据是否存在 当我们想要标记某个数据是否存在时&#xff0c;布隆过滤器会…

收银系统源码-智慧新零售,ERP进销存功能详解

智慧新零售是一套线下线上一体化的收银系统&#xff0c;不仅给门店线下提供了多样化的收款方式&#xff0c;还提供了和线下深度打通的线上小程序商城。有线下又有线上自然需要一套完整的进销存模块能高效的管理商品。 智慧新零售进销存功能涵盖了商品的采购、销售、调拨、盘点…

(学习日记)2024.03.01:UCOSIII第三节

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

请查收:2024年腾讯云服务器优惠价格表_租用配置报价

一张表看懂腾讯云服务器租用优惠价格表&#xff0c;一目了然&#xff0c;腾讯云服务器分为轻量应用服务器和云服务器CVM&#xff0c;CPU内存配置从2核2G、2核4G、4核8G、8核16G、4核16G、8核32G、16核32G、16核64等配置可选&#xff0c;公网带宽1M、3M、5M、12M、18M、22M、28M…

Doccano的标注结果转换为BIO格式

简介 实现了Doccano导出格式到BIO命名实体识别格式的转换 演示 Doccano的导出格式: {"id":161,"text":"“十四五”时期是我省全面建成小康社会之后&#xff0c;乘势而上开启全面建设社会主义现代化国家新征程的第一个五年&#xff0c;也是谱写新时代…

智慧旅游+数字化景区整体解决方案:文件全文83页,附下载

关键词&#xff1a;智慧景区建设&#xff0c;智慧旅游一体化平台&#xff0c;数字化景区建设&#xff0c;智慧旅游建设&#xff0c;智慧景区解决方案&#xff0c;智慧文旅解决方案&#xff0c;智慧旅游解决方案 一、景区智慧旅游建设需求与背景分析 1、技术发展背景 随着信息…