將 MyBatis 與 Spring 進行整合,主要解決的問題就是將 SqlSessionFactory 對象交由 Spring 來管理。所以,該整合,只需要將 SqlSessionFactory 的對象生成器 SqlSessionFactoryBean 注冊在 Spring 容器中,再將其注入給 Dao 的實現類即可完成整合。
實現 Spring 與 MyBatis 的整合常用的方式:掃描的 Mapper 動態代理
無論哪種實現方式,均需要首先完成 Jar 包的導入。
● mybatis 的 Jar 包
● Spring 的 Jar 包
● mybatis 與 Spring 整合 Jar 包
該 Jar 包需要從 mybatis 官網下載。登錄 MyBatis 的下載官網,下載地址:https://github.com/mybatis/spring/releases
下載后使用:
● 其它 Jar 包
程序需要使用 JUnit 進行測試,所以導入 JUnit 的 Jar 包。
連接 mysql 數據庫,所以導入 mysql 驅動 Jar 包。
連接數據庫使用 Druid 連接池和 DBCP 連接池,所以導入 Druid 和 DBCP 的 jar 包。
● 所有的 jar
在 Dao 接口的包中創建 MyBatis 的映射文件 mapper,命名與接口名相同,本例為StudentDao.xml。mapper 中的 namespace 取值也為 Dao 接口的全限定性名。
接口定義:
實現類定義:
在 src 下定義 MyBatis 的主配置文件,命名為 mybatis.xml。
這里有兩點需要注意:
● 主配置文件中不再需要數據源的配置了。因為數據源要交給 Spring 容器來管理了。
● 這里對 mapper 映射文件的注冊,使用標簽,即只需給出 mapper 映射文件所在的包即可。因為 mapper 的名稱與 Dao 接口名相同,可以使用這種簡單注冊方式。這種方式的好處是,若有多個映射文件,這里的配置也是不用改變的。當然,也可使用原來的 標簽方式。
使用 JDBC 模板,首先需要配置好數據源,數據源直接以 Bean 的形式配置在 Spring 配置文件中。根據數據源的不同,其配置方式不同。下面主要講解二種常用數據源的配置方式:
● DBCP 數據源
● Druid 數據源
A、DBCP 數據源 BasicDataSource
DBCP,DataBase Connection Pool,是 apache 下的項目.
官網:http://commons.apache.org/proper/commons-dbcp/
使用該數據源,需要導入兩個 Jar 包:dbcp , commons-pool2
依賴的 commons-pool2 的下載地址:http://commons.apache.org/proper/commons-pool/download_pool.cgi
DBCP 數據源是 BasicDataSource,Ctrl + O 查看其類結構可看到,其有 driverClassName、url、username、password 四個 DB 連接屬性。
B、Druid 數據源 DruidDataSource
Druid 是阿里的開源數據庫連接池。 是 Java 語言中最好的數據庫連接池。Druid能夠提供強大的監控和擴展功能。Druid 與其他數據庫連接池的最大區別是提供數據庫的監控功能。
官網:https://github.com/alibaba/druid
使用地址:https://github.com/alibaba/druid/wiki/常見問題
配置數據庫監控:
配置連接池:
Spring配置文件:
為了便于維護,可以將數據庫連接信息寫入到屬性文件中,使 Spring 配置文件從中讀取數據。
屬性文件名稱隨意,但一般都是放在 src 下。
Spring 配置文件從屬性文件中讀取數據時,需要在的 value 屬性中使用${ },將在屬性文件中定義的 key 括起來,以引用指定屬性的值。
該屬性文件若要被 Spring 配置文件讀取,其必須在配置文件中進行注冊。使用 標簽。
<context:property-placeholder/>方式
該方式要求在 Spring 配置文件頭部加入 spring-context.xsd 約束文件
標簽中有一個屬性 location,用于指定屬性文件的位置。
Mapper 掃描配置器 MapperScannerConfigurer 會自動生成指定的基本包中 mapper 的代理對象。該 Bean 無需設置 id 屬性。
向 Service 注入 Mapper 代理對象時需要注意,由于通過 Mapper 掃描配置器MapperScannerConfigurer 生成的 Mapper 代理對象沒有名稱,所以在向 Service 注入 Mapper代理時,無法通過名稱注入。但可通過接口的簡單類名注入,因為生成的是這個 Dao 接口的對象。