Mybatis进阶知识

Mybatis的事务管理机制

在mybatis-config.xml文件中.可以进行mybatis的事务管理

<transactionManager type="JDBC"/>

type的值有两个

  • JDBC
  • MANAGED
JDBC事务管理器

mybatis框架自己管理事务,自己采用原生的JDBC代码去管理事务

底层创建的事务管理器对象是JdbcTransaction对象

conn.setAutoCommit(false);开启事务

进行业务处理

conn.commit():手动提交事务

SqlSession sqlSession = sqlSessionFactory.openSession();//如果使用事务管理器是JDBC的话,实际上会执行:conn.setAutoCommit(false)
sqlSession.commit();//如果使用的事务管理器是JDBC的话,实际上会执行:conn.commit()

不建议传入参数true

SqlSession sqlSession = sqlSessionFactory.openSession(true);
如果传入了参数true,那么底层就不会执行conn.setAutoCommit(false),那么autoCommit就是true
如果autoCommit是true,就表示没有开启事务,只要执行一条sql语句就提交一次
MANAGED事务管理器

mybatis不再负责事务的管理,事务管理交给其他容器来负责

当以后ssm框架进行集成的时候可以用MANAGED

但只有mybatis的框架时,如果配置managed那么这块事务是没人管的,表示事务没开启


Junit单元测试

先引入单元测试的依赖

然后在test包下创建类,起名规范就是要测试的类加Test

测试方法要加注解@Test,说明这个方法是测试方法

单元测试中有两个重要的概念

  • 实际值:被测试的业务方法的真正的执行结果
  • 期望值:执行了这个业务之后,你期望的执行结果是多少

最后加断言进行测试

Assert.assertEquals(expected,actual)
Mybatis的日志信息

Mybatis配置日志信息需要在核心配置文件中进行配置

Mybatis已经对STDOUT_LOGGING进行了实现,只需要开启即可

但STDOUT_LOGGING的日志信息不够丰富,如果想用丰富的要引入第三方组件

<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
集成logback日志框架
  1. 引入logback的依赖
  2. 引入logback所必须的xml配置文件
  • 这个配置文件的名字必须叫做logback.xml或者logback-text.xml,不能是其他的
  1. 这个配置文件必须放到根路径下,不能是其他位置
<?xml version="1.0" encoding="UTF-8" ?><configuration debug="false"><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern></encoder></appender><logger name="com.apache.ibaits" level="TRACE"></logger><logger name="java.sql.Connection" level="DEBUG"></logger><logger name="java.sql.Statement" level="DEBUG"></logger><logger name="java.sql.PreparedStatement" level="DEBUG"></logger><root level="DEBUG"><append-ref ref="STDOUT"></append-ref><append-ref ref="FILE"></append-ref></root></configuration>

如果使用的是标准的日志需要配置settings,如果使用的第三方组件就不用配置了

Mybatis封装工具类
//一个sqlSessionFactory对应一个environment,一般一个environment对应一个数据库
//所以调用openSession的时候不用每次都创建sqlSessionFactory对象
//写在类加载器中即可public class MybatisUtil {private static SqlSessionFactory sqlSessionFactory;static {try {sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));} catch (IOException e) {throw new RuntimeException(e);}}private MybatisUtil() {}public static SqlSession openSession() {return sqlSessionFactory.openSession();}
}
Mybatis的CRUD
  • C:Create(增)
  • R:Retrieve(查)
  • U:update(改)
  • D:delete(删)

在mybatis当中的占位符是#{}

Map集合传值

#{}传入的值是map的键

Map<String,Object> map = new HashMap<>();map.put("k1","1111");map.put("k2","比亚迪汉");map.put("k3",10.0);map.put("k4","2020-12-11");map.put("k5","电车");//第一个参数是sql语句的id//第二个参数是封装数据的对象sqlSession.insert("insertCar",map);insert into t_car(id,car_num,brand,guide_price,produce_time,car_type) values (null,#{k1},#{k2},#{k3},#{k4},#{k5})
POJO类传值

#{}传入的值是POJO类的属性值

SqlSession sqlSession = SqlSessionUtils.openSession();Car car = new Car(null, "1112", "凯的拉克CT6", 55.0, "2023-12-10", "电车");sqlSession.insert("insertCar",car);sqlSession.commit();sqlSession.close();insert into t_car(id,car_num,brand,guide_price,produce_time,car_type) values (null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})

严格意义上来说:如果使用POJO类传值的话,#{}中实际上是mybatis调用get方法去掉get再把剩下的单词首字母小写

#{name}->#{getName}
mybatis的删除
<delete id="deleteCar">delete from t_car where id=#{id}</delete>sqlSession.delete("deleteCar",15);
Mybatis的更新
public void testUpdateCarById(){SqlSession sqlSession = SqlSessionUtils.openSession();Car car = new Car(5L,"9999","凯美瑞",30.0,"2023-12-10","燃油车");sqlSession.update("updateCar",car);sqlSession.commit();sqlSession.close();}<update id="updateCar">update t_car setcar_num=#{carNum},brand=#{brand},guide_price=#{guidePrice},produce_time=#{produceTime},car_type=#{carType}whereid=#{id}</update> 
Mybatis的查询

