Mybatis框架(二)再遇Mybatis之Mybatis配置文件与映射文件

news2024/12/25 22:25:09

本文是本人专栏【Java开发后端系列框架】里的文章,文章根据各框架官网与网上资料加上本人工作经验,进行修改总结发布在这个专栏,主要目的是用于自我提升,不用于获取利益。如果系列文章能到帮到您本人将感到荣幸,如果有侵权请联系我删除修,祝各位都能在编程这条路越走越远,早日暴富。

文章目录

      • 一、Mybatis配置文件
        • **1、properties(属性)**
        • 2、settings(设置)
        • 3、typeAliases(类型别名)
        • 4、typeHandlers(类型处理器)
        • 5、objectFactory(对象工厂)
        • 6、plugins(插件)
        • 7、environments(环境配置)
        • 8、transactionManager(事务管理器)
        • 9、mappers(映射器)
      • 二、Mapper映射文件
        • 1、namespace 命名空间
        • 2、映射文件里的九大顶级元素

一、Mybatis配置文件

在本专栏Mybatis的第一篇文章中,里面的Mybatis-config.xml即为Mybatis配置文件。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/jf?useUnicode=true&amp;characterEncoding=utf8" />
                <property name="username" value="root" />
                <property name="password" value="123456" />
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="UserMapper.xml" />
    </mappers>
</configuration>

在配置文件里, configuration(配置)作为最顶级节点,其余属性都必须嵌套在其内。这些属性能够影响Mybatis的的行为,各属性如下:

configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)

需要注意的是,配置文件里的属性在配置时必须按照上面的顺序,否则框架会抛出异常,下面对其中比较重要的属性进行解析。

1、properties(属性)

提供属性配置,可进行动态替换,一般在 Java 属性文件中配置,例如 jdbc.properties 配置文件 ,或通过 properties 元素标签中的子元素 property 来指定配置。
如:

<dataSource type="POOLED">
      <property name="driver" value="com.mysql.jdbc.Driver" />
      <property name="url" value="jdbc:mysql://localhost:3306/jf?useUnicode=true&amp;characterEncoding=utf8" />
      <property name="username" value="root" />
      <property name="password" value="123456" />
</dataSource>

如果使用配置文件,则先创建properties配置文件

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jf?useUnicode=true&amp;characterEncoding=utf8
username=root
password=123456

在Mybatis配置文件引入

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 引入属性配置文件 -->
    <properties resource="jdbc.properties"></properties>
    
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="UserMapper.xml" />
    </mappers>
</configuration>

需要注意的是,如果既引入了配置文件,又在 property 自行配置了其他的,那么框架还是会使用你引入的 properties 配置文件的信息,而不是在Mybatis配置文件里你自行配置的信息。

2、settings(设置)

 <settings>
        <!--以下配置的value值均为默认值-->
        <!--全局开启或关闭所有映射器配置文件中已配置的任何缓存-->
        <setting name="cacheEnabled" value="true"/>
        <!--懒加载。开启后所有关联对象都会延迟加载。特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态-->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!--是否允许单个语句返回多结果集-->
        <setting name="multipleResultSetsEnabled" value="true"/>
        <!--使用列标签代替列名-->
        <setting name="useColumnLabel" value="true"/>
        <!--允许 JDBC 支持自动生成主键-->
        <setting name="useGeneratedKeys" value="false"/>
        <!--指定 MyBatis 应如何自动映射列到字段或属性
            NONE:关闭自动映射 PARTIAL:自动映射没有定义嵌套结果映射的字段  FULL:会自动映射任何复杂的结果集-->
        <setting name="autoMappingBehavior" value="PARTIAL"/>
        <!--指定发现自动映射目标未知列(或未知属性类型)的行为
            NONE: 不做任何反应 WARNING: 输出警告日志 AILING: 映射失败 (抛出 SqlSessionException)-->
        <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
        <!--配置默认的执行器。SIMPLE:普通执行器 REUSE:执行器会重用预处理语句(PreparedStatement)
            BATCH:执行器不仅重用语句还会执行批量更新。-->
        <setting name="defaultExecutorType" value="SIMPLE"/>
        <!--设置超时时间,决定数据库驱动等待数据库响应的秒数-->
        <setting name="defaultStatementTimeout" value=""/>
        <!--获取结果集数量的建议值,支持任何正整数-->
        <setting name="defaultFetchSize" value=""/>
        <!--是否允许在嵌套语句中使用分页(RowBounds),允许则设置为false-->
        <setting name="safeRowBoundsEnabled" value="false"/>
        <!--是否开启驼峰命名自动映射-->
        <setting name="mapUnderscoreToCamelCase" value="false"/>
        <!--防止循环引用和加速重复的嵌套查询的一种本地缓存机制。SESSION:会缓存一个会话中执行的所有查询
            STATEMENT,本地缓存将仅用于执行语句,对相同 SqlSession 的不同查询将不会进行缓存-->
        <setting name="localCacheScope" value="SESSION"/>
        <!--当没有为参数指定特定的 JDBC 类型时,空值的默认 JDBC 类型 常用值:NULL、VARCHAR 或 OTHER-->
        <setting name="jdbcTypeForNull" value="OTHER"/>
        <!--指定对象的哪些方法触发一次延迟加载-->
        <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
    </settings>

