亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MyBatis 與 Spring 的完美整合方法

 更新時間:2018年04月19日 08:36:05   作者:我沒有三顆心臟  
MyBatis 和 Spring 兩大框架已經成了 Java 互聯(lián)網技術主流框架組合,它們經受住了大數據量和大批量請求的考驗,在互聯(lián)網系統(tǒng)中得到了廣泛的應用。這篇文章主要介紹了MyBatis 與 Spring 整合,需要的朋友可以參考下

MyBatis—Spring 項目

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

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

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

摘自:《Java EE 互聯(lián)網輕量級框架整合開發(fā)》

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

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

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

  • cn.wmyskxz.dao(放置 DAO 數據交互層處理類)
  • 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” 和 “l(fā)og4j.properties”,用于數據庫連接和日志系統(tǒng)參數設置。

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

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

第二步:引入依賴 jar 包

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

在【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 文檔配置標簽的規(guī)則的限制與規(guī)范。
  • “context:property-placeholder” 配置是用于讀取工程中的靜態(tài)屬性文件,然后在其他配置中使用時,就可以采用 “${屬性名}” 的方式獲取該屬性文件中的配置參數值。
  • 配置了一個名為 “dataSrouce” 的 bean 的信息,實際上是連接數據庫的數據源。
  • 設置 sqlSessionFactory 的 bean 實現(xiàn)類為 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” 包下,創(chuàng)建 “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 */
}

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

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

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

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

# Global logging configuration
# 在開發(fā)環(huán)境下日志級別要設置成 DEBUG ,生產環(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 層

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

由于該項目只對 User 用戶查詢,所以 DAO 層就只有一個類,在 “cn.wmyskxz” 包下創(chuàng)建 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;
}

然后在同一個包下創(chuàng)建 UserDAO 接口的實現(xiàn)類 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 不僅實現(xiàn)了 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 實現(xiàn)類繼承了 SqlSessionDaoSupport 父類后,就無須自己定義獲取 SqlSession 會話實例類方法了,該父類會默認加載數據源信息并提供獲取 SqlSession 類的方法。

第七步:編寫 Service 測試類

在 “cn.wmyskxz.test” 包下創(chuàng)建【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;
 // 在執(zhí)行測試方法之前首先獲取 Spring 配置文件對象
 // 注解@Before在執(zhí)行本類所有測試方法之前先調用這個方法
 @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());
 }
}

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

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

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

第一步:編寫 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(即首字母小寫)

現(xiàn)在有了代理類,我們需要通知 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;
 // 在執(zhí)行測試方法之前首先獲取 Spring 配置文件對象
 // 注解@Before在執(zhí)行本類所有測試方法之前先調用這個方法
 @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());
 }
}

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

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

總結

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

相關文章

  • Spring security登錄過程邏輯詳解

    Spring security登錄過程邏輯詳解

    這篇文章主要介紹了SSpringsecurity登錄過程邏輯詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • Java基礎之數組詳解

    Java基礎之數組詳解

    這篇文章主要介紹了Java基礎之數組詳解,文中有非常詳細的代碼示例,對正在學習java的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-04-04
  • Java中try、catch的使用方法

    Java中try、catch的使用方法

    這篇文章主要介紹了Java中try、catch的使用方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • Java switch()括號內參數的類型要求詳解

    Java switch()括號內參數的類型要求詳解

    這篇文章主要介紹了Java switch()括號內參數的類型要求,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 淺談HashMap、HashTable的key和value是否可為null

    淺談HashMap、HashTable的key和value是否可為null

    這篇文章主要介紹了淺談HashMap、HashTable的key和value是否可為null,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Java 圖片與byte數組互相轉換實例

    Java 圖片與byte數組互相轉換實例

    下面小編就為大家?guī)硪黄狫ava 圖片與byte數組互相轉換實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • java中多個@Scheduled定時器不執(zhí)行的解決方法

    java中多個@Scheduled定時器不執(zhí)行的解決方法

    在應用開發(fā)中經常需要一些周期性的操作,比如每5分鐘執(zhí)行某一操作等,這篇文章主要給大家介紹了關于java中多個@Scheduled定時器不執(zhí)行的解決方法,需要的朋友可以參考下
    2023-04-04
  • SpringBoot Starter機制及整合tomcat的實現(xiàn)詳解

    SpringBoot Starter機制及整合tomcat的實現(xiàn)詳解

    這篇文章主要介紹了SpringBoot Starter機制及整合tomcat的實現(xiàn),我們知道SpringBoot自己在“后臺”幫我們配置了很多原本需要我們手動去的東西,至于這個“后臺”是啥,就是Starter機制
    2022-09-09
  • Spring?EnableAsync注解異步執(zhí)行源碼解析

    Spring?EnableAsync注解異步執(zhí)行源碼解析

    這篇文章主要為大家介紹了Spring?EnableAsync注解源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • 數據庫基本操作語法歸納總結

    數據庫基本操作語法歸納總結

    本篇文章主要介紹了數據庫的一些常用方法及一些基本操作,需要的朋友可以參考下
    2017-04-04

最新評論