mybatis中查询的时候mybatis底层执行了select语句之后,就一定会返回一个结果集ResultSet

需要在select标签中指定resultType来确定ResultSet封装成什么类型的Java对象

 @Testpublic void testSelectCarById(){SqlSession sqlSession = SqlSessionUtils.openSession();Object o = sqlSession.selectOne("selectCar", 1);System.out.println(o);sqlSession.close();}
}<select id="selectCar" resultType="POJO.Car">select *from t_carwhere id=#{id}</select>

查询时如果结果中的列名和封装对象中的属性名不对应那么就赋不上值

<select id="selectCar" resultType="POJO.Car">
select id,brand,car_num as carNum,guide_price as guidePrice,produce_time as produceTime,car_type as carType
from t_car
where id=#{id}
</select>
Mybatis查询所有
//resultType是封装的结果集类型,不是指定List的类型,是指定List集合中的元素类型
<select id="selectAll" resultType="POJO.Car">
select
id,car_num as carNum, brand ,guide_price as guidePrice, produce_time as produceTime,car_type as carType
from t_car
</select>@Testpublic void testSelectAll(){SqlSession sqlSession = SqlSessionUtils.openSession();List<Object> Cars = sqlSession.selectList("selectAll");Cars.forEach(car-> System.out.println(car));sqlSession.close();}
Mybatis中的namespace

在sqlMapper.xml文件当中,有namespace这个属性是用来指定命名空间的,用来防止id重复

本质上mybatis的sql语句的写法是namespace.id为了防止id重复

Mybatis的核心配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//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.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatistest"/><property name="username" value="root"/><property name="password" value="abc123"/></dataSource></environment></environments><mappers><mapper resource="CarMapping.xml"/></mappers>
</configuration>

environments是指mybatis的环境,mybatis中可以有多个环境,一个环境对应一个数据库

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

default指的是默认使用的环境,指定environment的id

当创建SqlSessionFactory的时候没有指定使用哪个环境就是用默认的环境

Mybatis的事务管理器

transactionManager是事务管理器,指定mybatis具体用什么方式去管理事务

  • 第一个:JDBC:使用原生的jdbc代码来管理事务
  • 第二个:MANAGED:mybatis不再负责事务管理,将事务管理交给其他的容器来管理

在Mybatis中提供了事务管理器接口:Transaction

接口下有两个实现类:JdbcTransaction,ManagedTransaction

如果type="JdbcTransaction" 那么底层会实例化JdbcTransaction对象

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

Mybatis的数据源

dataSource被称为数据源

dataSource为程序提供Connection对象,但凡是给程序员提供Connection对象的都叫数据源

数据源实际上是一套规范,JDK中有这套规范,javax.sql.DataSource(这个数据源的规范,这套接口实际上是JDK规范的)

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

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

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

type的属性值有三个:

  • UNPOOLED:不使用数据库连接池技术,每一次请求过来之后,都是创建新的Connection对象
  • POOLED:使用mybatis自己实现的数据库连接池
  • JNDI:集成其他第三方的数据库连接池

JNDI是一套规范,大部分web容器都实现了JNDI规范

Mybatis的properties标签

java.util.Properties类,是一个Map集合,key和value都是String类

properties是为了让核心文件的配置更灵活

<propety name="属性名" value="属性值" />
<properties resource="配置文件名" />

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

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

相关文章

汇总区间算法(leetcode第228题)

题目描述&#xff1a; 给定一个 无重复元素 的 有序 整数数组 nums 。返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说&#xff0c;nums 的每个元素都恰好被某个区间范围所覆盖&#xff0c;并且不存在属于某个范围但不属于 nums 的数字 x 。列表中的每个区…

财务机器人(RPA)会影响会计人员从业吗?

财务机器人会对会计从业人员有影响。 不过是正面积极的影响。 它是财务人员工作的好助手好帮手。 具体展开聊聊财务RPA机器人是如何成为财务人员的好帮手。 财务机器人是在人工智能和自动化技术的基础上建立的、以软件机器人作为虚拟劳动力、依据预先设定的程序与现有用户系…

活用异常处理(try-except)

介绍 简要介绍Python的异常处理&#xff08;try-except&#xff09;。 基本语法 Try-except是Python中异常处理的基础。 作为例子&#xff0c;我们将解释执行除零时发生 ZeroDivisionError 的情况。 当除以零时&#xff0c;会出现以下错误。 print(1 / 0) # ZeroDivisionE…

蓝牙配对、连接和删除汇总