3、typeAliases(类型别名)

<!--配置别名-->
    <typeAliases>
        <typeAlias type="top.jf.pojo.User" alias="User"/>
    </typeAliases>

配置完别名后可以再所有地方将top.jf.pojo.User改为User,如,修改UserMapper.xml配置文件

<!--查询所有用户-->
<select id="findAllUser" resultType="User">
    select * from USER
</select>

运行查询测试类,查询结果符合预期
在这里插入图片描述

4、typeHandlers(类型处理器)

主要用于处理 Java 类型与 JDBC 类型的映射关系。
MyBatis 在设置预处理SQL语句(PreparedStatement)中所需要的参数或从结果集ResultSet 中获取对象时, 都会用类型处理器将获取到的值以合适的方式转换成 Java 类型。

5、objectFactory(对象工厂)

MyBatis 每次创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成。

6、plugins(插件)

MyBatis 允许你在映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:

  • Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
  • ParameterHandler (getParameterObject, setParameters)
  • ResultSetHandler (handleResultSets, handleOutputParameters)
  • StatementHandler (prepare, parameterize, batch, update, query)

使用插件,只需实现 Interceptor 接口。
举例:编写插件拦截在 Executor 实例中所有的 “update” 方法。
创建实体类

package top.jf.interceptor;

import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Signature;

import java.util.Properties;

/**
 * @author : JF
 * @date: 2022/12/29 17:56
 */
@Intercepts({
        @Signature(
                type= Executor.class,
                method = "insert",
                args = {MappedStatement.class,Object.class})})
public class MybatisPlugin implements Interceptor {
    private Properties properties = new Properties();
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        Object returnObject = invocation.proceed();
        return returnObject;
    }
    @Override
    public void setProperties(Properties properties) {
        this.properties = properties;
    }
}

配置Mybatis配置文件

<!--拦截插件-->
    <plugins>
        <plugin interceptor="top.jf.interceptor.MybatisPlugin">
            <property name="someProperty" value="100"/>
        </plugin>
    </plugins>

7、environments(环境配置)

配置MyBatis的多套运行环境,将SQL映射到多个不同的数据库上,但得通过default指定其中一个为默认运行环境。

8、transactionManager(事务管理器)

在 MyBatis 中有两种类型的事务管理器

  • JDBC – 这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。
  • MANAGED – 它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期。

9、mappers(映射器)

有如下几种映射方式

<!-- 使用相对于类路径的资源引用 -->
<mappers>
  <mapper resource="top/jf/mapper/UserMapper.xml"/>
</mappers>

<!-- 使用完全限定资源定位符(URL) -->
<mappers>
  <mapper url="file:///var/mappers/UserMapper.xml"/>
</mappers>

<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
  <mapper class="top.jf.mapper.UserMapper"/>
</mappers>

<!-- 将包内的映射器接口实现全部注册为映射器 -->
<mappers>
  <package name="top.jf.mapper"/>
</mappers>

二、Mapper映射文件

1、namespace 命名空间

  • 一个完整的mppper文件里有有约束头 xml 与 !DOCTYPE, mapper 根元素与顶级元素,而 namespace 属性是 mapper 的唯一标识。
  • 在 Mybatis 中每一段 SQL 语句,同样有唯一的代表方式,那就是「 命名空间标识 + 语句id 」。组合之后在 Mybatis 二级缓存中可以作为本地 map 集合 缓存 的唯一Key ,也可以用于 Dao 接口的 映射 绑定,还能作为唯一 代理标识。

2、映射文件里的九大顶级元素

  • select : 用于查询,支持传参,返回指定结果集;
  • insert : 用于新增,支持传参,返回指定结果集;
  • update : 用于更新,支持传参,返回指定结果集;
  • delete : 用于删除,支持传参,返回指定结果集;
  • sql : 被其它语句引用的 可复用 语句块;
  • cache : 当前命名空间缓存配置;
  • cache-ref : 引用其它命名空间的缓存配置;
  • parameterMap : 参数映射,已弃用;
  • resultMap : 结果集映射。

