激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - Java教程 - MyBatis 與 Spring 的完美整合方法

MyBatis 與 Spring 的完美整合方法

2021-04-22 11:00我沒有三顆心臟 Java教程

MyBatis 和 Spring 兩大框架已經(jīng)成了 Java 互聯(lián)網(wǎng)技術主流框架組合,它們經(jīng)受住了大數(shù)據(jù)量和大批量請求的考驗,在互聯(lián)網(wǎng)系統(tǒng)中得到了廣泛的應用。這篇文章主要介紹了MyBatis 與 Spring 整合,需要的朋友可以參考下

MyBatis 與 Spring 的完美整合方法

mybatis—spring 項目

目前大部分的 java 互聯(lián)網(wǎng)項目,都是用 spring mvc + spring + mybatis 搭建平臺的。

使用 spring ioc 可以有效的管理各類的 java 資源,達到即插即拔的功能;通過 spring aop 框架,數(shù)據(jù)庫事務可以委托給 spring 管理,消除很大一部分的事務代碼,配合 mybatis 的高靈活、可配置、可優(yōu)化 sql 等特性,完全可以構(gòu)建高性能的大型網(wǎng)站。

毫無疑問,mybatis 和 spring 兩大框架已經(jīng)成了 java 互聯(lián)網(wǎng)技術主流框架組合,它們經(jīng)受住了大數(shù)據(jù)量和大批量請求的考驗,在互聯(lián)網(wǎng)系統(tǒng)中得到了廣泛的應用。使用 mybatis-spring 使得業(yè)務層和模型層得到了更好的分離,與此同時,在 spring 環(huán)境中使用 mybatis 也更加簡單,節(jié)省了不少代碼,甚至可以不用 sqlsessionfactory、 sqlsession 等對象,因為 mybatis-spring 為我們封裝了它們。

摘自:《java ee 互聯(lián)網(wǎng)輕量級框架整合開發(fā)》

第一步:創(chuàng)建測試工程

第一步,首先在 idea 中新建一個名為【mybatisandspring】的 webproject 工程:

MyBatis 與 Spring 的完美整合方法

然后在【src】中創(chuàng)建 4 個空包:

  • cn.wmyskxz.dao(放置 dao 數(shù)據(jù)交互層處理類)
  • cn.wmyskxz.mapper(放置 mapper 代理接口)
  • cn.wmyskxz.pojo(放置 java 實體類)
  • cn.wmyskxz.test(放置測試類)

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

  • 在【config / mybatis】下創(chuàng)建一個空的名為 “sqlmapconfig.xml” 的 mybatis 全局配置文件在【config / spring】下創(chuàng)建一個空的名為 “applicationcontext.xml” 的 spring 資源配置文件
  • 在【config / sqlmap】下創(chuàng)建一個空的名為 “usermapper.xml” 的 mapper 映射文件。
  • 在【config】下創(chuàng)建兩個 properties 屬性文件,分別為 “db.properties” 和 “log4j.properties”,用于數(shù)據(jù)庫連接和日志系統(tǒng)參數(shù)設置。

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

MyBatis 與 Spring 的完美整合方法

工程的完整初始結(jié)構(gòu)如下:

MyBatis 與 Spring 的完美整合方法

第二步:引入依賴 jar 包

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

MyBatis 與 Spring 的完美整合方法

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

第三步:編寫 spring 配置文件

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

  • 加載數(shù)據(jù)庫連接文件 “db.properties” 中的數(shù)據(jù),建立數(shù)據(jù)源
  • 配置 sqlsessionfactory 會話工廠對象
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?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"/>
 <!-- 配置數(shù)據(jù)源 -->
 <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"/>
  <!-- 數(shù)據(jù)源 -->
  <property name="datasource" ref="datasource"/>
 </bean>
</beans>
  • 頭部的信息就是聲明 xml 文檔配置標簽的規(guī)則的限制與規(guī)范。
  • “context:property-placeholder” 配置是用于讀取工程中的靜態(tài)屬性文件,然后在其他配置中使用時,就可以采用 “${屬性名}” 的方式獲取該屬性文件中的配置參數(shù)值。
  • 配置了一個名為 “datasrouce” 的 bean 的信息,實際上是連接數(shù)據(jù)庫的數(shù)據(jù)源。
  • 設置 sqlsessionfactory 的 bean 實現(xiàn)類為 mybatis 與 spring 整合 jar 包中的 sqlsessionfactorybean 類,在其中只需要注入兩個參數(shù):一個是 mybatis 的全局配置文件,一個是上面配置的數(shù)據(jù)源 bean

第四步:編寫 mybatis 配置文件

第四步,在【mybatis】包下編寫 mybatis 的全局配置文件 sqlmapconfig.xml :

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?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 托管數(shù)據(jù)源,在 mybatis 配置文件中僅僅需要關注性能化配置。

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

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

?
1
2
3
4
5
6
7
8
9
<?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>

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

?
1
2
3
4
5
6
7
package cn.wmyskxz.pojo;
import java.io.serializable;
public class user implements serializable {
 private int id;
 private string username;
 /* getter and setter */
}

實現(xiàn) serializable 接口是為之后使用 mapper 動態(tài)代理做準備,這里沒有使用動態(tài)代理。

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

?
1
2
3
4
jdbc.driver=com.mysql.jdbc.driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterencoding=utf-8
jdbc.username=root
jdbc.password=root

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

