目錄
ORM思想(對(duì)象關(guān)系映射思想)
初識(shí)MyBatis
什么是MyBatis呢?
JDBC? VS? MyBatis代碼?
獲取數(shù)據(jù)庫(kù)連接對(duì)比
?對(duì)表格查詢操作:
JDBC弊端
MyBatis,JDBC對(duì)比
MyBatis進(jìn)一步介紹以及本質(zhì)分析
JDBC編程的劣勢(shì),MyBatis提供了以下解決方案
MyBatis環(huán)境搭建
配置依賴案例演示:
MyBatis環(huán)境搭建步驟
我的第一個(gè)MyBatis
項(xiàng)目樹
mybatis-config.xml文件
UserMapper.xml文件
db.properties文件
pom.xml文件
?
ORM思想(對(duì)象關(guān)系映射思想)
ORM(對(duì)象關(guān)系映射)是一種編程思想和技術(shù),用于將關(guān)系型數(shù)據(jù)庫(kù)(也就是MySQL等數(shù)據(jù)庫(kù))中的表結(jié)構(gòu)映射到面向?qū)ο缶幊陶Z言中的對(duì)象模型。我們介紹的MyBatis框架也是實(shí)現(xiàn)了ORM思想的;
初學(xué)Java時(shí),我們學(xué)過Java的主要思想,“萬事萬物皆對(duì)象”,呢么在這里,實(shí)際上就是將數(shù)據(jù)庫(kù)中的表也抽象成一個(gè)對(duì)象,這樣就避免了操作數(shù)據(jù)庫(kù)中的表格繁瑣的過程,直接通過Java對(duì)象調(diào)方法的操作表中的數(shù)據(jù);比如User類對(duì)應(yīng)t_user表如下圖:
ORM思想圖解(圖來自動(dòng)力節(jié)點(diǎn)課堂筆記)
ORM 的基本思想是通過定義對(duì)象和數(shù)據(jù)庫(kù)表之間的映射關(guān)系,使得開發(fā)人員可以像操作對(duì)象一樣操作數(shù)據(jù)庫(kù),而不需要直接編寫SQL語句。
ORM 的優(yōu)點(diǎn)包括:
-
簡(jiǎn)化開發(fā):ORM 提供了一種易于理解和使用的編程模型,開發(fā)人員可以直接使用對(duì)象的方法和屬性來操作數(shù)據(jù)庫(kù),從而免去了復(fù)雜的SQL語句和數(shù)據(jù)庫(kù)細(xì)節(jié)。
-
提高可維護(hù)性:通過將數(shù)據(jù)庫(kù)和應(yīng)用程序的邏輯分離,使得代碼更加模塊化和可維護(hù)。當(dāng)數(shù)據(jù)庫(kù)結(jié)構(gòu)改變時(shí),只需更新映射定義,而不需要修改大量的業(yè)務(wù)邏輯代碼。
-
提高可移植性:ORM 可以隱藏不同數(shù)據(jù)庫(kù)之間的差異,使得應(yīng)用程序可以比較容易地切換或同時(shí)支持多種數(shù)據(jù)庫(kù)。
-
提供對(duì)象級(jí)的查詢和持久化:ORM 不僅提供了方便的增刪改查操作,還支持復(fù)雜的查詢和關(guān)聯(lián)操作,可以方便地處理對(duì)象之間的關(guān)系。
除MyBatis外常見的其他ORM框架包括Hibernate(Java)、Django ORM(Python)、Entity Framework(.NET)等。這些框架都提供了一套映射規(guī)則和API,使得開發(fā)人員可以更輕松地進(jìn)行數(shù)據(jù)庫(kù)操作,提高開發(fā)效率和代碼質(zhì)量。
初識(shí)MyBatis
什么是MyBatis呢?
我在之前學(xué)完java基礎(chǔ)之后,學(xué)習(xí)了Javaweb,隨后學(xué)習(xí)了使用java連接數(shù)據(jù)庫(kù)的技術(shù)JDBC,JDBC就是連接數(shù)據(jù)庫(kù)的一種工具,然而MyBatis實(shí)際上就是對(duì)JDBC的再一次封裝,他大大的節(jié)約了代碼的書寫量,以及改進(jìn)了JDBC在實(shí)際使用中的一些弊端;
簡(jiǎn)單來說什么是Mybatis呢?Java有個(gè)萬事萬物皆對(duì)象的說法,即將Java操作的事務(wù)都抽象出該事務(wù)為一個(gè)對(duì)象,該對(duì)象有關(guān)的一切操作(刪除表中數(shù)據(jù)、加入一條數(shù)據(jù)等等),在Java中都被封裝成一個(gè)一個(gè)的方法(到時(shí)只需對(duì)象調(diào)方法即可),呢么此處的操作數(shù)據(jù)庫(kù)也是一樣的,我們之間學(xué)過JDBC,所謂MyBatis就是將JDBC封裝成一些對(duì)象和一大堆方法,然后將JDBC中的一些需要程序員自己書寫的重復(fù)繁瑣的代碼封裝成對(duì)象中的方法,比如連接數(shù)據(jù)庫(kù)(獲取connection對(duì)象)、調(diào)用preparedstatement執(zhí)行sql語句、獲取結(jié)果集時(shí)的繁瑣步驟等等。
JDBC? VS? MyBatis代碼?
我們上面一直使用文字來描述mybatis的優(yōu)點(diǎn),節(jié)省代碼量等等,這些都不直觀,下面我們通過代碼來對(duì)比出二者的優(yōu)缺點(diǎn):
獲取數(shù)據(jù)庫(kù)連接對(duì)比
public class DBUtil {
//靜態(tài)變量是類加載時(shí)運(yùn)行,有順序;
private static ResourceBundle bundle=ResourceBundle.getBundle("resources.jdbc");
private static String url = bundle.getString("url");
private static String user = bundle.getString("user");
private static String password = bundle.getString("password");
private static String driverClass = bundle.getString("driverClass");
static{
//注冊(cè)驅(qū)動(dòng)
//只需要進(jìn)行一次,在類加載時(shí)執(zhí)行
//Class.forName("com.mysql.jdbc.Driver");方法的參數(shù)別寫死,不然后期很難擴(kuò)展;什么是OCP,在進(jìn)行功能擴(kuò)展的時(shí)候,不需要修改源代碼;
try {
Class.forName(driverClass);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConnection() throws SQLException {
//獲取連接
Connection conn = DriverManager.getConnection(url, user, password);
return conn;
}
public static void close(Connection conn, Statement ps, ResultSet rs){
if(rs!=null){
try {
rs.close();
}catch (Exception e){
e.printStackTrace();
}
}
if(ps!=null){
try {
ps.close();
}catch (Exception e){
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
}
然而在MyBatis中我們只需要在mybatis-config.xml文件中配置以下信息即可,具體細(xì)節(jié)我們不需要關(guān)心,MyBatis程序員已經(jīng)在底層為我們做好了,如果需要對(duì)大量數(shù)據(jù)庫(kù)操作,可見二者代碼量的差距,很直觀mybatis避免了繁瑣的代碼,以及繁瑣的實(shí)現(xiàn)細(xì)節(jié);
<properties resource="db.properties"/>
<transactionManager type="JDBC"/>
<property name="driver" value="${mysql.driver}"/>
<property name="url" value="${mysql.url}"/>
<property name="username" value="${mysql.username}"/>
<property name="password" value="${mysql.password}"/>
?對(duì)表格查詢操作:
public Dept selectByno(int no) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
Dept dept =null;
try {
conn = DBUtil.getConnection();
String sql = "select dname,loc from dept1 where deptno=? ";
ps = conn.prepareStatement(sql);
ps.setInt(1, no);
rs = ps.executeQuery();
dept = new Dept();
while (rs.next()) {
String dname = rs.getString("dname");
String loc = rs.getString("loc");
dept.setDeptno(no);
dept.setDname(dname);
dept.setLocation(loc);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBUtil.close(conn, ps, rs);
}
return dept;
}
在mybatis中我們只需要在***Mapper.xml文件中配置標(biāo)簽和查詢語句即可,避免了大量的創(chuàng)建對(duì)象和大量繁瑣的過程,這一個(gè)操作不得已看出mybatis的優(yōu)勢(shì),然而實(shí)際需求中當(dāng)有數(shù)以萬計(jì)的表格和操作之后,二者的代碼量,可見mybatis的優(yōu)勢(shì);
JDBC弊端
?1、?連接數(shù)據(jù)庫(kù)時(shí)需要頻繁的創(chuàng)建連接,并釋放連接;
?2、 項(xiàng)目中的sql語句都是硬編碼,違背了開閉原則,所謂開閉原則就是強(qiáng)調(diào)軟件實(shí)體(類、模塊、函數(shù)等)應(yīng)該對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉;
?3、 使用preparedstatement對(duì)象處理sql語句時(shí)(使用占位符來為參數(shù)占位,然而參數(shù)的個(gè)數(shù)是動(dòng)態(tài)的),根據(jù)參數(shù)的個(gè)數(shù)不同,需要不時(shí)地的修改代碼,或者書寫很多冗余的代碼;
?4、 項(xiàng)目中一旦SQL語句變化,也要在底層改動(dòng)很多地方(不同的SQL語句得到的結(jié)果集都會(huì)不同,因此處理結(jié)果集的代碼就會(huì)有所不同);
?5、 查詢后得到的結(jié)果集,轉(zhuǎn)換成對(duì)應(yīng)的java類需要很負(fù)責(zé)的步驟;(處理結(jié)果集過程)
MyBatis,JDBC對(duì)比
?相對(duì)于 MyBatis,JDBC 的一些缺點(diǎn)包括: ?? ?
1、 冗余的代碼:JDBC 需要手動(dòng)編寫大量的重復(fù)性代碼,如數(shù)據(jù)庫(kù)連接和關(guān)閉、SQL語句的拼接、結(jié)果集的處理等,使開發(fā)過程顯得冗長(zhǎng)而繁瑣。 ?
2、 容易出現(xiàn)安全問題:由于需要手動(dòng)拼接 SQL 語句,存在 SQL 注入的風(fēng)險(xiǎn)。開發(fā)人員必須小心防范并處理 SQL 注入攻擊,增加了安全風(fēng)險(xiǎn)。 ?
3、 處理事務(wù)困難:JDBC 需要手動(dòng)管理事務(wù),包括事務(wù)的開啟、提交和回滾。在復(fù)雜的業(yè)務(wù)操作中,需要編寫大量的事務(wù)管理代碼,容易出錯(cuò)且難以維護(hù)。 ?
4、 面向細(xì)節(jié):JDBC 是低層次的API,需要開發(fā)人員手動(dòng)處理數(shù)據(jù)庫(kù)的細(xì)節(jié),如連接池管理、異常處理、批量操作等。這增加了開發(fā)的復(fù)雜性和難度,容易出現(xiàn)錯(cuò)誤和性能問題。 ?? ?
相對(duì)于 JDBC,MyBatis 是一個(gè)優(yōu)秀的 ORM 框架,它克服了上述問題,提供了更高級(jí)別的抽象和便利,具有以下優(yōu)點(diǎn): ?? ?
1、 聲明式的 SQL:MyBatis 使用 XML 或注解來定義 SQL 語句,并提供了強(qiáng)大的動(dòng)態(tài) SQL 功能,簡(jiǎn)化了 SQL 的編寫和維護(hù)。 ?
2、 簡(jiǎn)化的數(shù)據(jù)庫(kù)操作:MyBatis 提供了簡(jiǎn)潔的 API,將數(shù)據(jù)庫(kù)連接、SQL 執(zhí)行、結(jié)果集映射等細(xì)節(jié)封裝起來,減少了冗余的代碼量。 ?
3、 對(duì)象關(guān)系映射:MyBatis 支持對(duì)象關(guān)系映射,可以將查詢結(jié)果直接映射為對(duì)象,方便了開發(fā)人員對(duì)數(shù)據(jù)庫(kù)結(jié)果的操作和處理。 ?
4、 緩存機(jī)制:MyBatis 內(nèi)置了緩存機(jī)制,可以緩存查詢結(jié)果,提高系統(tǒng)的性能和響應(yīng)速度。 ?
5、 聲明式事務(wù):MyBatis 提供了聲明式事務(wù)管理的支持,通過配置和注解實(shí)現(xiàn)事務(wù)的開啟、提交和回滾,簡(jiǎn)化了事務(wù)管理的操作。 ?? ?
綜上所述,相對(duì)于 JDBC,MyBatis 提供了更高級(jí)別的抽象和便利,簡(jiǎn)化了數(shù)據(jù)庫(kù)操作,提高了開發(fā)效率和代碼的可維護(hù)性。?
MyBatis進(jìn)一步介紹以及本質(zhì)分析
MyBatis作為一個(gè)優(yōu)秀的持久層框架,它對(duì)JDBC操作數(shù)據(jù)率的過程進(jìn)行了封裝,使開發(fā)者只需要關(guān)注SQL本身,而不需要花費(fèi)精力去處理注冊(cè)驅(qū)動(dòng) 創(chuàng)建Connertion對(duì)象、創(chuàng)建Statement對(duì)象、手動(dòng)設(shè)置參數(shù)結(jié)果集檢索等JDBC繁雜的過程代碼。
JDBC編程的劣勢(shì),MyBatis提供了以下解決方案,具體如下。
問題一:頻繁地創(chuàng)建、釋放數(shù)據(jù)庫(kù)連接會(huì)造成系統(tǒng)資源浪費(fèi),從而影響系統(tǒng)性能。
解決方案:在SqlMapConfig.xml 中配置數(shù)據(jù)連接池,使用數(shù)據(jù)庫(kù)連接池管理數(shù)據(jù)庫(kù)連接
問題二:代碼中的SQL語句硬編碼,會(huì)造成代碼不易于維護(hù)。在實(shí)際應(yīng)用的開發(fā)中,SOL變化的可能性較大。在傳統(tǒng)JDBC編程中,01變動(dòng)金發(fā)更改nva代碼,違反了開閉原則。軟件實(shí)體對(duì)打
解決方案:MyBatis將SQL語句配置在MyBatis的映射文件(***mapper.xml文件)中,實(shí)現(xiàn)了與Java代碼的分離。
問題三:使用PreparedStatement向占位符傳參數(shù)存在硬編碼,因?yàn)镾QL語句的where條件不確定,如果有修改SQL的需求,必須要修改代碼,這樣會(huì)導(dǎo)致系統(tǒng)難以維護(hù)。
解決方案:MyBatis自動(dòng)將Java對(duì)象映射至SQL語句,通過Statement中的 parameterType定義輸入?yún)?shù)的類型。
問題四:JDBC對(duì)結(jié)果集解析存在硬編碼(查詢列名),SQL變化導(dǎo)致解析代碼變化,使得系統(tǒng)不易于維護(hù)
解決方案:MyBatis自動(dòng)將SQL執(zhí)行結(jié)果映射至Java對(duì)象,通過Statement中的resultType定義輸出結(jié)果的類型。
MyBatis環(huán)境搭建
創(chuàng)建工程,引入依賴(因?yàn)閷W(xué)過Maven技術(shù),所以無須自己下載MyBatis驅(qū)動(dòng)jar包,只需要在配置文件(pom.xml)中配置即可)使用Maven倉(cāng)庫(kù)技術(shù);
這里插入一個(gè)小知識(shí)點(diǎn):工程(project)和模塊(module)的關(guān)系是,一個(gè)工程(project)可以包含多個(gè)模塊(module);
配置依賴案例演示:
MyBatis環(huán)境搭建步驟
1、 創(chuàng)建工程 ?
2、 引入驅(qū)動(dòng)jar包(Maven倉(cāng)庫(kù)技術(shù))
3、 創(chuàng)建對(duì)應(yīng)的數(shù)據(jù)庫(kù)中的數(shù)據(jù)表格 ?
4、 創(chuàng)建數(shù)據(jù)庫(kù)連接信息配置文件,db.properties文件 ?
5、 創(chuàng)建MyBatis的核心配置文件(mybatis——config.xml文件)這個(gè)文件一個(gè)模塊中僅有一個(gè)
我的第一個(gè)MyBatis
具體實(shí)現(xiàn)步驟:
?1、 創(chuàng)建數(shù)據(jù)庫(kù)中的數(shù)據(jù)
?2、 創(chuàng)建pojo實(shí)體、或者也可以稱為Javabean或者dao
?3、 創(chuàng)建映射文件***Mapper.xml文件(一個(gè)模塊中可能會(huì)處理多張表格,其中一個(gè)表格對(duì)應(yīng)一個(gè)Mapper.xml文件)
?4、 將***Mapper.xml文件的路徑配置到MyBatis-config.xml文件中
?5、 在項(xiàng)目的test路徑下編寫測(cè)試代碼文章來源:http://www.zghlxwxcb.cn/news/detail-698532.html
項(xiàng)目樹
文章來源地址http://www.zghlxwxcb.cn/news/detail-698532.html
mybatis-config.xml文件
<?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>
<!-- 加載類路徑下的屬性配置文件 -->
<properties resource="db.properties"/>
<!-- 默認(rèn)使用的環(huán)境 ID(比如:default="development")
也就是說我們可以配置多套<environment>環(huán)境-->
<environments default="development">
<!--
每個(gè) environment 元素定義的環(huán)境 ID
-->
<environment id="development">
<!--
transactionManager 事務(wù)管理器
type的值有JDBC和MANAGED
JDBC – 這個(gè)配置直接使用了 JDBC 的提交和回滾設(shè)施,它依賴從數(shù)據(jù)源獲得的連接來管理事務(wù)作用域。
-->
<transactionManager type="JDBC"/>
<!--
dataSourcedataSource 數(shù)據(jù)源 dbcp c3p0 druid
type="[UNPOOLED|POOLED|JNDI]"
POOLED意思有連接池的連接
UNPOOLED意思沒有連接池的連接
-->
<dataSource type="POOLED">
<!-- JDBC 驅(qū)動(dòng)-->
<property name="driver" value="${mysql.driver}"/>
<!-- url數(shù)據(jù)庫(kù)的 JDBC URL地址。-->
<property name="url" value="${mysql.url}"/>
<property name="username" value="${mysql.username}"/>
<property name="password" value="${mysql.password}"/>
<!-- defaultTransactionIsolationLevel – 默認(rèn)的連接事務(wù)隔離級(jí)別。–>-->
<!-- <property name="defaultTransactionIsolationLevel" value=""/>-->
<!-- defaultNetworkTimeout – 等待數(shù)據(jù)庫(kù)操作完成的默認(rèn)網(wǎng)絡(luò)超時(shí)時(shí)間(單位:毫秒)–>-->
<!-- <property name="efaultNetworkTimeout" value=""/>-->
</dataSource>
</environment>
</environments>
<mappers>
<!-- 使用相對(duì)于類路徑的資源引用 -->
<mapper resource="mapper/UserMapper.xml"/>
<!-- 使用完全限定資源定位符(URL)
不推薦使用
<mapper url="E:\JetBrains\mybatis學(xué)習(xí)\Mybatis-study\Mybatis-03\src\main\java\asia\xiaojiang\mybatis03\dao\UserMapper.xml"/>
-->
<!-- 使用映射器接口實(shí)現(xiàn)類的完全限定類名
使用注意點(diǎn):
接口和其配置文件必須同名, 必須在同一個(gè)包下
-->
<!-- <mapper class="asia.xiaojiang.mybatis03.dao.UserMapper"/>-->
<!-- 將包內(nèi)的映射器接口實(shí)現(xiàn)全部注冊(cè)為映射器
使用包掃描注意點(diǎn):
接口和其配置文件必須同名, 必須在同一個(gè)包下
-->
<!-- <package name="asia.xiaojiang.mybatis03.dao"/>-->
</mappers>
</configuration>
UserMapper.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">
<!--
mapper為映射的根節(jié)點(diǎn),namespace指定Dao接口的完整類名,
mybatis會(huì)根據(jù)這個(gè)接口動(dòng)態(tài)的創(chuàng)建一個(gè)實(shí)現(xiàn)類
去實(shí)現(xiàn)這個(gè)接口,而這個(gè)實(shí)現(xiàn)類是一個(gè)Mapper對(duì)象
-->
<mapper namespace="com.lyp.pojo.User">
<!--定義接口方法對(duì)應(yīng)的 SQL 語句-->
<select id="findById"
parameterType="int" resultType="com.lyp.pojo.User">
select * from users where uid=#{id}
</select>
</mapper>
db.properties文件
mysql.driver=com.mysql.cj.jdbc.Driver
mysql.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&\
characterEncoding=utf8&useUnicode=true&useSSL=false
mysql.username=root
mysql.password=123456
pom.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>MyBatis</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>18</maven.compiler.source>
<maven.compiler.target>18</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
到了這里,關(guān)于【MyBatis篇】MyBatis框架基礎(chǔ)知識(shí)筆記的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!