亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

MyBatis 與 Spring 的完美整合方法

2024-07-14 08:40:19
字體:
來源:轉載
供稿:網友

mybatis,spring,整合

MyBatis—Spring 項目

目前大部分的 Java 互聯網項目,都是用 Spring MVC + Spring + MyBatis 搭建平臺的。

使用 Spring IoC 可以有效的管理各類的 Java 資源,達到即插即拔的功能;通過 Spring AOP 框架,數據庫事務可以委托給 Spring 管理,消除很大一部分的事務代碼,配合 MyBatis 的高靈活、可配置、可優化 SQL 等特性,完全可以構建高性能的大型網站。

毫無疑問,MyBatis 和 Spring 兩大框架已經成了 Java 互聯網技術主流框架組合,它們經受住了大數據量和大批量請求的考驗,在互聯網系統中得到了廣泛的應用。使用 MyBatis-Spring 使得業務層和模型層得到了更好的分離,與此同時,在 Spring 環境中使用 MyBatis 也更加簡單,節省了不少代碼,甚至可以不用 SqlSessionFactory、 SqlSession 等對象,因為 MyBatis-Spring 為我們封裝了它們。

摘自:《Java EE 互聯網輕量級框架整合開發》

第一步:創建測試工程

第一步,首先在 IDEA 中新建一個名為【MybatisAndSpring】的 WebProject 工程:

mybatis,spring,整合

然后在【src】中創建 4 個空包:

  • cn.wmyskxz.dao(放置 DAO 數據交互層處理類)
  • cn.wmyskxz.mapper(放置 Mapper 代理接口)
  • cn.wmyskxz.pojo(放置 Java 實體類)
  • cn.wmyskxz.test(放置測試類)

接著新建源文件夾【config】,用于放置各種資源配置文件:

  • 在【config / mybatis】下創建一個空的名為 “SqlMapConfig.xml” 的 MyBatis 全局配置文件在【config / spring】下創建一個空的名為 “applicationContext.xml” 的 Spring 資源配置文件
  • 在【config / sqlmap】下創建一個空的名為 “UserMapper.xml” 的 Mapper 映射文件。
  • 在【config】下創建兩個 properties 屬性文件,分別為 “db.properties” 和 “log4j.properties”,用于數據庫連接和日志系統參數設置。

再在【web】文件夾下新建一個【WEB-INF】默認安全文件夾,并在其下創建一個【classes】和【lib】,并將項目的輸出位置,改在【classes】下:

mybatis,spring,整合

工程的完整初始結構如下:

mybatis,spring,整合

第二步:引入依賴 jar 包

第二步,就是要準備項目的依賴 jar 包:

  • MyBatis 的包(MyBatis 3.4.6)
  • Spring 的 jar 包(Spring 4.3.15)
  • MyBatis 與 Spring 的整合 jar 包(mybatis-spring 1.3.2)
  • mysql-connector-java-5.1.21.
  • jarjunit-4.12.jar

mybatis,spring,整合

在【WEB-INF】文件夾下的【lib】文件夾中放置上面列舉的 jar 包,然后添加依賴。

第三步:編寫 Spring 配置文件

第三步,編寫 Spring 的配置文件:

  • 加載數據庫連接文件 “db.properties” 中的數據,建立數據源
  • 配置 sqlSessionFactory 會話工廠對象
<?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:context="http://www.springframework.org/schema/context"  xsi:schemaLocation="http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans.xsd  http://www.springframework.org/schema/context  http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 加載配置文件 --> <context:property-placeholder location="classpath:db.properties"/> <!-- 配置數據源 --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">  <property name="driverClassName" value="${jdbc.driver}"/>  <property name="url" value="${jdbc.url}"/>  <property name="username" value="${jdbc.username}"/>  <property name="password" value="${jdbc.password}"/> </bean> <!-- sqlSessionFactory --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  <!-- 加載 MyBatis 的配置文件 -->  <property name="configLocation" value="mybatis/SqlMapConfig.xml"/>  <!-- 數據源 -->  <property name="dataSource" ref="dataSource"/> </bean></beans>
  • 頭部的信息就是聲明 xml 文檔配置標簽的規則的限制與規范。
  • “context:property-placeholder” 配置是用于讀取工程中的靜態屬性文件,然后在其他配置中使用時,就可以采用 “${屬性名}” 的方式獲取該屬性文件中的配置參數值。
  • 配置了一個名為 “dataSrouce” 的 bean 的信息,實際上是連接數據庫的數據源。
  • 設置 sqlSessionFactory 的 bean 實現類為 MyBatis 與 Spring 整合 jar 包中的 SqlSessionFactoryBean 類,在其中只需要注入兩個參數:一個是 MyBatis 的全局配置文件,一個是上面配置的數據源 bean

第四步:編寫 MyBatis 配置文件

第四步,在【mybatis】包下編寫 MyBatis 的全局配置文件 SqlMapConfig.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> <!-- settings --> <settings>  <!-- 打開延遲加載的開關 -->  <setting name="lazyLoadingEnabled" value="true"/>  <!-- 將積極加載改為消極加載(即按需加載) -->  <setting name="aggressiveLazyLoading" value="false"/>  <!-- 打開全局緩存開關(二級緩存)默認值就是 true -->  <setting name="cacheEnabled" value="true"/> </settings> <!-- 別名定義 --> <typeAliases>  <package name="cn.wmyskxz.pojo"/> </typeAliases> <!-- 加載映射文件 --> <mappers>  <!-- 通過 resource 方法一次加載一個映射文件 -->  <mapper resource="sqlmap/UserMapper.xml"/>  <!-- 批量加載mapper -->  <package name="cn.wmyskxz.mapper"/> </mappers></configuration>

在該配置文件中:

  • 通過 settings 配置了一些延遲加載和緩存的開關信息在 typeAliases 中設置了一個 package 的別名掃描路徑,
  • 在該路徑下的 Java 實體類都可以擁有一個別名(即首字母小寫的類名)
  • 在 mappers 配置中,使用 mapper 標簽配置了即將要加載的 Mapper 映射文件的資源路徑,當然也可以使用 package 標簽,配置 mapper 代理接口所在的包名,以批量加載 mapper 代理對象。
  • 注意: 有了 Spring 托管數據源,在 MyBatis 配置文件中僅僅需要關注性能化配置。

第五步:編寫 Mapper 以及其他配置文件

第五步,編寫 Mapper 映射文件,這里依然定義 Mapper 映射文件的名字為 “UserMapper.xml” (與 SqlMapConfig.xml 中配置一致),為了測試效果,只配置了一個查詢類 SQL 映射:

<?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="test"> <select id="findUserById" parameterType="_int" resultType="user"> SELECT * FROM USER WHERE id = #{id}</select></mapper>

在該配置中,輸出參數的映射為 “user” ,這是因為之前在 SqlMapConfig.xml 中配置了 “cn.wmyskxz.pojo” 包下的實體類使用別名(即首字母小寫的類名),所以這里只需在 “cn.wmyskxz.pojo” 包下,創建 “finduserById” 對應的 Java 實體類 User:

package cn.wmyskxz.pojo;import java.io.Serializable;public class User implements Serializable { private int id; private String username; /* getter and setter */}

實現 Serializable 接口是為之后使用 Mapper 動態代理做準備,這里沒有使用動態代理。

在數據庫資源 “db.properties” 中配置了數據庫的連接信息,以 “key=value” 的形式配置,String 正是使用 “${}” 獲取其中 key 對應的 value 配置的:

jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=UTF-8jdbc.username=rootjdbc.password=root

另外日志配置和之前的配置一樣,我就直接黏貼了:

# Global logging configuration# 在開發環境下日志級別要設置成 DEBUG ,生產環境設為 INFO 或 ERRORlog4j.rootLogger=DEBUG, stdout# Console output...log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

第六步:編寫 DAO 層

第六步,進行數據庫交互(Data Access Object)層的編寫。

由于該項目只對 User 用戶查詢,所以 DAO 層就只有一個類,在 “cn.wmyskxz” 包下創建 DAO 層的 interface 接口,其中定義了 findUserById 方法,參數為用戶的 id 值(int 類型):

