基于MyBatis的數(shù)據(jù)持久化框架的使用詳解
一、MyBatis是什么
1.1、概述
Mybatis是一個優(yōu)秀的開源、輕量級持久層框架,它對JDBC操作數(shù)據(jù)庫的過程進行封裝,簡化了加載驅(qū)動、創(chuàng)建連接、創(chuàng)建 statement 等繁雜的過程,使開發(fā)者只需要關注sql本身。
我們原來使用JDBC操作數(shù)據(jù)庫,需要手動的寫代碼去注冊驅(qū)動、獲取connection、獲取statement等等,現(xiàn)在Mybaits幫助我們把這些事情做了,我們只需要關注我們的業(yè)務sql即可,這樣可以提高我們的開發(fā)效率。
MyBatis屬于半自動的ORM框架
MyBatis 支持定制化 SQL、存儲過程以及高級映射,可以在實體類和 SQL 語句之間建立mapping映射關系,是一種半自動化的 ORM 實現(xiàn)。其封裝性低于 Hibernate,但性能優(yōu)秀、小巧、簡單易學、應用廣泛。
1.2、什么是持久化
數(shù)據(jù)持久化是將內(nèi)存中的數(shù)據(jù)模型轉(zhuǎn)換為存儲模型,以及將存儲模型轉(zhuǎn)換為內(nèi)存中數(shù)據(jù)模型的統(tǒng)稱。例如,文件的存儲、數(shù)據(jù)的讀取以及對數(shù)據(jù)表的增刪改查等都是數(shù)據(jù)持久化操作。
1.3、什么是ORM
ORM(Object Relational Mapping,對象關系映射)是一種數(shù)據(jù)持久化技術,它在對象模型和關系型數(shù)據(jù)庫之間建立起對應關系,并且提供了一種機制,通過 JavaBean 對象去操作數(shù)據(jù)庫表中的數(shù)據(jù)。
1.4、MyBatis主要內(nèi)容
MyBatis 前身為 iBatis,2002 年由 Clinton Begin 發(fā)布。2010 年從 Apache 遷移到 Google,并改名為 MyBatis,2013 年又遷移到了 Github。
MyBatis 的主要思想是將程序中的大量 SQL 語句剝離出來,使用 XML 文件或注解的方式實現(xiàn) SQL 的靈活配置,將 SQL 語句與程序代碼分離,在不修改程序代碼的情況下,直接在配置文件中修改 SQL 語句。MyBatis與其它持久性框架最大的不同是,MyBatis 強調(diào)使用 SQL,而其它框架(例如 Hibernate)通常使用自定義查詢語言,即 HQL(Hibernate查詢語言)或EJB QL(Enterprise JavaBeans查詢語言)。
1.5、優(yōu)點
MyBatis是免費且開源的。
與 JDBC 相比,減少了 50% 以上的代碼量。
MyBatis是最簡單的持久化框架,體積小巧并且學習門檻低。
MyBatis相當靈活,不會對應用程序或者數(shù)據(jù)庫的現(xiàn)有設計強加任何影響,SQL 寫在 XML 中,和程序邏輯代碼分離,降低耦合度,便于同一管理和優(yōu)化,提高了代碼的可重用性。
提供 XML 標簽,支持編寫動態(tài) SQL語句。
提供映射標簽,支持實體對象與數(shù)據(jù)庫的表字段關系映射。
1.6、缺點
編寫 SQL語句工作量較大,對開發(fā)人員編寫 SQL 語句的功底有一定要求。
SQL語句依賴于數(shù)據(jù)庫,導致數(shù)據(jù)庫移植性差,不能隨意更換數(shù)據(jù)庫。
二、MyBatis架構
2.1、mybatis所依賴的jar包
lib 文件夾下的 jar 文件是 MyBatis的依賴包(mybatis-3.5.10.jar是MyBatis的核心包)
將需要的核心包全部添加進項目構建路徑中
2.2、MyBatis準備工作
①創(chuàng)建數(shù)據(jù)庫表結(jié)構
②創(chuàng)建實體類
在 src 目錄下創(chuàng)建一個名為com.my.entity 的包,在該包中創(chuàng)建實體類 Website。
package com.my.entity; import java.util.Date; //網(wǎng)站信息實體類 public class Website { private int id; private String name; private String url; private int age; private String country; private Date createtime; @Override public String toString() { return "Website [id=" + id + ", name=" + name + ", url=" + url + ", age=" + age + ", country=" + country + ", createtime=" + createtime + "]"; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } public Date getCreatetime() { return createtime; } public void setCreatetime(Date createtime) { this.createtime = createtime; } }
注意:在類中聲明的屬性名稱與數(shù)據(jù)表 website 的字段名稱,保持完全一致。
③ SQL映射文件(在 src 目錄下創(chuàng)建 com.my.mapper 包,在該包下創(chuàng)建映射文件 WebsiteMapper.xml。)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- SQL映射文件:配置執(zhí)行的SQL語句 --> <mapper namespace="com.my.mapper.WebsiteMapper"> <!-- 添加操作的SQL映射 --> <insert id = "insertNewWebsite" parameterType="com.my.entity.Website"> insert into website(name,url,age,country)values(#{name},#{url},#{age},#{country}) </insert> <!-- 查詢所有網(wǎng)站信息 --> <select id="selectWebsiteList" resultType="com.my.entity.Website"> select * from website </select> </mapper>
上述代碼中,<mapper> 元素是配置文件的根元素,它包含了 namespace屬性,該屬性值通常設置為“包名+SQL映射文件名”,用于指定唯一的命名空間。
子元素 <select>、<insert> 中的信息用于執(zhí)行查詢、添加操作。
在定義的 SQL語句中,“#{}”表示一個占位符,相當于“?”,而“#{name}”表示該占位符用于接收參數(shù)中的名稱為 name的參數(shù)值。
④核心配置文件
MyBatis 核心配置文件主要用于配置數(shù)據(jù)庫連接和 MyBatis運行時所需的各種特性,包含了設置和影響 MyBatis 行為的屬性。
在 src 目錄下創(chuàng)建 MyBatis的核心配置文件 mybatis-config.xml,在該文件中配置了數(shù)據(jù)庫環(huán)境和映射文件的位置,具體內(nèi)容如下:
<?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> <!-- 框架參數(shù) --> <settings> <!-- 配置日志為LOG4J --> <setting name="logImpl" value="LOG4J" /> </settings> <!-- 配置mybatis運行環(huán)境 --> <environments default="development"> <environment id="development"> <!-- 使用JDBC的事務管理 --> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <!-- MySQL數(shù)據(jù)庫驅(qū)動 --> <property name="driver" value="com.mysql.cj.jdbc.Driver" /> <!-- 連接數(shù)據(jù)庫的URL --> <property name="url" value="jdbc:mysql://localhost:3306/my_bank?charset=utf8mb4&useSSL=false&useTimezone=true&serverTimezone=GMT%2B8" /> <property name="username" value="xxxx" /> <property name="password" value="xxxxxx" /> </dataSource> </environment> </environments> <!-- 將mapper文件加入到配置文件中 --> <mappers> <mapper resource="com/my/mapper/EarthquakeMapper.xml" /> </mappers> </configuration>
⑤日志文件
MyBatis 默認使用 log4j 輸出日志信息,如果開發(fā)者需要查看控制臺輸出的 SQL 語句,可以在 classpath 路徑下配置其日志文件。在 mybatisDemo 的 src 目錄下創(chuàng)建 log4j.properties 文件
# Global logging configuration log4j.rootLogger=ERROR,stdout # MyBatis logging configuration... log4j.logger.com.apesource=DEBUG # Console output... log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
三、MyBatis 核心對象
MyBatis 的核心接口和類包括:SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession。
使用步驟:
1首先,獲取 SqlSessionFactoryBuilder對象,可以根據(jù) XML 配置文件或者 Configuration 類的實例構建該對象。
2其次,通過 SqlSessionFactoryBuilder對象來獲取 SqlSessionFactory 對象。
3最后,獲取 SqlSessionFactory 對象之后,就可以進一步獲取 SqlSession 實例。SqlSession 對象中完全包含以數(shù)據(jù)庫為背景的所有執(zhí)行 SQL 操作的方法,用該實例可以直接執(zhí)行已映射的 SQL 語句。
核心對象的生命周期和作用域
SqlSessionFactoryBuilder
這個類可以被實例化、使用和丟棄,一旦創(chuàng)建了SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 實例的最佳作用域是方法作用域(也就是局部方法變量)。 可以重用 SqlSessionFactoryBuilder 來創(chuàng)建多個 SqlSessionFactory 實例。
SqlSessionFactory
SqlSessionFactory 一旦被創(chuàng)建就應該在應用的運行期間一直存在,沒有任何理由丟棄它或重新創(chuàng)建另一個實例。 使用 SqlSessionFactory 的最佳實踐是在應用運行期間不要重復創(chuàng)建多次,多次重建 SqlSessionFactory 被視為一種代碼“壞習慣”。因此 SqlSessionFactory 的最佳作用域是"應用作用域"。即隨著應用程序的生命周期一直存在。這種“存在于整個應用運行期間,并且只存在一個對象實例”。例如使用單例模式。
SqlSession
每個線程都應該有它自己的 SqlSession 實例。SqlSession 的實例不是線程安全的,因此是不能被共享的,所以它的最佳的作用域是請求或方法作用域。 絕對不能將 SqlSession 實例的引用放在一個類的靜態(tài)域,甚至一個類的實例變量也不行。為了確保每次都能執(zhí)行關閉操作,你應該把這個關閉操作放到 finally 塊中。
將其代入實例中封裝為MyBatis工具類和實
工具類
package com.my.dao; import java.io.IOException; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class MybatisDBUtils { private static SqlSessionFactory factory = null; static { try { SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); factory = builder.build(Resources.getResourceAsStream("mybatis-config.xml")); } catch (IOException e) { e.printStackTrace(); } } public static SqlSession getSqlSession() { SqlSession session = null; if(factory != null) { session = factory.openSession(); } return session; } }
實現(xiàn)類
public class Test04 { public static void main(String[] args) { //每1000條執(zhí)行一次批處理,并獲取主鍵回填 try (SqlSession sqlSession = MybatisDBUtils.getBatchSqlSession()) { WebsiteMapper websiteMapper = sqlSession.getMapper(WebsiteMapper.class); for(int i = 1;i <= 10;i++) { Website website = new Website("神碼搜索","www.shenma.com",((int)(Math.random()*10)),"CN"); } } }
到此這篇關于基于MyBatis的數(shù)據(jù)持久化框架的使用詳解的文章就介紹到這了,更多相關MyBatis數(shù)據(jù)持久化框架內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringMVC接收復雜集合對象(參數(shù))代碼示例
這篇文章主要介紹了SpringMVC接收復雜集合對象(參數(shù))代碼示例,舉接收List<String>、List<User>、List<Map<String,Object>>、User[]、User(bean里面包含List)幾種較為復雜的集合參數(shù),具有一定參考價值,需要的朋友可以了解下。2017-11-11springboot實現(xiàn)注冊加密與登錄解密功能(demo)
這篇文章主要介紹了springboot實現(xiàn)注冊的加密與登錄的解密功能,本文通過demo實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2020-02-02SpringBoot中的WebSocketSession原理詳解
這篇文章主要介紹了SpringBoot中的WebSocketSession原理詳解,傳統(tǒng)的?HTTP?協(xié)議是無法支持實時通信的,因為它是一種無狀態(tài)協(xié)議,每次請求都是獨立的,無法保持連接。為了解決這個問題,WebSocket?協(xié)議被引入,需要的朋友可以參考下2023-07-07SpringBoot整合JDBC、Druid數(shù)據(jù)源的示例代碼
這篇文章主要介紹了SpringBoot整合JDBC、Druid數(shù)據(jù)源,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-05-05