Mybatis和Spring整合
一、dao介面+實現類的方式
1、先建立好整合工程結構
2、對於Spring和Mybatis 整合,我們先從資料庫開始,即先建立一張簡單的資料表,Sql如下
CREATE TABLE `t_user` ( `id` INT(10) NOT NULL AUTO_INCREMENT, `username` VARCHAR(100) DEFAULT NULL, `password` VARCHAR(100) DEFAULT NULL, `address` VARCHAR(100) DEFAULT NULL, `sex` VARCHAR(10) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=INNODB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8
然後根據從上面的資料表建立對應的實體類
1 package cn.test.ssm.po; 2 3 import java.io.Serializable; 4 5 public class User implements Serializable { 6private int id; 7private String username; 8private String password; 9private String address; 10private String sex; 11 12public int getId() { 13return id; 14} 15 16public String getUsername() { 17return username; 18} 19 20public String getPassword() { 21return password; 22} 23 24public String getAddress() { 25return address; 26} 27 28public String getSex() { 29return sex; 30} 31 32public void setId(int id) { 33this.id = id; 34} 35 36public void setUsername(String username) { 37this.username = username; 38} 39 40public void setPassword(String password) { 41this.password = password; 42} 43 44public void setAddress(String address) { 45this.address = address; 46} 47 48public void setSex(String sex) { 49this.sex = sex; 50} 51 52public User(String username, String password, String address, String sex) { 53this.username = username; 54this.password = password; 55this.address = address; 56this.sex = sex; 57} 58 59public User() { 60} 61 62@Override 63public String toString() { 64return "User{" + 65"id=" + id + 66", username='" + username + '\'' + 67", password='" + password + '\'' + 68", address='" + address + '\'' + 69", sex='" + sex + '\'' + 70'}'; 71} 72 } User
3、然後我們開始配置Mybatis的相關配置檔案,具體有Mybatis的核心配置檔案SqlMapConfig.xml
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE configuration 3PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4"http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 <configuration> 6 7<typeAliases> 8<!--批量別名定義:Mybatis在定義別名的時候會自動掃描包中的po類,自動的將別名定義為類名(首字母大寫或者小寫都可以)--> 9<package name="cn.test.ssm.po"></package> 10</typeAliases> 11 12<!--配置一個SQL語句和對映的配置檔案--> 13<mappers> 14<mapper resource="sqlmap/UserMapper.xml" /> 15</mappers> 16 17 </configuration>
然後就是配置UserMapper.xml對映檔案,由於只是測試Spring和Mybatis的整合,所以可以只是實現相對簡單的功能,這樣的話,UserMapper配置檔案也就比較簡單
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <!--mapper為根元素,namespace指定了名稱空間--> 6 <mapper namespace="test"> 7 8<select id="findUserById" parameterType="int" resultType="cn.test.ssm.po.User"> 9SELECT * FROM t_user WHERE id = #{id} 10</select> 11 12 </mapper>
4、下來就是根據UserMapper中的statment實現的功能,寫dao介面檔案
1 package cn.test.ssm.dao; 2 3 import cn.test.ssm.po.User; 4 5 public interface UserDao { 6 7public User findUserById(int id) throws Exception; 8 }
5、我們編寫dao介面的實現類。在dao介面的實現類過程中,我們需要知道,由於Spring整合Mybatis的原因,Spring需要管理SqlSessionFactory,而實現類方法中需要得到這個SqlSessionFactory,這裡我們可以繼承SqlSessionDaoSupport這個類,我們看一下這個類中的方法
6、下來我們就具體的配置applicationContext配置檔案,其中需要配置資料庫資訊,載入其他的配置檔案,管理配置SqlSessionFactory(要載入Mybatis核心配置檔案),然後我們管理UserDao介面的bean,同上面分析的,就需要配置SqlSessionFactory這個屬性
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4xmlns:context="http://www.springframework.org/schema/context" 5xmlns:aop="http://www.springframework.org/schema/aop" 6xmlns:tx="http://www.springframework.org/schema/tx" 7xsi:schemaLocation=" 8http://www.springframework.org/schema/beans 9http://www.springframework.org/schema/beans/spring-beans.xsd 10http://www.springframework.org/schema/aop 11http://www.springframework.org/schema/aop/spring-aop.xsd 12http://www.springframework.org/schema/context 13http://www.springframework.org/schema/context/spring-context.xsd 14http://www.springframework.org/schema/tx 15http://www.springframework.org/schema/tx/spring-tx.xsd"> 16 17 18<!--載入資料庫資訊的配置檔案--> 19<context:property-placeholder location="classpath:db.properties"></context:property-placeholder> 20 21<!--配置資料來源--> 22<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> 23<property name="driverClass" value="${jdbc.driver}" /> 24<property name="jdbcUrl" value="${jdbc.url}" /> 25<property name="user" value="${jdbc.username}" /> 26<property name="password" value="${jdbc.password}" /> 27</bean> 28 29<!--配置SqlSessionFactory--> 30<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 31<!--載入Mybatis的配置檔案--> 32<property name="configLocation" value="mybatis/SqlMapConfig.xml"></property> 33<!--配置資料來源--> 34<property name="dataSource" ref="dataSource"></property> 35</bean> 36 37<!--配置Dao介面--> 38<bean id="userDao" class="cn.test.ssm.dao.UserDaoImpl"> 39<property name="sqlSessionFactory" ref="sqlSessionFactory"></property> 40</bean> 41 </beans>
7、編寫好applicationContext之後,就開始實現UserDao這個介面,也是如同上面的分析,實現SqlSessionDaoSupport這個抽象類,從而得到SqlSessionFactory,在方法體內獲取SqlSession
1 package cn.test.ssm.dao; 2 3 import cn.test.ssm.po.User; 4 import org.apache.ibatis.session.SqlSession; 5 import org.mybatis.spring.support.SqlSessionDaoSupport; 6 7 public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao{ 8 9 //SqlSessionDaoSupport中有 public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) 方法 10 11@Override 12public User findUserById(int id) throws Exception { 13SqlSession sqlSession = getSqlSession(); //SqlSessionDaoSupport中有private SqlSession sqlSession;這個屬性和方法 14User user = sqlSession.selectOne("test.findUserById",1); 15//使用spring來記性管理,在方法結束的時候就會自己關閉SqlSession 16return user; 17} 18 }
8、編寫相應的Junit進行測試
1 package cn.test.ssm.dao; 2 3 import cn.test.ssm.po.User; 4 import org.apache.ibatis.session.SqlSession; 5 import org.mybatis.spring.support.SqlSessionDaoSupport; 6 7 public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao{ 8 9 //SqlSessionDaoSupport中有 public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) 方法 10 11@Override 12public User findUserById(int id) throws Exception { 13SqlSession sqlSession = getSqlSession(); //SqlSessionDaoSupport中有private SqlSession sqlSession;這個屬性和方法 14User user = sqlSession.selectOne("test.findUserById",1); 15//使用spring來記性管理,在方法結束的時候就會自己關閉SqlSession 16return user; 17} 18 }
通過上面的測試程式得到結果
二、通過mapper代理方式
1、mapper代理的方式進行整合,其實跟第一篇中講到的差不多,實際上比較重要的就是mapper介面和mapper配置檔案在同一包下,且檔名相同即可,下面是使用mapper代理的方式的結構
2、然後我麼來配置UserMapper配置檔案,需要注意的就是這個配置檔案中需要將namespace設定為Mapper介面的路徑
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <!--mapper為根元素,namespace指定了名稱空間--> 6 <mapper namespace="cn.test.ssm.mapper.UserMapper"> 7 8<select id="findUserById" parameterType="int" resultType="cn.test.ssm.po.User"> 9SELECT * FROM t_user WHERE id = #{id} 10</select> 11 12 </mapper>
3、然後我們配置applicationContext配置檔案,這裡介紹兩種配置,一種是單個Mapper的配置,一種的進行包掃描的配置
①單個Mapper的配置
a)其中需要配置的就是MapperInterface介面和SqlSessionFactory兩個屬性,MapperInterface作用就是掃描指定的Mapper介面檔案
<!--配置mapper 通過MapperFactoryBean來進行配置,該類能夠根據mapper介面生成代理物件 --> <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> <!--配置mapper介面--> <property name="mapperInterface" value="cn.test.ssm.mapper.UserMapper"></property> <!--配置SqlSessionFactory--> <property name="sqlSessionFactory" ref="sqlSessionFactory"></property> </bean>
b)使用測試程式進行測試
1 package test; 2 3 import cn.test.ssm.dao.UserDao; 4 import cn.test.ssm.mapper.UserMapper; 5 import cn.test.ssm.po.User; 6 import org.junit.Before; 7 import org.junit.Test; 8 import org.springframework.context.ApplicationContext; 9 import org.springframework.context.support.ClassPathXmlApplicationContext; 10 11 import static org.junit.Assert.*; 12 13 public class UserMapperTest { 14private ApplicationContext applicationContext; 15 16@Before 17public void setUp() throws Exception { 18//得到spring的容器 19applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml"); 20} 21 22@Test 23public void findUserById() throws Exception{ 24UserMapper userMapper = (UserMapper) applicationContext.getBean("userMapper"); 25 26User user = userMapper.findUserById(1); 27 28System.out.println(user); 29} 30 }
c)通過觀察日誌分析結果如下:
②通過掃描mapper包的方式進行配置
a)其中basePackage就是設定掃描的包,當有多個包需要掃描的時候,使用逗號隔開
1<!--通過配置掃描器的方式解決上面配置存在的不足:當我們的Mapper介面比較多的時候,上面單個配置Mapper顯然會比較繁瑣, 2所以我們可以使用掃描器的方式進行配置,將mapper包下面的所有介面同時進行掃描配置,顯然,mapper介面的檔名和Mapper 3配置檔案的檔名應該相同 4--> 5<!--通過下面的這種配置:可以自動建立物件並且向spring容器中注入--> 6<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 7<property name="basePackage" value="cn.test.ssm.mapper"></property> 8<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property> 9</bean>
b)測試程式和上面的測試程式相同,我們來執行測試程式,但是發現執行出了下面的異常
c)通過查詢資料,發現是由於Spring版本和Jdk版本不支援的原因,因為本次測試使用的Spring版本是3.2.x,然後該版本不支援jdk1.8,所以就需要修改jdk版本為1.7,如下圖所示
然後再次執行專案即可