SSM框架的學(xué)習(xí)與應(yīng)用(Spring + Spring MVC + MyBatis)-Java EE企業(yè)級(jí)應(yīng)用開發(fā)學(xué)習(xí)記錄(第一天)Mybatis的學(xué)習(xí)
一、當(dāng)前的主流框架介紹(這就是后期我會(huì)發(fā)出來的框架學(xué)習(xí))
Spring框架
? Spring是一個(gè)開源框架,是為了解決企業(yè)應(yīng)用程序開發(fā)復(fù)雜性而創(chuàng)建的,其主要優(yōu)勢(shì)之一就是分層架構(gòu)。Spring提供了更完善的開發(fā)環(huán)境,可以為POJO(Plain Ordinary Java Object,普通Java對(duì)象)對(duì)象提供企業(yè)級(jí)的服務(wù)。
Spring MVC框架
? Spring MVC是一個(gè)Web開發(fā)框架,可以將它理解為Servlet。在MVC模式中,Spring MVC作為控制器(Controller)用于實(shí)現(xiàn)模型與視圖的數(shù)據(jù)交互,是結(jié)構(gòu)最清晰的。
? Spring MVC框架采用松耦合、可插拔的組件結(jié)構(gòu),具有高度可配置性,與其他的MVC框架相比,具有更強(qiáng)的擴(kuò)展性和靈活性。
MyBatis框架
? MyBatis 是Apache的一個(gè)開源項(xiàng)目iBatis,2010年這個(gè)項(xiàng)目由Apache Software Foundation遷移到了Google Code,并且改名為MyBatis ,2013年11月MyBatis又被遷移到Github。
? MyBatis是一個(gè)優(yōu)秀的持久層框架,它可以在實(shí)體類和SQL語句之間建立映射關(guān)系,是一種半自動(dòng)化的ORM(Object/Relation Mapping,即對(duì)象關(guān)系映射)實(shí)現(xiàn)。MyBatis封裝性要低于Hibernate,但它性能優(yōu)越、簡(jiǎn)單易學(xué),在互聯(lián)網(wǎng)應(yīng)用的開發(fā)中被廣泛使用。
Spring Boot 框架
? Spring Boot 框架是 Pivotal 團(tuán)隊(duì)基于 Spring 開發(fā)的全新框架,其設(shè)計(jì)初衷是為了簡(jiǎn)化 Spring 的配置,使用戶能夠構(gòu)建獨(dú)立運(yùn)行的程序,提高開發(fā)效率。
? Spring Boot 框架本身并不提供 Spring 框架的核心特性及擴(kuò)展功能,它只是用于快速、敏捷地開發(fā)新一代基于 Spring 框架的應(yīng)用,同時(shí)它還集成了大量的第三方類庫(如Jackson、JDBC、Redis 等),使用戶只需少量配置就能完成相應(yīng)功能。
Spring Cloud 框架
? Spring Cloud 是一系列框架的有序集合,為開發(fā)人員構(gòu)建微服務(wù)架構(gòu)提供了完整的解決方案,它利用Spring Boot 的開發(fā)便利性巧妙地簡(jiǎn)化了分布式系統(tǒng)的開發(fā)。例如,配置管理、服務(wù)發(fā)現(xiàn)、控制總線等操作,都可以使用 Spring Boot 做到一鍵啟動(dòng)和部署。可以說,Spring Cloud 將 Spring Boot 框架進(jìn)行了再封裝,屏蔽掉了復(fù)雜的配置和實(shí)現(xiàn)原理,具有簡(jiǎn)單易懂、易部署和易維護(hù)等特點(diǎn)。
那么開始今天的主題MyBatis的學(xué)習(xí)
二、什么是MyBatis?
? MyBatis是一個(gè)支持普通SQL查詢、存儲(chǔ)過程以及高級(jí)映射的半自動(dòng)化持久層框架,它消除了幾乎所有的JDBC代碼和參數(shù)的手動(dòng)設(shè)置以及對(duì)結(jié)果集的檢索,使用簡(jiǎn)單的“XML”或“注解”進(jìn)行配置和原始“映射”,將接口和Java的POJO映射成數(shù)據(jù)庫中的記錄,使得Java開發(fā)人員可以使用面向?qū)ο蟮木幊趟枷雭聿僮鲾?shù)據(jù)庫。
PS:(名詞解釋)
- XML(可擴(kuò)展標(biāo)記語言): XML 是一種標(biāo)記語言,用于描述數(shù)據(jù)的結(jié)構(gòu)和內(nèi)容。它被廣泛用于數(shù)據(jù)的存儲(chǔ)、交換和表示。XML 使用標(biāo)簽來標(biāo)識(shí)數(shù)據(jù)的不同部分,并使用元素、屬性和文本來組織數(shù)據(jù)。XML 具有可擴(kuò)展性,允許用戶定義自己的標(biāo)簽和數(shù)據(jù)結(jié)構(gòu)。由于其通用性和可擴(kuò)展性,XML 在 Web 開發(fā)、數(shù)據(jù)傳輸、配置文件等領(lǐng)域都有廣泛應(yīng)用。
-
注解(Annotation): 注解是一種元數(shù)據(jù)(metadata),可以應(yīng)用于代碼中的類、方法、字段等元素。**它們不會(huì)直接影響程序的執(zhí)行,但可以提供額外的信息給編譯器、解釋器、工具和其他程序。在 Java 中,注解是以
@
符號(hào)為前綴的特殊標(biāo)記。**注解可以用于提供編譯時(shí)的指示、運(yùn)行時(shí)的處理、文檔生成等。常見的 Java 注解包括@Override
表明是方法重寫、@FunctionalInterface
函數(shù)式接口、@Nullable
表明元素可以為null、@Autowired
用于標(biāo)記字段、構(gòu)造器或方法,表示自動(dòng)裝配(自動(dòng)注入)該組件 等(后面我會(huì)發(fā)一個(gè)常見注解的說明) - 映射(Mapping):在編程中,映射通常指的是將一個(gè)數(shù)據(jù)或?qū)ο箨P(guān)聯(lián)到另一個(gè)數(shù)據(jù)或?qū)ο蟮倪^程。這可以是不同數(shù)據(jù)結(jié)構(gòu)之間的對(duì)應(yīng)關(guān)系,比如數(shù)據(jù)庫表的列與對(duì)象屬性的對(duì)應(yīng)關(guān)系,或者是 URL 路徑與控制器方法的對(duì)應(yīng)關(guān)系。在數(shù)據(jù)庫中,對(duì)象-關(guān)系映射(ORM)指的是將數(shù)據(jù)庫表映射到面向?qū)ο蟮念惖倪^程。在 Web 開發(fā)中,URL 路由映射指的是將請(qǐng)求的 URL 映射到相應(yīng)的處理程序或方法上。
? MyBatis框架是一個(gè)ORM(Object/Relation Mapping,即對(duì)象關(guān)系映射)框架。所謂的ORM就是一種為了解決面向?qū)ο笈c關(guān)系型數(shù)據(jù)庫中數(shù)據(jù)類型不匹配的技術(shù),它通過描述Java對(duì)象與數(shù)據(jù)庫表之間的映射關(guān)系,自動(dòng)將Java應(yīng)用程序中的對(duì)象持久化到關(guān)系型數(shù)據(jù)庫的表中。ORM框架的工作原理可以通過一張圖來展示。
(這段加粗文字如果簡(jiǎn)單理解的話,那就是可以把Java中的數(shù)據(jù)類型自動(dòng)轉(zhuǎn)換識(shí)別成數(shù)據(jù)庫的數(shù)據(jù)類型)
當(dāng)使用ORM框架將Java中的基本數(shù)據(jù)類型映射到數(shù)據(jù)庫時(shí),通常的映射規(guī)則如下:
- byte --> TINYINT
- short --> SMALLINT
- int --> INT
- long --> BIGINT
- float --> FLOAT
- double --> DOUBLE
- boolean --> BIT(對(duì)于MySQL和SQL Server等數(shù)據(jù)庫),BOOLEAN(對(duì)于PostgreSQL等數(shù)據(jù)庫)
- char --> CHAR(通常用于存儲(chǔ)單個(gè)字符) String --> VARCHAR(通常用于存儲(chǔ)字符串)
? 不同的數(shù)據(jù)庫系統(tǒng)可能有不同的數(shù)據(jù)類型名稱,因此在特定的數(shù)據(jù)庫中可能會(huì)略有差異。此外,ORM框架也允許進(jìn)行自定義配置,以適應(yīng)不同的數(shù)據(jù)庫需求。
此外,還有一些其他特殊類型,例如日期和時(shí)間類型,也可以在ORM中進(jìn)行映射,比如:
- java.util.Date 或 java.time.LocalDate --> DATE
- java.util.Time 或 java.time.LocalTime --> TIME
- java.util.Date 或 java.time.LocalDateTime --> DATETIME 或 TIMESTAMP
? 上面這些就是我們學(xué)習(xí)Java常見的8種基本數(shù)據(jù)類型在數(shù)據(jù)庫中的通用映射規(guī)則。但具體的映射規(guī)則可能會(huì)因不同的ORM框架或數(shù)據(jù)庫而有所區(qū)別,因此在實(shí)際開發(fā)中,還是得根據(jù)實(shí)際情況和需求進(jìn)行相應(yīng)的配置和調(diào)整。
? 了解完MyBatis的基本概念之后,我們就該到了如何使用MyBatis?想要使用首先就得引入,簡(jiǎn)單來說就是搭建MyBatis的開發(fā)環(huán)境。
三、如何搭建MyBatis的開發(fā)環(huán)境?
搭建環(huán)境的步驟如下:
-
創(chuàng)建工程后引入相關(guān)依賴。(本地lib導(dǎo)入jar包或者Pom.xml寫入依賴信息,Maven方式導(dǎo)入)
-
數(shù)據(jù)庫準(zhǔn)備(就是指創(chuàng)建好準(zhǔn)備鏈接的數(shù)據(jù)庫) 。 比如:MySQL Oracle PostgreSQL
-
編寫數(shù)據(jù)庫連接信息配置文件(db.properties 、database.properties、dbconfig.properties
、jdbc.properties都是指同一個(gè)文件,也就是數(shù)據(jù)庫連接信息配置文件)
-
編寫核心配置文件和映射文件。
? 一般來說都不會(huì)自己去寫,只有少部分會(huì)需要我們?nèi)憽4蟛糠值亩际强梢匀ゾW(wǎng)上下載模板然后自己修改一下基本信息就可以用了。
引入依賴(Maven方式引入需要聯(lián)網(wǎng))?編寫配置文件(數(shù)據(jù)庫連接信息配置文件、MyBatis核心配置文件)?
這里簡(jiǎn)單講解一下吧,方便理解。
①引入相關(guān)依賴的代碼
<!--Pom文件編寫依賴引入 只展示了其中一個(gè)依賴-- >
<dependencies>
<!-- MySQL Connector Java 引入java鏈接MySQL的依賴 -->
<dependency>
<groupId>mysql</groupId> <!-- 依賴名 -->
<artifactId>mysql-connector-java</artifactId> <!-- 組件名 ID -->
<version>8.0.11</version> <!-- 版本號(hào) -->
</dependency>
<!-- 其他依賴項(xiàng) -->
...<!--嘗試模仿并寫出其他項(xiàng)依賴引入,寫不出也可以去我資源找對(duì)應(yīng)的文件下載,都是敲好的-->
</dependencies>
③db.properties文件
//db.properties文件
# MySQL數(shù)據(jù)庫驅(qū)動(dòng)程序類名
mysql.driver=com.mysql.cj.jdbc.Driver
# MySQL數(shù)據(jù)庫連接URL,指定主機(jī)、端口、數(shù)據(jù)庫名稱和其他參數(shù)
mysql.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false
# MySQL數(shù)據(jù)庫用戶名
mysql.username=root
# MySQL數(shù)據(jù)庫密碼
mysql.password=root
④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>
<!-- 加載 db.properties 文件 -->
<properties resource="db.properties"/>
<environments default="development">
<!-- 設(shè)置開發(fā)環(huán)境 -->
<environment id="development">
<!-- 使用 JDBC 事務(wù)管理器 -->
<transactionManager type="JDBC"/>
<!-- 使用 POOLED 數(shù)據(jù)源 -->
<dataSource type="POOLED">
<!-- 指定數(shù)據(jù)庫驅(qū)動(dòng)程序 -->
<property name="driver" value="${mysql.driver}" />
<!-- 指定數(shù)據(jù)庫連接 URL -->
<property name="url" value="${mysql.url}" />
<!-- 指定數(shù)據(jù)庫用戶名 -->
<property name="username" value="${mysql.username}" />
<!-- 指定數(shù)據(jù)庫密碼 -->
<property name="password" value="${mysql.password}" />
</dataSource>
</environment>
</environments>
</configuration>
? 使用POOLED數(shù)據(jù)源的意思是:它表示使用連接池?cái)?shù)據(jù)源,“POOLED” 是Maven配置文件中 <dataSource>
配置項(xiàng)的一個(gè)屬性值
? 連接池是一組預(yù)先創(chuàng)建并管理的數(shù)據(jù)庫連接。當(dāng)應(yīng)用程序需要與數(shù)據(jù)庫進(jìn)行交互時(shí),它可以從連接池中獲取一個(gè)可用的數(shù)據(jù)庫連接,執(zhí)行操作完成后再將連接放回連接池,而不是每次都創(chuàng)建和關(guān)閉連接。這種方式可以提高性能和效率,避免了頻繁創(chuàng)建和銷毀數(shù)據(jù)庫連接的開銷。
? 具體到這個(gè)配置文件中,<dataSource type="POOLED">
指定了使用 POOLED 數(shù)據(jù)源類型。通過這個(gè)配置,Maven將會(huì)根據(jù)數(shù)據(jù)庫連接信息和連接池配置參數(shù),創(chuàng)建一個(gè)連接池?cái)?shù)據(jù)源供應(yīng)用程序使用。這樣,在應(yīng)用程序需要進(jìn)行數(shù)據(jù)庫操作時(shí),它可以從這個(gè)連接池中獲取連接,而不是每次都重新創(chuàng)建新的連接,從而提高性能和效率。
? 到這里環(huán)境就已經(jīng)搭建好了。
四、編寫MyBatis入門程序
? ①:數(shù)據(jù)庫準(zhǔn)備?②:pojo類編寫?③:mapper文件(sql語句)編寫?④:mybatis-config文件中添加mapper文件resources的地址?⑤:編寫測(cè)試類。
? 首先要準(zhǔn)備好一個(gè)要鏈接的數(shù)據(jù)庫,編寫好數(shù)據(jù)設(shè)計(jì)語句,設(shè)計(jì)表的同時(shí)呢,插入倆條語句進(jìn)去,這樣方便我們后續(xù)測(cè)試。記得若是鏈接的數(shù)據(jù)庫有改變,那么我們前面的數(shù)據(jù)庫鏈接信息配置文件也需要修改,就是db.properties。
? 首先我們要新建實(shí)體類上面也有提到的pojo包(普通JAVA對(duì)象),這里的話就要與數(shù)據(jù)庫的表字段一一對(duì)應(yīng),這樣才能映射過去。一般來說一個(gè)表對(duì)應(yīng)一個(gè)類,也就是一個(gè)對(duì)象。
? 如下圖:我們采用的PasswordMS表中的結(jié)構(gòu)如下:
那么我們的pojo包下的成員變量應(yīng)該是這樣子定義的:
? 字段名和變量名一一對(duì)應(yīng)。不要忘了生成Getter和Setter方法,因?yàn)槲覀兊脑L問修飾符是private私有的,那么如果不開放公共的方法來設(shè)置或獲取變量的值,這樣的話會(huì)導(dǎo)致只有在類的內(nèi)部能夠訪問到,所以不能忘記嗷,這也是面向?qū)ο蟮脑O(shè)計(jì)原則之一,也是封裝的基本特征,合理開放,合理暴露。
? 編寫一下Mapper.xml,里面編寫sql語句,動(dòng)態(tài)sql語句,這里我們要針對(duì)一下數(shù)據(jù)庫表的關(guān)系,然后去對(duì)java對(duì)象進(jìn)行一個(gè)映射,關(guān)系有一對(duì)一、一對(duì)多等。越復(fù)雜的sql編寫,需要注意的點(diǎn)就越多。
? 編寫mapper,需要在標(biāo)簽對(duì)里面
編寫mapping文件路徑配置,在mybatis-config.xml中下。這樣mybatis才能夠識(shí)別我們的mapper文件,才能夠使用映射語句,不會(huì)導(dǎo)致出錯(cuò)。
因?yàn)槲覀兦懊嬉肓薐unit測(cè)試依賴,那么就簡(jiǎn)單編寫一下測(cè)試類吧,看看我們編寫的Mapper接口能不能正常映射到數(shù)據(jù)庫。
//PasswordMSTest.java
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.log4j.Logger;
import pojo.PasswordMS;
import java.io.IOException;
import java.io.Reader;
import java.util.List;
class PasswordMSTest {
private Logger logger= Logger.getLogger(PasswordMSTest.class);
@org.junit.jupiter.api.Test
void getUid() {
//讀取文件名:
String resources="mybatis-config.xml";
//創(chuàng)建流
Reader reader = null;
try{
reader = Resources.getResourceAsReader(resources);
}catch (IOException e){
e.printStackTrace();
}
//初始化mybatis數(shù)據(jù)庫,創(chuàng)建SqlSessionFactory類的實(shí)例
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
//創(chuàng)建SqlSession實(shí)例
SqlSession session = sqlSessionFactory.openSession();
//傳入?yún)?shù)查詢,返回結(jié)果
PasswordMS passwordMS = session.selectOne("findById",1);
logger.info("姓名:"+passwordMS.getAccount()+",密碼:"+passwordMS.getPassword()+",網(wǎng)站:"+passwordMS.getWebsiteName());
//關(guān)閉session
session.close();
}
@org.junit.jupiter.api.Test
void getAllItem() {
//讀取文件名:
String resources="mybatis-config.xml";
//創(chuàng)建流
Reader reader = null;
try{
reader = Resources.getResourceAsReader(resources);
}catch (IOException e){
e.printStackTrace();
}
//初始化mybatis數(shù)據(jù)庫,創(chuàng)建SqlSessionFactory類的實(shí)例
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
//創(chuàng)建SqlSession實(shí)例
SqlSession session = sqlSessionFactory.openSession();
//傳入?yún)?shù)查詢,返回結(jié)果
List<PasswordMS> passwordMS = session.selectList("findAll");
for(PasswordMS s:passwordMS){
logger.info("id:"+s.getId()+",賬號(hào):"+s.getAccount()+",密碼:"+s.getPassword()+",網(wǎng)站名:"+s.getWebsiteName()+",網(wǎng)站網(wǎng)址:"+s.getWebsiteURL()+",網(wǎng)站縮略圖:"+s.getWebsiteImage()+",賬號(hào)描述:"+s.getAccountDescription());
//關(guān)閉session
// }
session.close();
}
}
}
這里的代碼邏輯用講么?如果是有學(xué)過java基礎(chǔ)和java高級(jí)編程的,應(yīng)該代碼邏輯都是能看懂得。
這里可以推薦看看我發(fā)的學(xué)習(xí)記錄,基本上有看完,都是可以理解的。
輸出結(jié)果如下圖:
與數(shù)據(jù)庫中寫入的完全一致,若是出現(xiàn)NUll值,可能就是pojo類編寫不正確,沒有字段名和變量名一直,其次可能是映射類型不對(duì)等,認(rèn)真往上翻看看嗷。
PS:關(guān)于findAll的sql映射語句需要自己在PasswordMSMapper.xml中編寫完成嗷
Mybatis的工作原理:
*
? MyBatis框架在操作數(shù)據(jù)庫時(shí),大體經(jīng)過了8個(gè)步驟。下面結(jié)合MyBatis工作原理圖對(duì)每一步流程進(jìn)行詳細(xì)講解,具體如下。
(1)MyBatis讀取核心配置文件mybatis-config.xml:mybatis-config.xml核心配置文件主要配置了MyBatis的運(yùn)行環(huán)境等信息。
(2)加載映射文件Mapper.xml:Mapper.xml文件即SQL映射文件,該文件配置了操作數(shù)據(jù)庫的SQL語句,需要在mybatis-config.xml中加載才能執(zhí)行。
(3)構(gòu)造會(huì)話工廠:通過MyBatis的環(huán)境等配置信息構(gòu)建會(huì)話工廠SqlSessionFactory,用于創(chuàng)建SqlSession。
(4)創(chuàng)建會(huì)話對(duì)象:由會(huì)話工廠SqlSessionFactory創(chuàng)建SqlSession對(duì)象,該對(duì)象中包含了執(zhí)行SQL語句的所有方法。
(5)創(chuàng)建執(zhí)行器:會(huì)話對(duì)象本身不能直接操作數(shù)據(jù)庫,MyBatis底層定義了一個(gè)Executor接口用于操作數(shù)據(jù)庫,執(zhí)行器會(huì)根據(jù)SqlSession傳遞的參數(shù)動(dòng)態(tài)的生成需要執(zhí)行的SQL語句,同時(shí)負(fù)責(zé)查詢緩存地維護(hù)。
(6)封裝SQL信息:SqlSession內(nèi)部通過執(zhí)行器Executor操作數(shù)據(jù)庫,執(zhí)行器將待處理的SQL信息封裝到MappedStatement對(duì)象中。
(7)操作數(shù)據(jù)庫:根據(jù)動(dòng)態(tài)生成的SQL操作數(shù)據(jù)庫。
(8)輸出結(jié)果映射:執(zhí)行SQL語句之后,通過MappedStatement對(duì)象將輸出結(jié)果映射至Java對(duì)象中。
總結(jié)
? 這是第一天對(duì)SSM框架的學(xué)習(xí),先初識(shí)Mybatis,了解什么是半自動(dòng)化持久層框架、映射、pojo、連接池連接數(shù)據(jù)源等。想要跟著學(xué)習(xí)的可以去我的資源里面找對(duì)應(yīng)的文件下載,我的md文件也會(huì)發(fā)上去,項(xiàng)目文件會(huì)上傳可以自己跟著學(xué)習(xí)一下。上面的只是簡(jiǎn)單的倆個(gè)查詢的例子,可以自己完善一下增刪改查的實(shí)例。
作者:Stevedash文章來源:http://www.zghlxwxcb.cn/news/detail-661791.html
發(fā)表于:2023年8月20日 21點(diǎn)45分文章來源地址http://www.zghlxwxcb.cn/news/detail-661791.html
注:本文內(nèi)容基于個(gè)人學(xué)習(xí)理解,如有錯(cuò)誤或疏漏,歡迎指正。感謝閱讀!如果覺得有幫助,請(qǐng)點(diǎn)贊和分享。
到了這里,關(guān)于SSM框架的學(xué)習(xí)與應(yīng)用(Spring + Spring MVC + MyBatis)-Java EE企業(yè)級(jí)應(yīng)用開發(fā)學(xué)習(xí)記錄(第一天)Mybatis的學(xué)習(xí)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!