目的&#xff1a;处理PC连接蓝牙设备的配对、连接和删除操作&#xff0c;以及常见故障。 命令行配对蓝牙设备并连接 要求&#xff1a;配对BLUET043蓝牙&#xff0c;密码为4444&#xff0c;然后连接该蓝牙。操作步骤如下&#xff1a; Step1.下载 修复工具&#xff0c;然后安装…

利用python编写简易POC脚本

POC&#xff1a;概念证明&#xff0c;即概念验证&#xff08;英语&#xff1a;Proof of concept&#xff0c;简称POC&#xff09;是对某些想法的一个较短而不完整的实现&#xff0c;以证明其可行性&#xff0c;示范其原理&#xff0c;其目的是为了验证一些概念或理论。 声明&a…

三哥的黑科技,印度发布无线加热服装专利,冬季神器要来了

众所周知风和自由在冬天是不存在的&#xff0c;冬天只剩下冰冷的像刀子一样的风刮在你的脸上&#xff0c;哪怕穿的很厚&#xff0c;戴上全盔&#xff0c;也无法阻挡冰冷的风带走你身体温度&#xff0c;如果穿的特别多&#xff0c;骑车时候的舒适感和穿脱衣物的繁琐也是一大头疼…

【MySQL系列】Centos安装MySQL

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

vim常用键位总结

1、移动光标 按键作用h或←光标向左移动一个字符j或↓光标向下移动一个字符k或↑光标向上移动一个字符l或→光标向右移动一个字符Ctrl f或Page Down屏幕向下移动一页&#xff08;常用&#xff09;Ctrl b或Page Up屏幕向上移动一页&#xff08;常用&#xff09;Ctrl d屏幕向…

Kafka使用总结

1、Kafka是何如做到高性能的&#xff1f; a、消息批处理减少网络通信开销&#xff0c;提升系统吞吐能力&#xff08;先攒一波&#xff0c;消息以“批”为单位进行处理&#xff09; 生产端&#xff1a;无论是同步发送还是异步发送&#xff0c;Kafka都不会立即就把这条消息发送出…

【C++】算法库(复制操作、交换操作、变换操作)

C算法库 文章目录 C算法库复制操作copy , copy_ifcopy_ncopy_backward 交换操作swapswap_rangesiter_swap 变换操作transformreplacereplace_copy replace_copy_if 算法库提供大量用途的函数&#xff08;例如查找、排序、计数、操作&#xff09;&#xff0c;它们在元素范围上操…

java--StringBuilder、StringBuffer、StringJoiner

1.StringBuilder ①StringBuilder代表可变字符串对象&#xff0c;相当于是一个容器&#xff0c;它里面装的字符串是可以改变的&#xff0c;就是用来操作字符串的。 ②好处&#xff1a;StringBuilder比String更适合做字符串的修改操作&#xff0c;效率会比更高&#xff0c;代码…

Java入门:EditPlus的安装与配置讲解

1. 前言 Java是一种面向对象的编程语言&#xff0c;广泛应用于各种平台和设备。在Java开发过程中&#xff0c;一个好的集成开发环境&#xff08;IDE&#xff09;是非常重要的。EditPlus是一款简单易用的文本编辑器&#xff0c;它提供了一些方便的功能来支持Java开发。本文将介…

【开源】基于JAVA的木马文件检测系统

项目编号&#xff1a; S 041 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S041&#xff0c;文末获取源码。} 项目编号&#xff1a;S041&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 木马分类模块2.3 木…

Leo赠书活动-13期 【以企业架构为中心的SABOE数字化转型五环法】文末送书

Leo赠书活动-13期 【以企业架构为中心的SABOE数字化转型五环法】文末送书 ✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客…

记录 | xshell输出错乱解决

输出错乱问题&#xff1a; 解决方法&#xff1a;

VS Code使用 CMake 或 Makefile管理C++多文件编译

VS Code使用 CMake 或 Makefile管理C多文件编译 一、Cmake方式1、文件结构2、构建项目 二、Makefile方式1、文件结构2、Makefile3、构建项目 三、附件示例中使用到的文件及代码 使用 CMake 或 Makefile 是更加标准和灵活的方法来管理多文件编译。以下是一个简单的示例&#xff…

80个常用shell命令及简单用法

Shell命令是Linux和Unix系统中的基础&#xff0c;用于完成各种操作&#xff0c;如文件管理、程序执行、文本处理等。下面列举一些常用的Shell命令&#xff0c;并详细解释它们的功能及应用场景&#xff1a; ls - 列出目录内容 功能&#xff1a;列出指定目录中的文件和目录。应用…

智能优化算法应用:基于郊狼算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于郊狼算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于郊狼算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.郊狼算法4.实验参数设定5.算法结果6.参考文献7.MA…

Mybatis增删改查基础

MyBatis可根据查询的结果类型、查询条件的不同进行统一处理。 1 查询数据 1.1 根据查询数据条数来分析不同的情况 1.1.1 查询单条数据 可以通过实体类、list集合、map等处理查询结果。 通过实体类查询单条数据 User queryUserById(Param("id") Integer id);<…