【MyBatis】核心配置文件,三大对象的作用域,#{}和${}的区别

news2025/1/19 14:21:40

1. environment环境:

  • 一般一个环境environment会对应一个SqlSessionFactory对象

  • sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"),"另一个环境的id");

// 数据库环境配置在这个标签里
// 这里的default表示默认使用的环境
<environments default="">
    // 一般一个环境environment会对应一个SqlSessionFactory对象
    <environment id="">

    </environment>
    
    // 这是mybatis的另一个环境, 连接的数据库是另外一个数据库
    <environment id="">

    </environment>
</environments>

// @test
public static void main(String[] args) {
    SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();

    // 获取默认的环境
    SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));
    SqlSession sqlSession = sqlSessionFactory.openSession();
    
    // 通过环境id来使用指定的环境
    SqlSessionFactory sqlSessionFactory1 = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"),"另一个环境的id");
    SqlSession sqlSession1 = sqlSessionFactory1.openSession();
}

2. 事务管理器:

  • 核心配置文件的transactionManager标签中的type只能选 JDBC / MANAGED (不区分大小写)

  • 作用是配置事务管理器, 指定mybatis具体使用什么方式去管理事务.

  • JDBC: 使用原生的jdbc代码来管理事务.如下:

conn.setAuotCommit(false);
...业务处理...
conn.commit();
  • MANAGED: mybatis不再负责事务的管理, 将事务交给其他的容器来管理.

Transaction接口, 有俩个实现类(JdbcTransaction/ManagedTransaction)

如果type="jdbc", 那么底层会实例化JDBCTransaction对象
如果type="managed", 那么底层会实例化ManagedTransaction对象

3. 对数据源的分析:

  • 核心配置文件中的dataSource标签中的dataSource被称为数据源

  • dataSource作用是什么, 为程序提供Connection对象

  • 但凡是给程序提供connection对象的都叫做数据源

  • 数据源实际上是一套规范, JDK中有这套规范: javax.sql.DataSource.

  • 我们自己也可以编写数据源组件, 只要实现javax.sql.DataSource接口就行了, 实现接口中的所有方法

  • 数据库连接池是提供连接对象的, 所以数据库连接池就是一个数据源

  • 常见的数据源组件有哪些(常见的数据库连接池有哪些): 阿里巴巴的德鲁伊连接池, c3p0...

  • type属性可以用来指定数据源的类型, 就是指定具体使用什么方式来获取Connection对象

  • type属性有三个值: unpooled, pooled, jndi

  • unpooled: 不使用数据库连接池技术, 每一次请求过来之后, 都是创建新的Connection对象.

  • pooled: 使用mybatis自己实现的数据库连接池

  • jndi: 集成其他第三方的数据库连接池

  • 不同的配置, 所需要的属性都不一样.参考下图:

4. properties标签的配置和使用:

4.1 方式一:

  • 在核心配置文件中配置properties

  • Properties类是一个Map集合, key和value都是String类型的

  • 注意使用${}

// Properties类是一个Map集合, key和value都是String类型的
<properties>
     <property name="jdbc.driver" value="..."/>
     <property name="jdbc.url" value="..."/>
     <property name="jdbc.username" value="..."/>
     <property name="jdbc.password" value="..."/>
</properties>


<environment id="development">
    <transactionManager type="JDBC"/>
    <dataSource type="POOLED">
        <property name="driver" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </dataSource>
</environment>

4.2 方式二:

  • 写一个properties为后缀的文件

  • 这种方式更好

// jdbc.properties文件
jdbc.driver=...
jdbc.url=...
jdbc.username=...
jdbc.password=...


// mybatis-config.xml
<properties resource=""jdbc.properties"/>


<environment id="development">
    <transactionManager type="JDBC"/>
    <dataSource type="POOLED">
        <property name="driver" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </dataSource>
</environment>

5. 三大对象的作用域:

5.1 SqlSessionFactoryBuilder:

  • 这个类可以被实例化, 一旦创建了SqlSessionFactory就不再需要它了

  • 所以SqlSessionFactoryBuilder的作用就是创建SqlSessionFactory

5.2 SqlSessionFactory:

  • SqlSessionFactory一旦创建就应该在应用运行期间一直存在

  • 不要重复创建SqlSessionFactory对象, 建议放在静态代码块中

  • 一个数据库对应一个SqlSessionFactory对象

  • Mybatis的核心配置文件, 没有必要重复解析, 只需要在服务器启动的时候解析一次就行

