mybatis依賴_這大概就是公司一直用Mybatis的原因!真的太強了

01 什么是MyBatis、Spring?MyBatis是什么?

它是一個SQL Mapping框架,它是一個持久化技術框架。再說得簡單一點,它只不過是一個操作數據庫的框架。Spring是什么?Spring就是一個大容器,不管是IoC還是AOP,都是以Spring容器為基礎的,因此,Spring不管整合什么框架,其關鍵都是利用Spring容器來管理其他框架的核心組件。那么MyBatis編程的核心組件是什么?就是以下三個

  • SqlSessionFactory
  • Mapper組件
  • SqlSession

02 Java EE應用后端各層組件

此外,Java EE應用的后端大致可分為如圖所示的幾層。

24c16223169e659473cba3947058ee26.png

Java EE應用后端分層

Java EE應用后端各層組件的大致功能如下。

DAO(Data Access Object)層:本層組件主要負責操作數據庫,因此各種持久化技術(如MyBatis、JPA等)、索引技術(如Lucene、Solr等)主要集中在該層。

Service層:本層組件主要負責業務邏輯實現,該層組件向下依賴于DAO層的持久化功能,向上對控制器組件提供服務。

控制器層:本層組件主要負責分發、處理請求,該層組件向下依賴于Service層的業務邏輯功能。控制器組件既可對外提供RESTful API接口,也可直接與視圖技術結合生成Web頁面。

Spring框架是一個大容器,它的作用就是負責創建并管理容器中的所有DAO組件、Service組件、控制器組件等,并負責將DAO組件注入Service組件,將Service組件注入控制器組件。

MyBatis實現DAO組件的方式有兩種

  • 傳統的基于SqlSession實現DAO組件。
  • 使用Mapper組件充當DAO組件。

不管采用哪種方式,在整合Spring之后都會將DAO組件納入Spring容器管理之下,并為DAO組件注入它所依賴的資源。比如基于SqlSession的DAO組件需要依賴SqlSession,而Mapper組件則需要依賴SqlSessionFactory—Spring會負責將SqlSessionFactory或SqlSession注入DAO組件。

此外,既然DAO組件和Service組件都在Spring容器管理之下,那么Spring容器也會將DAO組件注入Service組件。

歸納起來,在MyBatis整合Spring之后,Spring可為MyBatis完成如下事情。

  • Spring容器負責管理SqlSessionFactory。
  • Spring容器負責創建、管理Mapper組件或DAO組件。
  • Spring容器負責將Mapper組件或DAO組件注入Service組件。
  • Spring容器負責為Mapper組件或DAO組件注入所依賴的SqlSessionFactory或SqlSession。
  • Spring的AOP機制還可負責管理Service層的事務。

03 快速入門Spring與MyBatis的整合示例

