0x00:前言介紹
在 MyBatis 中,最重要的類想必就是 SqlSessionFactory 類了,它的作用就是通過加載全局的配置文件和 Mapper 映射文件,然後初始化連接參數,去創建會話的實例類 SqlSession。
而 SqlSession 類的作用就是與數據庫連接,執行 Mapper 映射文件中的 sql 語句。那在 Spring 與 MyBatis 整合的環境當中,Spring 的作用主要有以下幾點:
1,通過單例方式管理 SqlSessionFactory,節省了連接和內存資源,且不需要再去自己寫加載 Factory 的代碼,從而統一了會話對象的產生源頭。
2,Spring 會對持久層的 Mapper 進行統一管理。
3,Spring 會對數據庫連接池、事務進行統一的管理。
0x01:示例項目
示例項目結構如下圖:
需要導入項目的 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());
}
}
運行結果圖如下:
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 事務,進行最終的數據庫操作。
閱讀更多 發哥微課堂 的文章