5.3 SqlSession:

  • 一个线程对应一个SqlSession对象, 因为一个线程对应一个事务

  • SqlSession的实例不是线程安全的

6. #{}和${}的区别:

  • #{}占位符

1. 先进行sql语句的编译, 再给占位符传值

2. 底层是PreparedStatement实现

3. 可以防止sql注入, 不知道用户输入的信息是啥, 所以优先使用#{}.
  • ${}占位符

1. 先进行sql语句拼接, 然后再编译sql语句

2. 底层是Statement实现 

3. 存在sql注入现象, 只有在需要进行sql语句关键字拼接的情况下才会用到

4. 如果传入的是关键字(asc/desc), 那就需要使用${}才行, 因为#{}是以值的形式放到sql语句中

5. 拼接表名的时候需要使用${}

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

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

相关文章

Spring Security 源码解读 :基本架构及初始化

Spring Security 是基于web的安全组件&#xff0c;所以一些相关类会分散在 spring-security包和web包中。Spring Security通过自定义Servlet的Filter的方式实现&#xff0c;具体架构可参考官网Spring Security: Architecture 这里使用Spring Boot 2.7.4版本&#xff0c;对应Sp…

安某客滑块分析

本文仅供学习&#xff0c;不参与商业应用 目标连接&#xff1a; aHR0cHM6Ly93d3cuYW5qdWtlLmNvbS9jYXB0Y2hhLXZlcmlmeS8/Y2FsbGJhY2s9c2hpZWxkJmZyb209YW50aXNwYW0 接口分析 刷新链接可以看到getInfoTp的接口&#xff0c;请求参数sessionId及dInfo是加密参数 返回的参数包含…

Cesium 生成terrain地形数据

Cesium 生成terrain地形数据 处理地形数据 由于CTB工具不支持DEM为NoData值和float的数据,所以需要对数据进行处理。 多个tif必须县合并镶嵌成一张tifpixeltype从float转为intNoData值处理为0我使用的是ArcGis10.5,打开ArcMap: 打开 ArcToolbox->Data Management Tools…

C语言基础知识(55)

C语言程序在不使用数组的情况下找到“N”个数字中的最大数字参考以下代码实现&#xff1a;#include<stdio.h>intmain(){int count 0;int numb1 0;int numb2 0;int i 0;printf("Enter count of numbers ");scanf("%d",&count);if(count <0){p…

HTTP绕WAF之浅尝辄止

0X00前言 最近参加重保&#xff0c;和同事闲聊时间&#xff0c;谈起来了外网&#xff0c;彼时信心满满&#xff0c;好歹我也是学了几年&#xff0c;会不少的。结果&#xff0c;扭头看完do9gy师傅的《腾讯 WAF 挑战赛回忆录》&#xff0c;就啪啪打脸了。说来惭愧&#xff0c;最…

【数据结构(5)】2.3 线性表的类型定义

文章目录1. 线性表的抽象数据类型定义2. 线性表的基本操作1. 线性表的抽象数据类型定义 数据对象&#xff1a;就是一些元素&#xff0c;元素的个数大于等于 0。数据关系&#xff1a;ai-1 是 ai 的前驱&#xff0c;同时 ai 是 ai-1 的后继&#xff0c;他们都属于集合 D 2. 线性…

1月的碎碎念,但是很有必要

从今年开始每个月会整理一个我生活的琐碎但觉得有必要的事&#xff0c;一来方便年底回顾&#xff0c;二来也希望这些事情对大家有也有些参考。 不高大上&#xff0c;但是希望某一天再看到的时候会觉得充满趣味。1.新的1年的1月开始了&#xff0c;想了很多计划&#xff0c;搬新办…

rocketmq源码-consumerQueue和indexFile文件写入

前言 在rocketmq的文件中&#xff0c;除了commitLog文件&#xff0c;还有两个重要的文件&#xff0c;分别是indexFile文件和consumerQueue文件&#xff0c;这篇笔记主要记录这两个文件的数据是怎么写进去的 consumeQueue文件中对应topic下的一个queue&#xff0c;在consumeQue…

ubuntu22.04安装kalibr

前言 首先ros1目前目前在ubuntu支持的最高版本是20.04。当时我是在ubuntu22.04上编译安装的ros1。过程也十分坎坷&#xff0c;手动下载了很多包&#xff0c;具体就不累赘了。 再者目前网上的资料也都是kalibrros1, 所以推荐安装ros1之后再来安装kalibr。其次这次安装主要 参考…

关于splitChunks的一次原理探索

前言 前端时间在做项目加载优化时用到了splitChunks自动拆包&#xff0c;后了解了一下原理写下了此文。 Modules和Chunks Modules简单来理解就是我们写的功能模块&#xff0c;不管是CommonJS还是ESM都算是一个Module&#xff0c;而Chunks则是webpack根据我们的规则/默认规则…

spring security 前后端分离 进行用户验证 权限登陆的实现代码(看不懂??直接cv)

目录 前言&#xff1a; 一.所需依赖 二.application.properties 三.工具类 3.1ApplicationContextUtils 3.2JwtUtils 3.3ResponseResult 3.4ResponseStatus 3.5RsaUtils 四.UserDetailServiceImpl 五.成功处理器 六.SecurityConfig 七. filter 前言&#xff1a; 前后…

多个路由器的局域网终端设备的资源访问

多个路由器之间资源的访问 本质是将路由设备放置到一个网段 中继路由 中继的路由可以看作是另一个路由中的一个终端设备&#xff0c;只是为了延长传递wifi&#xff0c;在使用ipcofig中的网关和主路由的网关一样&#xff0c;一般都是主路由的IP。 无线桥接的中继路由 无论是…

车-电-路网时空分布负荷预测研究(Matlab代码)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

使用c语言连接mysql数据库并且批量插入数据

​ 使用从c连接数据库需要在本机安装数据库&#xff0c;或者拿到数据库所在主机的IP地址。先说明我使用的是mysql8.0 64位的数据库&#xff0c;使用的vs是vs2019。 1.配置环境 首先打开vs2019&#xff0c;创建一个空项目&#xff0c;让后右击下图所示位置&#xff0c;然…

网络编程套接字之UDP

文章目录一、网络编程二、UDP数据报套接字编程DatagramSocketDatagramPacket实现客户端服务器程序EchoServer客户端一、网络编程 我们网络编程的核心: Socket API&#xff0c;操作系统为我们应用程序提供的API&#xff0c;我们的Socket是和传输层密切相关的。 我们传输层为我…

SpringBoot+Vue+Wx健康上报系统

简介&#xff1a;本项目采用了基本的springbootvueWx设计健康上报系统。详情请看截图。经测试&#xff0c;本项目正常运行。本项目适用于Java毕业设计、课程设计学习参考等用途。 项目描述 项目名称SpringBootVueWx健康上报系统源码作者LHL项目类型Java EE项目 &#xff08;前…

多线程初阶——线程状态

多线程初阶——线程状态 文章目录多线程初阶——线程状态1.Thread类及常见构造方法2.Thread常见的方法3.线程相关的重要操作3.1启动线程—start()3.2中断线程3.3 等待线程— join()3.4 获取线程引用3.5休眠线程—sleep()4.线程的状态1.Thread类及常见构造方法 方法说明Thread(…

前端js实现根据文件url批量压缩下载成zip包

前言 项目开发中&#xff0c;产品经理提了这样一个需求&#xff1a;将系统中的附件实现批量打包下载功能。本来系统中是有单个下载及批量下载功能&#xff0c;现在应业务方的需求&#xff0c;需要多加个批量打包下载。 初步设想是&#xff1a;由后端编写接口实现。但后来经过思…

从事测试开发8年,聊聊我是怎么从0基础到年薪40万的

本人从事测试开发8年多&#xff0c;之前在猪场工作&#xff0c;年薪突破40W&#xff0c;算是一个生活过得去的码农。&#xff08;仅代表本人&#xff09;目前从事软件测试行业的薪资待遇还是很不错的&#xff0c;所以如果朋友们真的对软件测试感兴趣的话可以坚持学下去&#xf…

Java native agent学习笔记-从加载到log4j漏洞检测

记录一下java native agent的学习过程,也顺便造一个检测log4j漏洞的轮子: java native agent相比java agent最大的好处是快,C写的,快的一笔,但是最大的坏处是非常麻烦,毕竟你拿个面过程的语言怼面对象的肯定是比较麻烦的。 本次学习的目的是做个加载器,动态加载agent,然后再实…