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.pswp.cn/news/214357.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/214357.shtml
英文地址,請注明出處:http://en.pswp.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);<…