?
1
2
3
4
5
6
7
# global logging configuration
# 在開發(fā)環(huán)境下日志級別要設置成 debug ,生產(chǎn)環(huán)境設為 info 或 error
log4j.rootlogger=debug, stdout
# console output...
log4j.appender.stdout=org.apache.log4j.consoleappender
log4j.appender.stdout.layout=org.apache.log4j.patternlayout
log4j.appender.stdout.layout.conversionpattern=%5p [%t] - %m%n

第六步:編寫 dao 層

第六步,進行數(shù)據(jù)庫交互(data access object)層的編寫。

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

?
1
2
3
4
5
6
package cn.wmyskxz.dao;
import cn.wmyskxz.pojo.user;
public interface userdao {
 // 根據(jù) id 查詢用戶信息
 public user finduserbyid(int id) throws exception;
}

然后在同一個包下創(chuàng)建 userdao 接口的實現(xiàn)類 userdaoimpl:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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 不僅實現(xiàn)了 userdao 接口,而且繼承了 sqlsessiondaosupport 類。
  • sqlsessiondaosupport 類是 mybatis 與 spring 整合的 jar 包中提供的,在該類中已經(jīng)包含了 sqlsessionfactory 對象作為其成員變量,而且對外提供 get 和 set 方法,方便 spring 從外部注入 sqlsessionfactory 對象。
  • userdaoimpl 類要成功獲取 sqlsessionfactory 對象,還需要在 spring 配置文件 applicationcontext.xml 中添加 userdao 的 bean 配置,將其中定義的 sqlsessionfactory 對象當做參數(shù)注入進去,這樣 userdaoimpl 繼承 sqlsessiondaosupport 類才會起到作用:
?
1
2
3
4
<!-- 原始 dao 接口 -->
<bean id="userdao" class="cn.wmyskxz.dao.userdaoimpl">
 <property name="sqlsessionfactory" ref="sqlsessionfactory"/>
</bean>

注意: dao 實現(xiàn)類繼承了 sqlsessiondaosupport 父類后,就無須自己定義獲取 sqlsession 會話實例類方法了,該父類會默認加載數(shù)據(jù)源信息并提供獲取 sqlsession 類的方法。

第七步:編寫 service 測試類

在 “cn.wmyskxz.test” 包下創(chuàng)建【userservicetest】測試類:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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;
 // 在執(zhí)行測試方法之前首先獲取 spring 配置文件對象
 // 注解@before在執(zhí)行本類所有測試方法之前先調(diào)用這個方法
 @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");
  // 調(diào)用 userdao 的方法
  user user = userdao.finduserbyid(1);
  // 輸出用戶信息
  system.out.println(user.getid() + ":" + user.getusername());
 }
}

運行測試方法,輸出結(jié)果如下:

MyBatis 與 Spring 的完美整合方法

動態(tài)代理 + 注解實現(xiàn)

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

第一步:編寫 userquerymapper

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

?
1
2
3
4
5
6
7
8
9
10
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(即首字母小寫)

現(xiàn)在有了代理類,我們需要通知 spring 在這里來掃描到該類,mapper 掃描配置對象需要用專門的掃描器:

?
1
2
3
4
5
<!-- mapper 掃描器 -->
<bean class="org.mybatis.spring.mapper.mapperscannerconfigurer">
 <!-- 掃描 cn.wmyskxz.mapper 包下的組件 -->
 <property name="basepackage" value="cn.wmyskxz.mapper"/>
</bean>

第二步:編寫測試類

這一次我們獲取的不再是 userdao 對象,而是定義的 mapper 代理對象 userquerymapper:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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;
 // 在執(zhí)行測試方法之前首先獲取 spring 配置文件對象
 // 注解@before在執(zhí)行本類所有測試方法之前先調(diào)用這個方法
 @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");
  // 調(diào)用 userdao 的方法
  user user = userquerymapper.finduserbyid(1);
  // 輸出用戶信息
  system.out.println(user.getid() + ":" + user.getusername());
 }
}

運行測試方法,得到正確結(jié)果:

MyBatis 與 Spring 的完美整合方法

可以看到,查詢結(jié)果和之前非 mapper 代理的查詢結(jié)果一樣。

總結(jié)

以上所述是小編給大家介紹的mybatis 與 spring 的完美整合方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網(wǎng)站的支持!

原文鏈接:https://www.cnblogs.com/wmyskxz/p/8879513.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久久成人免费视频 | 一区二区三区日韩在线观看 | 在线a视频| 久久国产成人精品国产成人亚洲 | 国产精品亚洲yourport | 久久99久久98精品免观看软件 | 成人在线视频黄色 | 99精品视频一区二区三区 | 青青草免费观看 | 久久精品免费网站 | 亚洲综合色视频在线观看 | 国产噜噜噜噜噜久久久久久久久 | 免费黄色入口 | 亚洲成人午夜精品 | 成人性生活视频在线播放 | 999精品国产 | 美女视频黄a视频免费全过程 | 日本中文字幕高清 | 中文字幕网站在线 | 一级电影免费在线观看 | 免费一级特黄做受大片 | 午夜a狂野欧美一区二区 | 成人免费一区二区三区在线观看 | 国产日韩a | 一区二区三区日韩在线 | 粉嫩粉嫩一区二区三区在线播放 | 91精品国啪老师啪 | 欧美日韩精品不卡一区二区三区 | 久久亚洲精品国产一区 | 欧美日韩免费一区 | 久久久久久久免费看 | 国产亚洲高清在线精品不卡 | 国产精品视频一区二区三区四 | 久久福利剧场 | 精品亚洲va在线va天堂资源站 | 狠狠操夜夜爱 | 国产成人自拍视频在线观看 | 综合在线一区 | v天堂在线视频 | 最新一区二区三区 | 亚洲精品欧美二区三区中文字幕 |