根據官方的說法,在ibatis3,也就是Mybatis3問世以前,Spring3的開發工做就已經完成了,因此Spring3中仍是沒有對Mybatis3的支持。所以由Mybatis社區本身開發了一個Mybatis-Spring用來知足Mybatis用戶整合Spring的需求。下面就將經過Mybatis-Spring來整合Mybatis跟Spring的用法作一個簡單的介紹。spring
首先,咱們須要從Mybatis官網上下載Mybatis-Spring的jar包添加到咱們項目的類路徑下,固然也須要添加Mybatis的相關jar包和Spring的相關jar包。咱們知道在Mybatis的全部操做都是基於一個SqlSession的,而SqlSession是由SqlSessionFactory來產生的,SqlSessionFactory又是由SqlSessionFactoryBuilder來生成的。可是Mybatis-Spring是基於SqlSessionFactoryBean的。在使用Mybatis-Spring的時候,咱們也須要SqlSession,並且這個SqlSession是內嵌在程序中的,通常不須要咱們直接訪問。SqlSession也是由SqlSessionFactory來產生的,可是Mybatis-Spring給咱們封裝了一個SqlSessionFactoryBean,在這個bean裏面仍是經過SqlSessionFactoryBuilder來創建對應的SqlSessionFactory,進而獲取到對應的SqlSession。經過SqlSessionFactoryBean咱們能夠經過對其指定一些屬性來提供Mybatis的一些配置信息。因此接下來咱們須要在Spring的applicationContext配置文件中定義一個SqlSessionFactoryBean。sql
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> apache
<property name="dataSource" ref="dataSource" /> 數組
<property name="mapperLocations" spring-mvc
value="classpath:com/tiantian/ckeditor/mybatis/mappers/*Mapper.xml" /> mybatis
<property name="typeAliasesPackage" value="com.tiantian.ckeditor.model" /> mvc
</bean> app
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="mapperLocations" value="classpath:com/tiantian/ckeditor/mybatis/mappers/*Mapper.xml" /> <property name="typeAliasesPackage" value="com.tiantian.ckeditor.model" /> </bean>
在定義SqlSessionFactoryBean的時候,dataSource屬性是必須指定的,它表示用於鏈接數據庫的數據源。固然,咱們也能夠指定一些其餘的屬性,下面簡單列舉幾個:ide
mapperLocations:它表示咱們的Mapper文件存放的位置,當咱們的Mapper文件跟對應的Mapper接口處於同一位置的時候能夠不用指定該屬性的值。
configLocation:用於指定Mybatis的配置文件位置。若是指定了該屬性,那麼會以該配置文件的內容做爲配置信息構建對應的SqlSessionFactoryBuilder,可是後續屬性指定的內容會覆蓋該配置文件裏面指定的對應內容。
typeAliasesPackage:它通常對應咱們的實體類所在的包,這個時候會自動取對應包中不包括包名的簡單類名做爲包括包名的別名。多個package之間能夠用逗號或者分號等來進行分隔。
typeAliases:數組類型,用來指定別名的。指定了這個屬性後,Mybatis會把這個類型的短名稱做爲這個類型的別名,前提是該類上沒有標註@Alias註解,不然將使用該註解對應的值做爲此種類型的別名。
<property name="typeAliases">
<array>
<value>com.tiantian.mybatis.model.Blog</value>
<value>com.tiantian.mybatis.model.Comment</value>
</array>
</property>
<property name="typeAliases"> <array> <value>com.tiantian.mybatis.model.Blog</value> <value>com.tiantian.mybatis.model.Comment</value> </array></property>
plugins:數組類型,用來指定Mybatis的Interceptor。
typeHandlersPackage:用來指定TypeHandler所在的包,若是指定了該屬性,SqlSessionFactoryBean會自動把該包下面的類註冊爲對應的TypeHandler。多個package之間能夠用逗號或者分號等來進行分隔。
typeHandlers:數組類型,表示TypeHandler。
接下來就是在Spring的applicationContext文件中定義咱們想要的Mapper對象對應的MapperFactoryBean了。經過MapperFactoryBean能夠獲取到咱們想要的Mapper對象。MapperFactoryBean實現了Spring的FactoryBean接口,因此MapperFactoryBean是經過FactoryBean接口中定義的getObject方法來獲取對應的Mapper對象的。在定義一個MapperFactoryBean的時候有兩個屬性須要咱們注入,一個是Mybatis-Spring用來生成實現了SqlSession接口的SqlSessionTemplate對象的sqlSessionFactory;另外一個就是咱們所要返回的對應的Mapper接口了。
定義好相應Mapper接口對應的MapperFactoryBean以後,咱們就能夠把咱們對應的Mapper接口注入到由Spring管理的bean對象中了,好比Service bean對象。這樣當咱們須要使用到相應的Mapper接口時,MapperFactoryBean會從它的getObject方法中獲取對應的Mapper接口,而getObject內部仍是經過咱們注入的屬性調用SqlSession接口的getMapper(Mapper接口)方法來返回對應的Mapper接口的。這樣就經過把SqlSessionFactory和相應的Mapper接×××給Spring管理實現了Mybatis跟Spring的整合。
Spring的applicationContext.xml配置文件:
<?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"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<context:component-scan base-package="com.tiantian.mybatis"/>
<context:property-placeholder location="classpath:config/jdbc.properties"/>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<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>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mapperLocations" value="classpath:com/tiantian/mybatis/mapper/*.xml"/>
<property name="typeAliasesPackage" value="com.tiantian.mybatis.model" />
</bean>
<bean id="blogMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface"
value="com.tiantian.mybatis.mapper.BlogMapper" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
</beans>
<?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" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> <context:component-scan base-package="com.tiantian.mybatis"/> <context:property-placeholder location="classpath:config/jdbc.properties"/> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <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> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="mapperLocations" value="classpath:com/tiantian/mybatis/mapper/*.xml"/> <property name="typeAliasesPackage" value="com.tiantian.mybatis.model" /> </bean> <bean id="blogMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> <property name="mapperInterface" value="com.tiantian.mybatis.mapper.BlogMapper" /> <property name="sqlSessionFactory" ref="sqlSessionFactory" /> </bean> </beans>
BlogMapper.xml文件:
<?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="com.tiantian.mybatis.mapper.BlogMapper">
<!-- 新增記錄 -->
<insert id="insertBlog" parameterType="Blog" useGeneratedKeys="true" keyProperty="id">
insert into t_blog(title,content,owner) values(#{title},#{content},#{owner})
</insert>
<!-- 查詢單條記錄 -->
<select id="selectBlog" parameterType="int" resultMap="BlogResult">
select * from t_blog where id = #{id}
</select>
<!-- 修改記錄 -->
<update id="updateBlog" parameterType="Blog">
update t_blog set title = #{title},content = #{content},owner = #{owner} where id = #{id}
</update>
<!-- 查詢全部記錄 -->
<select id="selectAll" resultType="Blog">
select * from t_blog
</select>
<!-- 刪除記錄 -->
<delete id="deleteBlog" parameterType="int">
delete from t_blog where id = #{id}
</delete>
</mapper>
<?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="com.tiantian.mybatis.mapper.BlogMapper"><!-- 新增記錄 --> <insert id="insertBlog" parameterType="Blog" useGeneratedKeys="true" keyProperty="id"> insert into t_blog(title,content,owner) values(#{title},#{content},#{owner}) </insert><!-- 查詢單條記錄 --> <select id="selectBlog" parameterType="int" resultMap="BlogResult"> select * from t_blog where id = #{id} </select><!-- 修改記錄 --> <update id="updateBlog" parameterType="Blog"> update t_blog set title = #{title},content = #{content},owner = #{owner} where id = #{id} </update><!-- 查詢全部記錄 --> <select id="selectAll" resultType="Blog"> select * from t_blog </select><!-- 刪除記錄 --> <delete id="deleteBlog" parameterType="int"> delete from t_blog where id = #{id} </delete> </mapper>