select、insert、update、delete
以select举例

<select id="selectUser" parameterType="int" resultType="hashmap">
  select * from user where id = #{id}
</select>
  • id属性:当前mapper.xml文件的唯一标识
  • parameterType 属性:传入的参数类型
  • resultType属性:返回结果类型,此处使用 hashMap 接收,也可以使用实体类接收,比如这里 用 top.jf.pojo.User , 但是查询返回的字段名需要与实体类的属性保持一致。

值得注意的是,这里的占位符#{id} 会被翻译成 ‘id’,相比于${id},能有效防止sql注入,${id} 会直接翻译成 id 。

cache 缓存
默认情况下,只启用了本地的会话缓存(即一级缓存,sqlSession级别 ),它仅仅对一个会话中的数据进行缓存。 要启用全局的二级缓存,首先在全局配置文件config.xml文件中加入如下代码:

<!--开启二级缓存--> 
<settings> 
    <setting name="cacheEnabled" value="true"/> 
</settings>

其次在UserMapper.xml文件中开启缓存:

<!--开启二级缓存--> 
<cache></cache>

缓存只作用于 cache 标签所在的映射文件中的语句。缓存开启有如下等效果

  • 映射语句文件中的所有 select 语句的结果将会被缓存。
  • 映射语句文件中的所有 insert、update 和 delete 语句会刷新缓存。
  • 缓存会使用最近最少使用算法(LRU, Least Recently Used)算法来清除不需要的缓存。
  • 缓存不会定时进行刷新(也就是说,没有刷新间隔)。

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

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

相关文章

2023年3月5日DAMA-CDGA/CDGP数据治理认证考试报名入口

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

【每日阅读】前端进阶知识点(一)

如何更改网页中语言属性值 声明当前语言类 html标签更改属性值 lang属性中不区分大小写 en-us en-US 一致 具体可使用 window,document.querySelector(“html”)?.setAttribute(“lang”,newValue); qs库 qs是一个流行的查询参数序列化和解析库。可以将一个普通的object序列…

OpenPPL PPQ量化(2):离线静态量化源码剖析

目录 模型支持 量化onnx原生模型&#xff1a;quantize_onnx_model 输入输出 执行流程 ONNX格式解析 后记 模型支持 openppl支持了三种模型&#xff1a;onnx、caffe、pytorch&#xff0c;其中pytorch和caffe是通过quantize_torch_model和quantize_caffe_model&#xff0c…

Elasticsearch:Terms set 查询

什么是 terms set 查询&#xff1f; Terms set 查询根据匹配给定字段的精确术语的最少数量返回文档。 terms set 查询与 term 查询有何不同&#xff1f; Terms set query 和 Terms query 之间的唯一区别是你可以提供必须匹配的最少数量的术语才能检索特定文档。 什么是 minim…

【Ansys Meshing】Fluent Meshing和Ansys Meshing在划分边界层网格能力上的对比

一、几何模型展示 如下图所示&#xff0c;一端的圆柱是流体入口&#xff0c;另一端的圆柱是流体出口&#xff0c;中间都是导热管。 二、在spaceclaim中进行切割实体 2.1 切割手段 切割平面的位置如图两根线所示&#xff0c;最终得到左右两边两个有圆柱的大块&#xff0c;以…

【SAP Abap】X档案:SAP 快速提供基础数据给第三方系统访问的几种方法(附常用基础数据)

SAP 快速提供基础数据给第三方系统访问的几种方法1、数据封装2、开放RFC访问3、开放接口服务4、开放DB访问5、常用基础数据1、数据封装 在企业信息系统建设过程中&#xff0c;少不了的就是系统集成数据对接。 尤其是SAP系统中大量的基础数据集成&#xff0c;如各种字段值域&am…

C语言:操作符详解

往期文章 C语言&#xff1a;初识C语言C语言&#xff1a;分支语句和循环语句C语言&#xff1a;函数C语言&#xff1a;数组 目录往期文章前言1. 操作符分类2. 算术操作符3. 移位操作符4. 位操作符5. 赋值操作符6. 符合赋值符7. 单目操作符8. 关系操作符9. 逻辑操作符10. 条件操作…

Java 中的基本设计模式

设计模式是针对常见软件设计问题的可重用解决方案。它们提供了一种以一致且高效的方式组织和构建代码的方法。一些常见的设计模式包括&#xff1a;工厂模式是一种创建型设计模式&#xff0c;它提供用于在超类中创建对象的接口&#xff0c;但允许子类更改将要创建的对象的类型。…