package cn.wmyskxz.dao;import cn.wmyskxz.pojo.User;public interface UserDAO { // 根據 id 查詢用戶信息 public User findUserById(int id) throws Exception;}

然后在同一個包下創建 UserDAO 接口的實現類 UserDAOImpl:

package cn.wmyskxz.dao;import cn.wmyskxz.pojo.User;import org.apache.ibatis.session.SqlSession;import org.mybatis.spring.support.SqlSessionDaoSupport;public class UserDAOImpl extends SqlSessionDaoSupport implements UserDAO { @Override public User findUserById(int id) throws Exception {  // 繼承 SqlSessionDaoSupport 類,通過 this.getSqlSession() 得到 sqlSession  SqlSession sqlSession = this.getSqlSession();  User user = sqlSession.selectOne("test.findUserById", id);  return user; }}

有幾點解釋:

  • UserDAOImpl 不僅實現了 UserDAO 接口,而且繼承了 SqlSessionDaoSupport 類。
  • SqlSessionDaoSupport 類是 MyBatis 與 Spring 整合的 jar 包中提供的,在該類中已經包含了 sqlSessionFactory 對象作為其成員變量,而且對外提供 get 和 set 方法,方便 Spring 從外部注入 sqlSessionFactory 對象。
  • UserDAOImpl 類要成功獲取 sqlSessionFactory 對象,還需要在 Spring 配置文件 applicationContext.xml 中添加 userDAO 的 bean 配置,將其中定義的 sqlSessionFactory 對象當做參數注入進去,這樣 UserDAOImpl 繼承 SqlSessionDaoSupport 類才會起到作用:
<!-- 原始 DAO 接口 --><bean id="userDAO" class="cn.wmyskxz.dao.UserDAOImpl"> <property name="sqlSessionFactory" ref="sqlSessionFactory"/></bean>

注意: DAO 實現類繼承了 SqlSessionDaoSupport 父類后,就無須自己定義獲取 SqlSession 會話實例類方法了,該父類會默認加載數據源信息并提供獲取 SqlSession 類的方法。

第七步:編寫 Service 測試類

在 “cn.wmyskxz.test” 包下創建【UserServiceTest】測試類:

package cn.wmyskxz.test;import cn.wmyskxz.dao.UserDAO;import cn.wmyskxz.pojo.User;import org.junit.Before;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class UserServiceTest { private ApplicationContext applicationContext; // 在執行測試方法之前首先獲取 Spring 配置文件對象 // 注解@Before在執行本類所有測試方法之前先調用這個方法 @Before public void setup() throws Exception {  applicationContext = new    ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml"); } @Test public void testFindUserById() throws Exception {  // 通過配置資源對象獲取 userDAO 對象  UserDAO userDAO = (UserDAO) applicationContext.getBean("userDAO");  // 調用 UserDAO 的方法  User user = userDAO.findUserById(1);  // 輸出用戶信息  System.out.println(user.getId() + ":" + user.getUsername()); }}

運行測試方法,輸出結果如下:

mybatis,spring,整合

動態代理 + 注解實現

上面的實例程序并沒有使用 Mapper 動態代理和注解來完成,下面我們就來試試如何用動態代理和注解:

第一步:編寫 UserQueryMapper

在【mapper】下新建一個【UserQueryMapper】代理接口,并使用注解:

package cn.wmyskxz.mapper;import cn.wmyskxz.pojo.User;import org.apache.ibatis.annotations.Select;public interface UserQueryMapper { @Select("SELECT * FROM USER WHERE id = #{id}") public User findUserById(int id) throws Exception;}

注意: 在默認情況下,該 bean 的名字為 userQueryMapper(即首字母小寫)

現在有了代理類,我們需要通知 Spring 在這里來掃描到該類,Mapper 掃描配置對象需要用專門的掃描器:

<!-- Mapper 掃描器 --><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!-- 掃描 cn.wmyskxz.mapper 包下的組件 --> <property name="basePackage" value="cn.wmyskxz.mapper"/></bean>

第二步:編寫測試類

這一次我們獲取的不再是 userDAO 對象,而是定義的 Mapper 代理對象 userQueryMapper:

package cn.wmyskxz.test;import cn.wmyskxz.mapper.UserQueryMapper;import cn.wmyskxz.pojo.User;import org.junit.Before;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class UserServiceTest { private ApplicationContext applicationContext; // 在執行測試方法之前首先獲取 Spring 配置文件對象 // 注解@Before在執行本類所有測試方法之前先調用這個方法 @Before public void setup() throws Exception {  applicationContext = new    ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml"); } @Test public void testFindUserById() throws Exception {  // 通過配置資源對象獲取 userDAO 對象  UserQueryMapper userQueryMapper = (UserQueryMapper) applicationContext.getBean("userQueryMapper");  // 調用 UserDAO 的方法  User user = userQueryMapper.findUserById(1);  // 輸出用戶信息  System.out.println(user.getId() + ":" + user.getUsername()); }}

運行測試方法,得到正確結果:

mybatis,spring,整合

可以看到,查詢結果和之前非 Mapper 代理的查詢結果一樣。

總結

以上所述是小編給大家介紹的MyBatis 與 Spring 的完美整合方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品露脸自拍| 欧美精品免费看| 国产精品久久久久999| 亚洲小视频在线观看| 亚洲jizzjizz日本少妇| 欧美国产极速在线| 亚洲新声在线观看| 亚洲国产一区二区三区四区| 国产欧美精品一区二区三区-老狼| 亚洲va久久久噜噜噜久久天堂| 91av在线精品| 一区三区二区视频| 欧美老妇交乱视频| 日韩精品在线第一页| 成人免费视频网| 日韩一二三在线视频播| 国产精品激情av电影在线观看| 伊人精品在线观看| 国产亚洲视频中文字幕视频| 91在线高清免费观看| 久久五月情影视| 国产噜噜噜噜久久久久久久久| 亚洲欧洲偷拍精品| 91久久精品国产91性色| 日韩中文字幕精品| 亚洲欧洲免费视频| 欧美有码在线观看| 亚洲国产精品va| 黑人巨大精品欧美一区二区三区| 欧美电影《睫毛膏》| 欧美性做爰毛片| 日韩小视频网址| 久久综合国产精品台湾中文娱乐网| 欧美裸体xxxx极品少妇软件| www国产精品com| 亚洲午夜av久久乱码| 欧美高跟鞋交xxxxhd| 国产成人精品久久二区二区91| 在线激情影院一区| 国产日韩欧美电影在线观看| 91爱视频在线| 国产精品男人的天堂| 亚洲国产成人精品久久久国产成人一区| 欧美又大粗又爽又黄大片视频| 精品久久久av| 日韩中文视频免费在线观看| 97欧美精品一区二区三区| 欧美日韩亚洲精品内裤| 午夜精品久久久久久久久久久久久| 狠狠躁夜夜躁人人躁婷婷91| 亚洲日韩中文字幕在线播放| 久久久精品在线| 日韩中文在线中文网在线观看| 国内精品小视频在线观看| 国产69精品久久久久9| 亚洲一区二区三区乱码aⅴ蜜桃女| 亚洲天堂av女优| 国产精品国产自产拍高清av水多| 欧美激情精品久久久久久大尺度| 亚洲第一区在线观看| 欧美极品xxxx| 日韩av三级在线观看| 久久国产精品久久久| 久久精品福利视频| 国产精品91在线观看| 欧美午夜电影在线| 成人免费看黄网站| 国产视频综合在线| 成人免费在线网址| 久久精品美女视频网站| 国产精品久久久久999| 海角国产乱辈乱精品视频| 91人人爽人人爽人人精88v| 午夜精品久久久久久久99黑人| 亚洲风情亚aⅴ在线发布| 国产精品视频一区二区高潮| 日韩少妇与小伙激情| 欧美日韩在线视频观看| 精品视频久久久久久| 亚洲男人天堂网站| 亚洲久久久久久久久久| 成人写真福利网| 色无极亚洲影院| 欧美成人精品一区二区三区| 欧美激情aaaa| 国产精品久久久久av| 91免费版网站入口| 亚洲天堂开心观看| 中文字幕亚洲一区在线观看| 欧美性xxxx在线播放| 欧洲美女7788成人免费视频| 精品国产福利视频| 亚洲第一黄色网| 成人免费观看a| 精品国产一区二区三区久久久狼| 欧美黑人xxxⅹ高潮交| 亚洲国内精品视频| 亚洲成在人线av| 日本不卡高字幕在线2019| 久久久久久久成人| 亚洲精品美女在线| 亚洲欧美中文日韩v在线观看| 日韩激情av在线免费观看| 久久久999精品免费| 欧美日韩精品在线观看| 成人动漫网站在线观看| 久久夜色精品亚洲噜噜国产mv| 亚洲欧美日韩图片| 亚洲欧美国产高清va在线播| 伊人久久久久久久久久久久久| 96精品久久久久中文字幕| 国产精品欧美激情在线播放| 国产精品福利无圣光在线一区| 国产日韩在线一区| 高清日韩电视剧大全免费播放在线观看| 欧美极品美女电影一区| 亚洲午夜色婷婷在线| 色与欲影视天天看综合网| 国产91|九色| 2019精品视频| 国产精品日韩欧美| 91国偷自产一区二区三区的观看方式| 日韩a**中文字幕| 日韩精品视频在线| 国产精品高潮视频| 欧美日韩免费在线| 欧美高清第一页| 日韩中文在线中文网在线观看| 国产91精品久| 国产精品夜间视频香蕉| 国产香蕉一区二区三区在线视频| 久久久精品久久| 欧美在线视频免费| 色哟哟亚洲精品一区二区| 成人高清视频观看www| 欧美高清在线视频观看不卡| 国产精品www色诱视频| 成人免费视频网| 亚洲第一国产精品| 色青青草原桃花久久综合| 色偷偷综合社区| 成人激情视频小说免费下载| 亚洲精品电影网| 国产日韩欧美日韩大片| 欧美高清视频在线播放| 国产精品成人aaaaa网站| 国产精品夫妻激情| 亚洲成人精品久久久| 亚洲自拍偷拍福利| 欧美富婆性猛交| 欧美日韩国产综合视频在线观看中文| 精品成人av一区| 国产精品无av码在线观看| 亚洲xxxx做受欧美| 亚洲国产另类 国产精品国产免费| 性色av一区二区咪爱| 欧美乱人伦中文字幕在线| 欧亚精品在线观看| 久久久精品日本| 国产综合久久久久久| 欧美午夜精品久久久久久久| 91久久久在线| 性亚洲最疯狂xxxx高清| 欧美激情中文字幕乱码免费|