在開始整合之前,需要先下載MyBatis與Spring整合的插件,該插件由MyBatis團隊提供(不是由Spring提供的,MyBatis官網提供了一個MyBatis-Spring項目,該項目用于支持MyBatis與Spring的整合。

登錄 鏈接9 站點下載MyBatis-Spring的最新版本,不要下載1.x系列的最新版本(1.x支持Spring 3.2及以上版本和Java 1.6及以上版本),要下載2.x系列(2.x支持Spring 5.0及以上版本和Java 1.8及以上版本),本書下載的是MyBatis-Spring 2.0.2,下載完成后得到一個mybatis-spring-2.0.2.jar文件,它就是MyBatis整合Spring的插件JAR包。

此外,既然要讓Spring整合MyBatis,那么當然還需要為項目添加Spring的21個JAR包,以及MyBatis的核心JAR包:mybatis-3.5.2.jar。

接下來按照前面介紹的方式開發Mapper組件:Mapper接口+XML Mapper(或注解)。下面是Mapper接口的代碼。

public interface BookMapper
{int saveBook(Book book);Book getBook(int id);
}

該Mapper組件對應的XML Mapper映射文件如下。

<?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 namespace="org.crazyit.app.dao.BookMapper"><insert id="saveBook">insert into book_inf values(null, #{title}, #{author}, #{price})</insert><select id="getBook" resultType="book">select book_id id, book_title title, book_author author,book_price price from book_inf where book_id=#{id}</select>
</mapper>

為了更好地模擬Java EE應用的架構,本示例也為應用提供了Service組件(接口+實現類)。下面是BookService接口的代碼。

public interface BookService
{int saveBook(Book book);Book getBook(int id);
}

可能有讀者感到疑惑:該Service組件內定義的兩個方法與DAO組件內定義的兩個方法是完全相同的嗎?此時確實是這樣的,這是由于本例只是一個演示技術的示例,它不涉及業務邏輯。

對于實際項目而言,Service組件的每個方法應該負責處理、實現一個業務邏輯功能,這個業務邏輯功能通常需要組合調用多個DAO組件的方法—具體來說,比如實現一個轉賬邏輯,該Service方法要調用DAO組件修改轉出賬戶的余額,還要修改轉入賬戶的余額,還要調用DAO組件插入一條轉賬記錄。

總之,實現一個業務邏輯方法,通常需要按順序調用多個DAO組件的方法。

本示例的Service組件很簡單,它不涉及任何業務功能,因此它的每個方法只要調用一次DAO組件的方法即可。下面是該Service組件的實現類。

public class BookServiceImpl implements BookService
{private BookMapper bookMapper;//依賴注入Mapper組件所需的setter方法public void setBookMapper(BookMapper bookMapper){this.bookMapper = bookMapper;}@Overridepublic int saveBook(Book book) {return bookMapper.saveBook(book);}@Overridepublic Book getBook(int id) {return bookMapper.getBook(id);}
}

該Service組件定義了BookMapper變量代表它所依賴的DAO組件。為了讓Spring容器為Service組件注入它所依賴的DAO組件,程序還為該DAO組件提供了setter方法—如果Service組件需要調用多個DAO組件的方法,就為每個DAO組件都定義對應的成員變量,并提供setter方法即可。至此,本示例的Mapper組件(DAO組件)和Service組件都已開發完成。

接下來需要將它們配置在Spring容器中,并讓Spring容器來管理它們之間的依賴關系。下面是本示例的Spring配置文件。

<?xml version="1.0" encoding="utf-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 定義數據源Bean,使用C3P0數據源實現 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close"
p:driverClass="com.mysql.cj.jdbc.Driver"
p:jdbcUrl="jdbc:mysql://localhost:3306/spring?serverTimezone=UTC"
p:user="root"
p:password="32147"/>
<!-- 配置MyBatis的核心組件:SqlSessionFactory,并為該SqlSessionFactory配置它依賴的DataSource,還指定將類加載路徑下的mybatis-config.xml文件作為MyBatis的核心配置文件 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
p:dataSource-ref="dataSource"
p:configLocation="classpath:mybatis-config.xml"/>
<!-- 使用MapperFactoryBean工廠Bean配置Mapper組件,并為該Mapper組件配置它所依賴的SqlSessionFactory -->
<bean id="bookMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"
p:mapperInterface="org.crazyit.app.dao.BookMapper"
p:sqlSessionFactory-ref="sqlSessionFactory"/>
<!-- 配置Service組件,并為該Service組件配置它所依賴的Mapper組件 -->
<bean id="bookService" class="org.crazyit.app.service.impl.BookServiceImpl"
p:bookMapper-ref="bookMapper"/>
</beans>

上面配置文件中一共配置了4個Bean,其中第一個Bean是一個基于C3P0的數據源Bean,這與前面配置的數據源Bean并沒有任何區別。

第二個Bean是SqlSessionFactoryBean,它是一個工廠Bean,它負責配置MyBatis的核心組件:SqlSessionFactory。

配置SqlSessionFactory為它注入了兩個屬性:dataSource和configLocation,其中configLocation指定MyBatis的核心配置文件,本示例指定使用類加載路徑下的mybatis-config.xml作為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>
<typeAliases>
<!-- 為org.crazyit.app.domain包下的所有類指定別名 -->
<package name="org.crazyit.app.domain"/>
</typeAliases>
</configuration>

將該配置文件與MyBatis獨立應用的mybatis-config.xml進行對比,可以看到該文件主要少了兩個元素:<environments.../>和<mappers.../>—這是由于Spring已為SqlSessionFactory注入了dataSource(數據源),不再需要配置數據源環境。另外,Spring容器接管了Mapper組件的發現、注冊,也就不需要在mybatis-config.xml文件中配置<mappers.../>元素了。

Spring配置文件中的第三個Bean是Mapper組件(DAO組件),此處使用MapperFactoryBean來配置Mapper組件—所有的Mapper組件都使用該工廠Bean配置,程序獲取該Bean時,實際返回的只是該工廠Bean的產品。

在使用MapperFactoryBean工廠Bean配置Mapper組件時,需要通過mapperInterface指定該Mapper組件的接口,并通過sqlSessionFactory屬性為Mapper組件注入它所依賴的SqlSessionFactory。

Spring配置文件中的第四個Bean是Service組件,它已經沒有任何特別之處了,就是簡單地配置該Service組件,并為它注入所依賴的Mapper組件。

接下來,主程序即可獲取Spring容器中配置的Service組件,并調用它的業務方法。

上面程序通過Spring容器獲取了Service組件,并調用了Service組件的方法—Service組件依賴于DAO組件(Mapper組件),而Mapper組件則由MyBatis實現,該程序運行完成后將會看到book_inf表多了一條記錄,并看到程序顯示了id為1的Book實體的title、price,這說明Spring與MyBatis整合成功。

public class SpringTest {
public static void main(String[] args) throws Exception {var ctx = new ClassPathXmlApplicationContext("beans.xml");// 獲取容器中的Service組件var bookService = ctx.getBean("bookService", BookService.class);// 調用Service組件的方法bookService.saveBook(new Book(null, "瘋狂Java講義", "李剛", 109.0));var b = bookService.getBook(1);System.out.println(b.getTitle() + "-->" + b.getPrice());}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/529165.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/529165.shtml
英文地址,請注明出處:http://en.pswp.cn/news/529165.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

php excelreader 中文,如何解決php excel reader導出excel中文亂碼?

解決php excel reader導出excel中文亂碼的方法&#xff1a;1、如果不使用dump函數&#xff0c;可以通過修改【_defaultEncoding】變量解決問題&#xff1b;2、如果使用dump函數導出excel&#xff0c;需要修改htmlentities函數解決。解決php excel reader導出excel中文亂碼的方法…

python畫同心圓程序_Python Turtle:使用circle()方法繪制同心圓

I am not at this point interested in an efficient way of producing concentric circles: I want to see what I have to do to get this way to work 為了解決OP的問題&#xff0c;對其原始代碼進行更改以使其正常工作是很簡單的&#xff1a;turtle_pos(trl, [trl.xcor() …

繞過寶塔禁止的php函數,寶塔disable functions函數全被禁命令執行+加域服務器如何無限制執行命令...

本地搭建實驗環境時遇到了不少小問題實驗環境2008 R2寶塔搭建的IIS discuz3.2X手動上傳shell冰蝎連接(ps:有表哥使用冰蝎的時候提示文件存在但是無法獲取密鑰&#xff0c;解決辦法&#xff0c;使用最新版本的冰蝎即可&#xff0c;具體詳情看更新日志)連接上shell發現無法執行命…

anaconda和python區別_初學 Python 者自學 Anaconda 的正確姿勢是什么?

事實上Anaconda 和 Jupyter notebook已成為數據分析的標準環境。 簡單來說&#xff0c;Anaconda是包管理器和環境管理器&#xff0c;Jupyter notebook 可以將數據分析的代碼、圖像和文檔全部組合到一個web文檔中。 接下來我詳細介紹下Anaconda&#xff0c;并在最后給出Jupyter …

oracle rman備份整庫,RMAN備份恢復整個庫

RMAN備份恢復整個庫1 查看歷史備份集$ rman target /RMAN> list backup;說明與資料檔案庫中的任何備份都不匹配上述結果說明之前沒有備份過2 備份整個庫RMAN> backup database;啟動 backup 于 21-3月 -15使用通道 ORA_DISK_1通道 ORA_DISK_1: 正在啟動全部數據文件備份集…

oracle 24756,關于ORA-24756: transaction does not exist的問題

最近在檢查一個數據庫時&#xff0c;發現跟蹤日志有大量的錯誤( ORA-24756: transaction does not exist)1、主機系統環境IBM P740#oslevel -s6100-06-05-11152、數據庫版本11.2.0.3 RAC ASM兩節點3、在數據庫跟蹤日志中出現大量錯誤。(alert文件太大無法上傳&#xff0c;幾乎…

python 函數 全局變量_python3函數內全局變量使用global

原博文 2017-08-16 23:08 ?def p_num(): global num num 10 print (num) num 5 p_num() print(num) ... 相關推薦 2019-12-11 15:55 ? 如果需要在函數內部改變函數外部的變量&#xff0c;就可以通過在函數內部聲明變量為global變量。這樣當程序運行至global變量便會替換外部…

java 切面_Java筆試面試精心整理得到89道Spring 核心知識【收藏向】

點擊上方"藍字"&#xff0c;關注了解更多Spring Framework 簡稱 Spring&#xff0c;是 Java 開發中最常用的框架&#xff0c;地位僅次于 Java API&#xff0c;就連近幾年比較流行的微服務框架 SpringBoot&#xff0c;也是基于 Spring 實現的&#xff0c;SpringBoot 的…

安裝oracle 10g閃退,Windows 7安裝Oracle 10g常見錯誤及解決方法

Windows 7安裝Oracle 10g常見錯誤及解決方法在安裝之前&#xff0c;我們要先下載相應的版本。點擊&#xff1a;Oracle 10g支持Win7版錯誤A&#xff1a;正在檢查操作系統要求...要求的結果: 5.0,5.1,5.2,6.0 之一實際結果: 6.1檢查完成。此次檢查的總體結果為: 失敗 <<<…

python爬取百度文庫_利用Python語言輕松爬取數據

利用 Python 語言輕松爬取數據 對于小白來說&#xff0c;爬蟲可能是一件非常復雜、 技術門檻很高的事情。 比如有人認為學爬蟲必須精通 Python &#xff0c;然后哼哧哼哧系統學習 Python 的每個知識點&#xff0c;很久之后發現仍然爬不了數據&#xff1b;有的人則認為先要掌握 …

切比雪夫不等式例題講解_排序不等式,切比雪夫不等式及伯努利不等式

我們比較熟悉的不等式可能就是下面的這個不等式鏈以及柯西不等式了&#xff1a;對于不等式鏈的證明我們可以看下面這張圖&#xff0c;非常直觀形象&#xff1a;不太懂得也可以看這個視頻講解&#xff1a;知乎視頻?www.zhihu.com對于柯西不等式的證明及講解&#xff0c;我們之前…

任務計劃命令 linux,linux執行一次性任務計劃at命令

at跟crontab一樣&#xff0c;都是執行定時計劃任務的命令。但不同的是&#xff0c;crontab執行的循環的任務&#xff0c;而at執行的是一次性任務&#xff0c;任務執行完以后便失效。設置任務&#xff1a;at now 1 week -f a.sh #a.sh必須已存在at 01:35 < my-at-jobs.…

linux邏輯文件塊,linux邏輯卷組創建以及修改

創建邏輯卷組&#xff1a;一、將擴展的硬盤分區新加一塊SCSI硬盤&#xff0c;需要將其分成三個區&#xff1a;代碼:#fdisk /dev/sdb進入fdisk模式&#xff1a;Command (m for help):p //查看新硬盤的分區Command (m for help):n //創建新分區可以用m命令來看fdisk命令的內部命…

經濟學原理 下載 曼昆_2021南開經濟學考研全年規劃

先介紹一下本文的作者&#xff0c;本人本科來自于某雙非財經類院校&#xff0c;于2019年考入南開大學某應用經濟學專業&#xff0c;在2019年考研初始專業課826經濟學基礎&#xff08;也就是20年的823&#xff09;中拿到了138分的成績&#xff0c;自認為對專業課的復習有一定心得…

linux系統進程控制實驗報告,Linux進程控制實驗報告.doc

里奴性進程控制實驗報告實驗名稱: Linux進程控制實驗要求:一.編寫一個Linux系統C程序&#xff0c;由父親創建2個子進程&#xff0c;再由子進程各自從控制臺接收一串字符串&#xff0c;保存在各自的全局字符串變量中&#xff0c;然后正常結束。父進程調用waitpid等待子進程結束&…

excel中如何對矩陣得對角線進行求和_如何利用圖卷積網絡進行圖形深度學習(第2部分)...

圖上的機器學習是一項艱巨的任務&#xff0c;由于高度復雜但信息量豐富&#xff0c;本文是關于如何利用圖卷積網絡(GCN)進行深度學習的系列文章中的第二篇。我將簡要回顧一下上一篇文章&#xff1a;圖形卷積網絡的高級介紹具有譜圖卷積的半監督學習(本文)簡要回顧一下在上一篇關…

linux內存不足+段錯誤,在linux下代碼運行出現段錯誤,求大神

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓#include#include#include #include#include#define PATH1 "/proc/meminfo"#define PATH2 "/proc/cpuinfo"#define PATH3 "/proc/version"#define PATH4 "/proc/bus/usb/devices"struct M…

linux 開放5222端口,ejabberd 安裝配置

ejabberdejabberd是基于Jabber/XMPP協議的即時通訊服務器&#xff0c;由GPLv2授權(免費和開放源碼)&#xff0c;采用Erlang/OTP開發。它的特點是&#xff0c;跨平臺&#xff0c;容錯&#xff0c;集群和模塊化。ejabberd安裝&#xff1a;1. 下載安裝包&#xff1a;2.給權限&…

docker查找鏡像_5 款非常好用的開源 Docker 工具,get一波~

本文同步Java知音社區&#xff0c;專注于Java作者&#xff1a;Shekhar Gulatihttp://dzone.com/articles/5-docker-utilities-you-should-know導讀Docker 社區已經創建了許多開源工具&#xff0c;它們能幫我們處理各種用例。作者在本文中推薦了 5 款認為最有用的 Docker 工具&a…

linux date輸出到文件,Linux常用命令--ls、cd、date用法

[rootxuelinux ~]# ls -l /etc總用量 1776drwxr-xr-x. 3 root root 4096 8月 20 01:40 abrtdrwxr-xr-x. 4 root root 4096 8月 20 01:44 acpi-rw-r--r--. 1 root root 46 9月 30 01:31 adjtime-rw-r--r--. 1 root root 1512 1月 12 2010 aliaseslrwxrwxrwx. …