MyBatis從前世到今生一網打盡(全網最全,建議收藏)2??
三、入門Mybatis
3.1、開發環境的準備
3.1.1、導入 jar包
一般的我們要導入三個jar包。
Mybatis-3.4.1.jar mysql-connector-java-5.1.37-bin.jar log4j.jar
3.1.2、導入 log4j 的配置文件
3.1.3、創建測試表
-- 創建庫 CREATE DATABASE test_mybatis; -- 使用庫 USE test_mybatis; -- 創建表 CREATE TABLE user( id INT(11) PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50), pwd VARCHAR(50), );
3.1.4、創建 javaBean
package com.domain; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; /** * @author Xiao_Lin * @date 2021/1/5 11:33 */ @Data @AllArgsConstructor @NoArgsConstructor public class User { private Integer id; private String username; private String pwd; }
3.1.5、創建 MyBatis 的全局配置文件
3.1.6、編寫UserDao接口
public interface UserDao { /*查詢所有數據*/ List
3.1.7、創建 Mybatis 的 sql 映射文件
3.1.8、配日志
mybatis.xml文件加入日志配置,可以在控制臺輸出執行的 sql 語句和參數。
3.1.9、測試
public class test { /* * mybatis 入門 */ @Test public void testStart() throws IOException { //1.mybatis 主配置文件 String config = "mybatis-config.xml"; //2.讀取配置文件 InputStream in = Resources.getResourceAsStream(config); //3.創建 SqlSessionFactory 對象,目的是獲取 SqlSession SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in); //4.獲取 SqlSession,SqlSession 能執行 sql 語句 SqlSession session = factory.openSession(); //5.執行 SqlSession 的 selectList() List
3.2、CRUD操作
3.2.1、insert
接口中新增方法
int insertUser(User user);
xml中新增sql語句
新增測試方法
@Test public void testInsert() throws IOException { //1.mybatis 主配置文件 String config = "mybatis-config.xml"; //2.讀取配置文件 InputStream in = Resources.getResourceAsStream(config); //3.創建 SqlSessionFactory 對象 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in); //4.獲取 SqlSession SqlSession session = factory.openSession(); //5.創建保存數據的對象 User user = new User(); user.setId(1005); user.setUsername("張三"); user.setPwd("123456"); //6.執行插入 insert int rows = session.insert("com.dao.UserDao.insertUser",student); //7.提交事務 session.commit(); System.out.println("增加記錄的行數:"+rows); //8.關閉 SqlSession session.close(); }
3.2.2、update
UserDao 接口中增加方法
int updateUser(User user);
UserDao.xml 增加 sql 語句
新增測試方法
@Test public void testUpdate() throws IOException { //1.mybatis 主配置文件 String config = "mybatis-config.xml"; //2.讀取配置文件 InputStream in = Resources.getResourceAsStream(config); //3.創建 SqlSessionFactory 對象 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in); //4.獲取 SqlSession SqlSession session = factory.openSession(); //5.創建保存數據的對象 User user = new User(); user.setId(1005);//要修改的 id user.setUsername("李四"); //要修改的年齡值 //6.執行更新 update int rows = session.update("com.dao.UserDao.updateUser",user); //7.提交事務 session.commit(); System.out.println("修改記錄的行數:"+rows); //8.關閉 SqlSession session.close(); }
3.2.3、delete
UsertDao 接口中增加方法
int deleteUser(int id);
UserDao.xml 增加 sql 語句
增加測試方法
@Test public void testUpdate() throws IOException { //1.mybatis 主配置文件 String config = "mybatis-config.xml"; //2.讀取配置文件 InputStream in = Resources.getResourceAsStream(config); //3.創建 SqlSessionFactory 對象 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in); //4.獲取 SqlSession SqlSession session = factory.openSession(); //5.刪除的 id int id = 1001; //6.執行刪除 delete int rows = session.delete("com.dao.UserDao.deleteStudent",id); //7.提交事務 session.commit(); System.out.println("修改記錄的行數:"+rows); //8.關閉 SqlSession session.close(); }
3.2.2、完成兩個綁定
Mapper 接口與 Mapper 映射文件的綁定在 Mppper 映射文件中的
Mapper 映射文件中的增刪改查標簽的 id 必須指定成 Mapper 接口中的方法,必須相同否則無法通過代理實現綁定。
3.3、Mybatis對象分析
3.3.1、Resources類
Resources 類,顧名思義就是資源,用于讀取資源文件。其有很多方法通過加載并解析資源文件,返
回不同類型的 IO 流對象。
3.3.2、SqlSessionFactoryBuilder 類
SqlSessionFactory 的 創 建 , 需 要 使 用 SqlSessionFactoryBuilder 對 象 的 build() 方 法 。 由 于
SqlSessionFactoryBuilder 對象在創建完工廠對象后,就完成了其歷史使命,即可被銷毀。所以,一般會將
該 SqlSessionFactoryBuilder 對象創建為一個方法內的局部對象,方法結束,對象銷毀。
3.3.3、SqlSessionFactory類
SqlSessionFactory 接口對象是一個重量級對象(系統開銷大的對象),是線程安全的,所以一個應用
只需要一個該對象即可。創建 SqlSession 需要使用 SqlSessionFactory 接口的的 openSession()方法。他有幾個重載方法:
openSession(true):創建一個有自動提交功能的 SqlSession
openSession(false):創建一個非自動提交功能的 SqlSession,需手動提交
openSession():同 openSession(false)
3.3.4、SqlSession 接口
SqlSession 接口對象用于執行持久化操作。一個 SqlSession 對應著一次數據庫會話,一次會話以
SqlSession 對象的創建開始,以 SqlSession 對象的關閉結束。
SqlSession 接口對象是線程不安全的,所以每次數據庫會話結束前,需要馬上調用其 close()方法,將
其關閉。再次需要會話,再次創建。 SqlSession 在方法內部創建,使用完畢后關閉。
3.4、抽取工具類
public class MyBatisUtil { //定義 SqlSessionFactory private static SqlSessionFactory factory = null; static { //使用 靜態塊 創建一次 SqlSessionFactory try{ String config = "mybatis-config.xml"; //讀取配置文件 InputStream in = Resources.getResourceAsStream(config); //創建 SqlSessionFactory 對象 factory = new SqlSessionFactoryBuilder().build(in); }catch (Exception e){ factory = null; e.printStackTrace(); } } /* 獲取 SqlSession 對象 */ public static SqlSession getSqlSession(){ SqlSession session = null; if( factory != null){ session = factory.openSession(); } return session; } }
四、MyBatis 全局配置文件
4.1、MyBatis 全局配置文件簡介
The MyBatis configuration contains settings and properties that have a dramatic effecton how MyBatis behaves.
MyBatis 的配置文件包含了影響 MyBatis 行為甚深的設置(settings )和屬性(properties)信息。
4.2、文件結構
configuration 配置 properties 屬性 settings 設置 typeAliases 類型命名 typeHandlers 類型處理器 objectFactory 對象工廠 plugins 插件 environments 環境 environment 環境變量 transactionManager 事務管理器 dataSource 數據源 databaseIdProvider 數據庫廠商標識 mappers 映射器
4.2.1、properties 屬性
properties屬性是配置數據源相關屬性,可外部配置且可動態替換的,既可以在典型的 Java 屬性文件中配置,亦可通過 properties 元素的子元素來配置
然而 properties 的作用并不單單是這樣,你可以創建一個資源文件,名為db.properties 的文件,將四個連接字符串的數據在資源文件中通過鍵值對(key=value)的方式放置,不要任何符號,一條占一行
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/javaweb jdbc.username=root jdbc.password=123456
引入方式是這樣
在 environment 元素的 dataSource 元素中為其動態設置
4.2.2、settings 屬性
這是 MyBatis 中極為重要的調整設置,它們會改變 MyBatis 的運行時行為。一般設置數據庫的懶加載和緩存之類是否開啟
4.2.3、typeAliases 別名
類型別名是為 Java 類型設置一個短的名字,可以方便我們引用某個類,引用的時候不需要再寫全路徑名字
更簡單的寫法:類很多的情況下,可以批量設置別名這個包下的每一個類創建一個默認的別名,就是簡
單類名小寫
MyBatis 默認已經取好的別名,不需要我們人為去配置
4.2.4、typeHandlers 類型處理器
無論是 MyBatis 在預處理語句(PreparedStatement)中設置一個參數時,還是從結果集中取出一個值時, 都會用類型處理器將獲取的值以合適的方式轉換成 Java 類型,MyBatis 中默認提供的類型處理器
注意
日期和時間的處理,JDK1.8 以前一直是個頭疼的問題。我們通常使用 JSR310 規范領導者 Stephen Colebourne 創建的 Joda-Time 來操作。1.8 已經實現全部的 JSR310 規范了
日期時間處理上,我們可以使用 MyBatis 基于 JSR310(Date and Time API)編寫的各種日期時間類型處理器。
MyBatis3.4 以前的版本需要我們手動注冊這些處理器,以后的版本都是自動注冊的,如需注冊,需要下載 mybatistypehandlers-jsr310,并通過如下方式注冊
4.2.5、plugins 插件機制
插件是 MyBatis 提供的一個非常強大的機制,我們可以通過插件來修改 MyBatis 的一些核心行為。插件通過動態代理機制,可以介入四大對象的任何一個方法的執行,四大對象如下:
Executor (update, query, flushStatements, commit, rollback, getTransaction, close,
isClosed)
ParameterHandler (getParameterObject, setParameters)
ResultSetHandler (handleResultSets, handleOutputParameters)
StatementHandler (prepare, parameterize, batch, update, query)
4.2.6、 environments 環境配置
MyBatis 可以配置多種環境,比如開發、測試和生產環境需要有不同的配置, 每種環境使用一個 environment 標簽進行配置并指定唯一標識符,可以通過environments 標簽中的default 屬性指定一個環境的標識符來快速的切換環境
environment:指定具體環境
id:指定當前環境的唯一標識
transactionManager、dataSource 都必須有
他有三種可選的類型:JDBC ,MANAGED ,自定義
JDBC:使用了 JDBC 的提交和回滾設置,依賴于從數據源得到的連接來管理事務范圍,JdbcTransactionFactory。
MANAGED:不提交或回滾一個連接、讓容器來管理事務的整個生命周期,比如JEE應用服務器上下文,ManagedTransactionFactory。
自定義:實現 TransactionFactory 接口,type=全類名/別名。
他有四種可選的類型: UNPOOLED , POOLED . JNDI , 自定義
UNPOOLED:不使用連接池, UnpooledDataSourceFactory。
POOLED:使用連接池, PooledDataSourceFactory。
JNDI: 在 EJB 或應用服務器這類容器中查找指定的數據源。
際開發中我們使用 Spring 管理數據源,并進行事務控制的配置來覆蓋上述配置
4.2.7、databaseIdProvider 數據庫廠商標識
MyBatis 可以根據不同的數據庫廠商執行不同的語句
Type: DB_VENDOR
使用 MyBatis 提供的 VendorDatabaseIdProvider 解析數據庫廠商標識。也可以實現 DatabaseIdProvider 接口來自定義.會通過 DatabaseMetaData#getDatabaseProductName() 返回的字符串進行設置。由于通常情況下這個字符串都非常長而且相同產品的不同版本會返回不同的值,所以最好通過設置屬性別名來使其變短.
Property-name:數據庫廠商標識
Property-value:為標識起一個別名,方便 SQL 語句使用 databaseId 屬性引用
配置了 databaseIdProvider 后,在 SQL 映射文件中的增刪改查標簽中使用 databaseId來指定數據庫標識的別名
MyBatis 匹配規則如下:
如果沒有配置 databaseIdProvider 標簽,那么 databaseId=null
如果配置了 databaseIdProvider 標簽,使用標簽配置的 name 去匹配數據庫信息,匹配上設置 databaseId=配置指定的值,否則依舊為 null
如果 databaseId 不為 null,他只會找到配置 databaseId 的 sql 語句
MyBatis 會加載不帶 databaseId 屬性和帶有匹配當前數據庫 databaseId 屬性的
所有語句。如果同時找到帶有 databaseId 和不帶 databaseId 的相同語句,則后者
會被舍棄。
4.2.8、mappers 映射器
用來在 mybatis 初始化的時候,告訴 mybatis 需要引入哪些 Mapper 映射文件
resource : 引入類路徑下的文件
url : 引入網絡路徑或者是磁盤路徑下的文件
class : 引入 Mapper 接口.
有 SQL 映射文件 , 要求 Mapper 接口與 SQL 映射文件同名同位置
沒有 SQL 映射文件 , 使用注解在接口的方法上寫 SQL 語句.
這種方式要求 SQL 映射文件名必須和接口名相同并且在同一目錄下
MyBatis 數據庫
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。