MyBatis 與 Spring 整合

MyBatis 與 Spring 整合


0x00:前言介紹

在 MyBatis 中,最重要的類想必就是 SqlSessionFactory 類了,它的作用就是通過加載全局的配置文件和 Mapper 映射文件,然後初始化連接參數,去創建會話的實例類 SqlSession。

而 SqlSession 類的作用就是與數據庫連接,執行 Mapper 映射文件中的 sql 語句。那在 Spring 與 MyBatis 整合的環境當中,Spring 的作用主要有以下幾點:

1,通過單例方式管理 SqlSessionFactory,節省了連接和內存資源,且不需要再去自己寫加載 Factory 的代碼,從而統一了會話對象的產生源頭。

2,Spring 會對持久層的 Mapper 進行統一管理。

3,Spring 會對數據庫連接池、事務進行統一的管理。

0x01:示例項目

示例項目結構如下圖:

MyBatis 與 Spring 整合

需要導入項目的 jar 包有 mybatis 的 jar 包,spring 的 jar 包,以及 mybatis 和 spring 整合的 jar 包。有時候不同的開發環境會導致 jar 包不兼容,可以看下是否少了相應的依賴 jar 包或者是依賴包版本不兼容等。此文章只作為整合示例,項目開發中請用 maven 來管理(後期會有相應內容的更新)。

0x02:Spring 配置文件

Spring 配置文件中會去加載數據庫的連接文件 db.properties,建立數據源配置 SqlSessionFactory 會話工廠對象,示例代碼如下:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"

xmlns:context="http://www.springframework.org/schema/context"

xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.2.xsd

http://www.springframework.org/schema/mvc

http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-3.2.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop-3.2.xsd

http://www.springframework.org/schema/tx

http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">

0x03:MyBatis 配置文件

MyBatis 配置文件中配置了一些緩存的 setting 參數,以及一些 typeAliases 別名定義和 Mapper 映射文件的加載路徑,示例代碼如下:

當有了 Spring 託管數據源時,我們就可以在 MyBatis 配置文件中只去關注性能配置。

0x04:Mapper 映射文件

Mapper 映射文件很簡單,只配置了一條查詢的 sql,示例如下:

SELECT * FROM user WHERE id=#{id}

在映射文件中 resultType 返回的類型是 user,這是因為在 MyBatis 全局配置文件中通過 typeAliases 配置了別名,也就是小寫的首字母類名。

0x05:User 實體類

package com.fageweiketang.po;

import java.io.Serializable;

public class User implements Serializable{

private int id;

private String username;

private String password;

private String email;

public User(){}

public User(int id, String username, String password, String email) {

super();

this.id = id;

this.username = username;

this.password = password;

this.email = email;

}

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getUsername() {

return username;

}

public void setUsername(String username) {

this.username = username;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

public String getEmail() {

return email;

}

public void setEmail(String email) {

this.email = email;

}

}

0x06:數據庫配置文件

數據庫配置文件通過 key=value 的形式配置,然後在 Spring 中通過 ${} 的形式進行引用,其配置如下:

jdbc.driver=org.gjt.mm.mysql.Driver

jdbc.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf-8

jdbc.username=root

jdbc.password=root

0x07:日誌配置文件

日誌配置文件很簡單,配置一下日誌格式即可,代碼示例如下:

log4j.rootLogger = DEBUG,stdout

log4j.appender.stdout = org.apache.log4j.ConsoleAppender

log4j.appender.stdout.layout = org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern =%5p [%t] - %m%n

0x08:DAO 層

創建 dao 層的 interface 接口,定義 findUserById 方法,示例代碼如下:

package

com.fageweiketang.dao;

import com.fageweiketang.po.User;

public interface UserDao {

public User findUserById(int id) throws Exception;

}

然後是 UserDao 接口的實現類 UserDaoImpl,示例代碼如下:

package com.fageweiketang.dao;

import org.apache.ibatis.session.SqlSession;

import org.mybatis.spring.support.SqlSessionDaoSupport;

import com.fageweiketang.po.User;

public

class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {

public User findUserById(int id) throws Exception {

SqlSession sqlSession = this.getSqlSession();

User user = sqlSession.selectOne("test.findUserById",id);

return user;

}

}

0x09:測試類

編寫測試類,驗證 MyBatis 和 Spring 是否整合成功,示例代碼如下:

package com.fageweiketang.test;

import org.junit.Before;

import org.junit.Test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.fageweiketang.dao.UserDao;

import com.fageweiketang.po.User;

public class UserServiceTest {

private ApplicationContext applicationContext;

//在執行本類所有測試方法之前先調用這個方法

@Before

public void setup()

throws Exception{

applicationContext=new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");

}

@Test

public void testFindUserById() throws Exception{

UserDao userDao=(UserDao)applicationContext.getBean("userDao");

User user=userDao.findUserById(1);

System.out.println(user.getId()+":"+user.getUsername()+":"+user.getEmail());

}

}

運行結果圖如下:

MyBatis 與 Spring 整合

0x10:總結

總結示例流程如下:在測試方法中,通過使用 ClassPathXmlApplicationContext 對象去加載了 Spring 的配置文件,也就是 applicationContext.xml 文件,在這個配置文件中引入了數據庫配置文件 db.properties,然後加載了數據源 bean,並向其注入了數據庫的連接數據。隨後加載了 sqlSessionFactory 的 bean 配置,向其注入數據源的對象 dataSource 供其連接數據庫,並注入 MyBatis 全局配置文件 SqlMapConfig.xml,供其加載 MyBatis 初始化數據,以及集成 Mapper 映射文件。最後加載配置的 userDao 的 bean 配置。

實現類 UserDaoImpl 繼承了包含 sqlSessionFactory 對象的 SqlSessionDaoSupport 父類,並向其注入 sqlSessionFactory 對象,以供其產生 sqlSession 對象,然後通過 ClassPathXmlApplicationContext 對象的加載,獲得了 applicationContext 對象,通過 getBean 方法,獲取配置對象 userDao。當執行 userDao 的 findUserById 方法時,sqlSession 對象執行了 selectOne 方法,從 Mapper 文件中獲取相應 id 的 sql 配置,開啟 JDBC 事務,進行最終的數據庫操作。


分享到:


相關文章: