mybatis依赖_这大概就是公司一直用Mybatis的原因!真的太强了
01 什么是MyBatis、Spring?MyBatis是什么?
它是一個(gè)SQL Mapping框架,它是一個(gè)持久化技術(shù)框架。再說得簡單一點(diǎn),它只不過是一個(gè)操作數(shù)據(jù)庫的框架。Spring是什么?Spring就是一個(gè)大容器,不管是IoC還是AOP,都是以Spring容器為基礎(chǔ)的,因此,Spring不管整合什么框架,其關(guān)鍵都是利用Spring容器來管理其他框架的核心組件。那么MyBatis編程的核心組件是什么?就是以下三個(gè):
- SqlSessionFactory
- Mapper組件
- SqlSession
02 Java EE應(yīng)用后端各層組件
此外,Java EE應(yīng)用的后端大致可分為如圖所示的幾層。
Java EE應(yīng)用后端分層
Java EE應(yīng)用后端各層組件的大致功能如下。
DAO(Data Access Object)層:本層組件主要負(fù)責(zé)操作數(shù)據(jù)庫,因此各種持久化技術(shù)(如MyBatis、JPA等)、索引技術(shù)(如Lucene、Solr等)主要集中在該層。
Service層:本層組件主要負(fù)責(zé)業(yè)務(wù)邏輯實(shí)現(xiàn),該層組件向下依賴于DAO層的持久化功能,向上對控制器組件提供服務(wù)。
控制器層:本層組件主要負(fù)責(zé)分發(fā)、處理請求,該層組件向下依賴于Service層的業(yè)務(wù)邏輯功能??刂破鹘M件既可對外提供RESTful API接口,也可直接與視圖技術(shù)結(jié)合生成Web頁面。
Spring框架是一個(gè)大容器,它的作用就是負(fù)責(zé)創(chuàng)建并管理容器中的所有DAO組件、Service組件、控制器組件等,并負(fù)責(zé)將DAO組件注入Service組件,將Service組件注入控制器組件。
MyBatis實(shí)現(xiàn)DAO組件的方式有兩種:
- 傳統(tǒng)的基于SqlSession實(shí)現(xiàn)DAO組件。
- 使用Mapper組件充當(dāng)DAO組件。
不管采用哪種方式,在整合Spring之后都會將DAO組件納入Spring容器管理之下,并為DAO組件注入它所依賴的資源。比如基于SqlSession的DAO組件需要依賴SqlSession,而Mapper組件則需要依賴SqlSessionFactory—Spring會負(fù)責(zé)將SqlSessionFactory或SqlSession注入DAO組件。
此外,既然DAO組件和Service組件都在Spring容器管理之下,那么Spring容器也會將DAO組件注入Service組件。
歸納起來,在MyBatis整合Spring之后,Spring可為MyBatis完成如下事情。
- Spring容器負(fù)責(zé)管理SqlSessionFactory。
- Spring容器負(fù)責(zé)創(chuàng)建、管理Mapper組件或DAO組件。
- Spring容器負(fù)責(zé)將Mapper組件或DAO組件注入Service組件。
- Spring容器負(fù)責(zé)為Mapper組件或DAO組件注入所依賴的SqlSessionFactory或SqlSession。
- Spring的AOP機(jī)制還可負(fù)責(zé)管理Service層的事務(wù)。
03 快速入門Spring與MyBatis的整合示例
在開始整合之前,需要先下載MyBatis與Spring整合的插件,該插件由MyBatis團(tuán)隊(duì)提供(不是由Spring提供的,MyBatis官網(wǎng)提供了一個(gè)MyBatis-Spring項(xiàng)目,該項(xiàng)目用于支持MyBatis與Spring的整合。
登錄 鏈接9 站點(diǎn)下載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,下載完成后得到一個(gè)mybatis-spring-2.0.2.jar文件,它就是MyBatis整合Spring的插件JAR包。
此外,既然要讓Spring整合MyBatis,那么當(dāng)然還需要為項(xiàng)目添加Spring的21個(gè)JAR包,以及MyBatis的核心JAR包:mybatis-3.5.2.jar。
接下來按照前面介紹的方式開發(fā)Mapper組件:Mapper接口+XML Mapper(或注解)。下面是Mapper接口的代碼。
public interface BookMapper {int saveBook(Book book);Book getBook(int id); }該Mapper組件對應(yīng)的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應(yīng)用的架構(gòu),本示例也為應(yīng)用提供了Service組件(接口+實(shí)現(xiàn)類)。下面是BookService接口的代碼。
public interface BookService {int saveBook(Book book);Book getBook(int id); }可能有讀者感到疑惑:該Service組件內(nèi)定義的兩個(gè)方法與DAO組件內(nèi)定義的兩個(gè)方法是完全相同的嗎?此時(shí)確實(shí)是這樣的,這是由于本例只是一個(gè)演示技術(shù)的示例,它不涉及業(yè)務(wù)邏輯。
對于實(shí)際項(xiàng)目而言,Service組件的每個(gè)方法應(yīng)該負(fù)責(zé)處理、實(shí)現(xiàn)一個(gè)業(yè)務(wù)邏輯功能,這個(gè)業(yè)務(wù)邏輯功能通常需要組合調(diào)用多個(gè)DAO組件的方法—具體來說,比如實(shí)現(xiàn)一個(gè)轉(zhuǎn)賬邏輯,該Service方法要調(diào)用DAO組件修改轉(zhuǎn)出賬戶的余額,還要修改轉(zhuǎn)入賬戶的余額,還要調(diào)用DAO組件插入一條轉(zhuǎn)賬記錄。
總之,實(shí)現(xiàn)一個(gè)業(yè)務(wù)邏輯方法,通常需要按順序調(diào)用多個(gè)DAO組件的方法。
本示例的Service組件很簡單,它不涉及任何業(yè)務(wù)功能,因此它的每個(gè)方法只要調(diào)用一次DAO組件的方法即可。下面是該Service組件的實(shí)現(xiàn)類。
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組件需要調(diào)用多個(gè)DAO組件的方法,就為每個(gè)DAO組件都定義對應(yīng)的成員變量,并提供setter方法即可。至此,本示例的Mapper組件(DAO組件)和Service組件都已開發(fā)完成。
接下來需要將它們配置在Spring容器中,并讓Spring容器來管理它們之間的依賴關(guān)系。下面是本示例的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"> <!-- 定義數(shù)據(jù)源Bean,使用C3P0數(shù)據(jù)源實(shí)現(xiàn) --> <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個(gè)Bean,其中第一個(gè)Bean是一個(gè)基于C3P0的數(shù)據(jù)源Bean,這與前面配置的數(shù)據(jù)源Bean并沒有任何區(qū)別。
第二個(gè)Bean是SqlSessionFactoryBean,它是一個(gè)工廠Bean,它負(fù)責(zé)配置MyBatis的核心組件:SqlSessionFactory。
配置SqlSessionFactory為它注入了兩個(gè)屬性: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獨(dú)立應(yīng)用的mybatis-config.xml進(jìn)行對比,可以看到該文件主要少了兩個(gè)元素:<environments.../>和<mappers.../>—這是由于Spring已為SqlSessionFactory注入了dataSource(數(shù)據(jù)源),不再需要配置數(shù)據(jù)源環(huán)境。另外,Spring容器接管了Mapper組件的發(fā)現(xiàn)、注冊,也就不需要在mybatis-config.xml文件中配置<mappers.../>元素了。
Spring配置文件中的第三個(gè)Bean是Mapper組件(DAO組件),此處使用MapperFactoryBean來配置Mapper組件—所有的Mapper組件都使用該工廠Bean配置,程序獲取該Bean時(shí),實(shí)際返回的只是該工廠Bean的產(chǎn)品。
在使用MapperFactoryBean工廠Bean配置Mapper組件時(shí),需要通過mapperInterface指定該Mapper組件的接口,并通過sqlSessionFactory屬性為Mapper組件注入它所依賴的SqlSessionFactory。
Spring配置文件中的第四個(gè)Bean是Service組件,它已經(jīng)沒有任何特別之處了,就是簡單地配置該Service組件,并為它注入所依賴的Mapper組件。
接下來,主程序即可獲取Spring容器中配置的Service組件,并調(diào)用它的業(yè)務(wù)方法。
上面程序通過Spring容器獲取了Service組件,并調(diào)用了Service組件的方法—Service組件依賴于DAO組件(Mapper組件),而Mapper組件則由MyBatis實(shí)現(xiàn),該程序運(yùn)行完成后將會看到book_inf表多了一條記錄,并看到程序顯示了id為1的Book實(shí)體的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);// 調(diào)用Service組件的方法bookService.saveBook(new Book(null, "瘋狂Java講義", "李剛", 109.0));var b = bookService.getBook(1);System.out.println(b.getTitle() + "-->" + b.getPrice());} }總結(jié)
以上是生活随笔為你收集整理的mybatis依赖_这大概就是公司一直用Mybatis的原因!真的太强了的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: a*算法matlab代码_NSGAII多
- 下一篇: python怎么测试c代码_如何正确测试