【数据结构趣味多】优先级队列——堆

1. 优先级队列 概念&#xff1a; 队列是一种先进先出(FIFO)的数据结构&#xff0c;但有些情况下&#xff0c;操作的数据可能带有优先级&#xff0c;一般出队列时&#xff0c;可能需要优先级高的元素先出队列&#xff0c;该中场景下&#xff0c;使用队列显然不合适&#xff0c;比…

前端打包后生成的dist 或 build目录,如何在本地启动服务运行

前端打包后生成的dist/build目录&#xff0c;如何在本地启动服务运行 运行npn run build&#xff0c;会打包后会产生 dist 或 build 目录 一般情况下&#xff0c;直接打开dist 或 build 目录下的 index.html会在浏览器看到内容。 然而发现网页一片空白&#xff0c;打开了控制台…

C++基础入门(引用补充)

1、使用场景做参数void Swap(int& left, int& right) {int temp left;left right;right temp; }做返回值int& Count() {static int n 0;n;// ...return n; }c语言内&#xff0c;出了count函数&#xff0c;n被销毁&#xff0c;会创建临时变量存储其值&#xff0…

DETR——使用Transformer进行端到端目标检测的开端之作

深度学习知识点总结 专栏链接: https://blog.csdn.net/qq_39707285/article/details/124005405 此专栏主要总结深度学习中的知识点&#xff0c;从各大数据集比赛开始&#xff0c;介绍历年冠军算法&#xff1b;同时总结深度学习中重要的知识点&#xff0c;包括损失函数、优化器…

寻根究底,为什么Docker中的Alpine Linux镜像能这么小

去年我发表了文章对Docker基础镜像的思考&#xff0c;该不该选择alpine&#xff0c;其中对于Alpine Linux镜像如此之小的原因我解释为它使用了musl而不是glibc 有人发现并指出了我的这个错误&#xff0c;说musl与glibc的大小差别不足以造成如此大的差距&#xff0c;应该别有原…

C++-静态局部变量

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 特征&#xff1a; 1.需添加关键字static。 2.在静态存储区分配内存&#xff0c;始终存在直到程序结束。 3.作用域为局部&#…

阿⾥云Apsara Clouder云计算专项技能认证:云服务器ECS⼊门【 个⼈所得税年度应纳税额抵扣 3600(0成本)】

文章目录 引言I 云服务器ECS⼊门II 考试III 个⼈所得税app填写专项附加扣除引言 适合⼈群:需要交个⼈所得税的上班族,有⼀定计算机基础结果:⼯资年收⼊10-20万的,能省下360元(3600*10%)I 云服务器ECS⼊门 云服务器(Elastic Compute Service, 简称ECS),是一种简单高效,…

PDPS教程:机器人气动点焊焊枪大开与小开运动状态自动切换设置

目录 概述 气动点焊焊枪运动状态设置 机器人气动点焊焊枪工具类型定义 气动点焊焊枪运动状态切换原理 气动点焊焊枪大开与小开状态切换设置 机器人仿真运行 概述 工业机器人点焊焊接过程中&#xff0c;为了提高焊接效率、优化焊接节拍、降低能源消耗&#xff0c;通常会在…

2022尚硅谷SSM框架跟学(八)Spring MVC基础三

2022尚硅谷SSM框架跟学 八 Spring MVC基础三8.RESTful案例8.1准备工作8.2功能清单8.3.具体功能&#xff1a;访问首页(1).配置view-controller(2).创建页面8.4具体功能&#xff1a;查询所有员工数据(1).控制器方法(2).创建employee_list.html8.5具体功能&#xff1a;删除(1).创建…

企业电子招投标采购系统源码之功能模块功能描述

​ 功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&#xff0c;为外…

激光焊接/点焊的特性及优势分析?

目前应用于生产的点焊方式大多为电阻点焊、电弧点焊、激光点焊和胶接点焊等多种点焊方法。其中激光焊接是激光材料加工技术应用的重要方面之一。 激光点焊机主要由激光器、电源及控制、冷却机、导光及调焦、双目体视显微观察几部分构成&#xff0c;结构紧凑&#xff0c;体积小…

Android中对图片的操作,移动、缩放、涂鸦和保存到图库

一、实现方法 监听用户手势&#xff0c;提取用户操作 &#xff08;1&#xff09;移动&#xff1a; 分别计算X,Y轴的结束与初始之间移动偏移的量 &#xff08;2&#xff09;缩放&#xff1a;&#xff08;结束两指间距离伸缩比例&#xff09;/ 初始两指间距离&#xff0c;scaleX…