茄子在线看片免费人成视频,午夜福利精品a在线观看,国产高清自产拍在线观看,久久综合久久狠狠综合

    <s id="ddbnn"></s>
  • <sub id="ddbnn"><ol id="ddbnn"></ol></sub>

  • <legend id="ddbnn"></legend><s id="ddbnn"></s>

    Mybatis整合Spring
    來源:易賢網(wǎng) 閱讀:1116 次 日期:2015-01-15 14:21:56
    溫馨提示:易賢網(wǎng)小編為您整理了“Mybatis整合Spring”,方便廣大網(wǎng)友查閱!

    Mybatis整合SpringintegrationMapperScannerConfigurer

    Mybatis整合Spring

    根據(jù)官方的說法,在ibatis3,也就是Mybatis3問世之前,Spring3的開發(fā)工作就已經(jīng)完成了,所以Spring3中還是沒有對(duì)Mybatis3的支持。因此由Mybatis社區(qū)自己開發(fā)了一個(gè)Mybatis-Spring用來滿足Mybatis用戶整合Spring的需求。下面就將通過Mybatis-Spring來整合Mybatis跟Spring的用法做一個(gè)簡單的介紹。

    MapperFactoryBean

    首先,我們需要從Mybatis官網(wǎng)上下載Mybatis-Spring的jar包添加到我們項(xiàng)目的類路徑下,當(dāng)然也需要添加Mybatis的相關(guān)jar包和Spring的相關(guān)jar包。我們知道在Mybatis的所有操作都是基于一個(gè)SqlSession的,而SqlSession是由SqlSessionFactory來產(chǎn)生的,SqlSessionFactory又是由SqlSessionFactoryBuilder來生成的。但是Mybatis-Spring是基于SqlSessionFactoryBean的。在使用Mybatis-Spring的時(shí)候,我們也需要SqlSession,而且這個(gè)SqlSession是內(nèi)嵌在程序中的,一般不需要我們直接訪問。SqlSession也是由SqlSessionFactory來產(chǎn)生的,但是Mybatis-Spring給我們封裝了一個(gè)SqlSessionFactoryBean,在這個(gè)bean里面還是通過SqlSessionFactoryBuilder來建立對(duì)應(yīng)的SqlSessionFactory,進(jìn)而獲取到對(duì)應(yīng)的SqlSession。通過SqlSessionFactoryBean我們可以通過對(duì)其指定一些屬性來提供Mybatis的一些配置信息。所以接下來我們需要在Spring的applicationContext配置文件中定義一個(gè)SqlSessionFactoryBean。

    Xml代碼 收藏代碼

    <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的時(shí)候,dataSource屬性是必須指定的,它表示用于連接數(shù)據(jù)庫的數(shù)據(jù)源。當(dāng)然,我們也可以指定一些其他的屬性,下面簡單列舉幾個(gè):

    mapperLocations:它表示我們的Mapper文件存放的位置,當(dāng)我們的Mapper文件跟對(duì)應(yīng)的Mapper接口處于同一位置的時(shí)候可以不用指定該屬性的值。

    configLocation:用于指定Mybatis的配置文件位置。如果指定了該屬性,那么會(huì)以該配置文件的內(nèi)容作為配置信息構(gòu)建對(duì)應(yīng)的SqlSessionFactoryBuilder,但是后續(xù)屬性指定的內(nèi)容會(huì)覆蓋該配置文件里面指定的對(duì)應(yīng)內(nèi)容。

    typeAliasesPackage:它一般對(duì)應(yīng)我們的實(shí)體類所在的包,這個(gè)時(shí)候會(huì)自動(dòng)取對(duì)應(yīng)包中不包括包名的簡單類名作為包括包名的別名。多個(gè)package之間可以用逗號(hào)或者分號(hào)等來進(jìn)行分隔。

    typeAliases:數(shù)組類型,用來指定別名的。指定了這個(gè)屬性后,Mybatis會(huì)把這個(gè)類型的短名稱作為這個(gè)類型的別名,前提是該類上沒有標(biāo)注@Alias注解,否則將使用該注解對(duì)應(yīng)的值作為此種類型的別名。

    Xml代碼 收藏代碼

    <property name="typeAliases">

    <array>

    <value>com.tiantian.mybatis.model.Blog</value>

    <value>com.tiantian.mybatis.model.Comment</value>

    </array>

    </property>

    plugins:數(shù)組類型,用來指定Mybatis的Interceptor。

    typeHandlersPackage:用來指定TypeHandler所在的包,如果指定了該屬性,SqlSessionFactoryBean會(huì)自動(dòng)把該包下面的類注冊(cè)為對(duì)應(yīng)的TypeHandler。多個(gè)package之間可以用逗號(hào)或者分號(hào)等來進(jìn)行分隔。

    typeHandlers:數(shù)組類型,表示TypeHandler。

    接下來就是在Spring的applicationContext文件中定義我們想要的Mapper對(duì)象對(duì)應(yīng)的MapperFactoryBean了。通過MapperFactoryBean可以獲取到我們想要的Mapper對(duì)象。MapperFactoryBean實(shí)現(xiàn)了Spring的FactoryBean接口,所以MapperFactoryBean是通過FactoryBean接口中定義的getObject方法來獲取對(duì)應(yīng)的Mapper對(duì)象的。在定義一個(gè)MapperFactoryBean的時(shí)候有兩個(gè)屬性需要我們注入,一個(gè)是Mybatis-Spring用來生成實(shí)現(xiàn)了SqlSession接口的SqlSessionTemplate對(duì)象的sqlSessionFactory;另一個(gè)就是我們所要返回的對(duì)應(yīng)的Mapper接口了。

    定義好相應(yīng)Mapper接口對(duì)應(yīng)的MapperFactoryBean之后,我們就可以把我們對(duì)應(yīng)的Mapper接口注入到由Spring管理的bean對(duì)象中了,比如Service bean對(duì)象。這樣當(dāng)我們需要使用到相應(yīng)的Mapper接口時(shí),MapperFactoryBean會(huì)從它的getObject方法中獲取對(duì)應(yīng)的Mapper接口,而getObject內(nèi)部還是通過我們注入的屬性調(diào)用SqlSession接口的getMapper(Mapper接口)方法來返回對(duì)應(yīng)的Mapper接口的。這樣就通過把SqlSessionFactory和相應(yīng)的Mapper接口交給Spring管理實(shí)現(xiàn)了Mybatis跟Spring的整合。

    Spring的applicationContext.xml配置文件:

    Xml代碼 收藏代碼

    <?xml version="1.0" encoding="UTF-8"?>

    <beans xmlns=""

    xmlns:xsi="" xmlns:context=">"

    xmlns:mvc=""

    xsi:schemaLocation="

    ">

    <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代碼 收藏代碼

    <?xml version="1.0" encoding="UTF-8" ?>

    <!DOCTYPE mapper

    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

    "">

    <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>

    BlogMapper.java:

    Java代碼 收藏代碼

    package com.tiantian.mybatis.mapper;

    import java.util.List;

    import com.tiantian.mybatis.model.Blog;

    publicinterface BlogMapper {

    public Blog selectBlog(int id);

    publicvoid insertBlog(Blog blog);

    publicvoid updateBlog(Blog blog);

    publicvoid deleteBlog(int id);

    public List<Blog> selectAll();

    }

    BlogServiceImpl.java:

    Java代碼 收藏代碼

    package com.tiantian.mybatis.service.impl;

    import java.util.List;

    import javax.annotation.Resource;

    import org.springframework.stereotype.Service;

    import com.tiantian.mybatis.mapper.BlogMapper;

    import com.tiantian.mybatis.model.Blog;

    import com.tiantian.mybatis.service.BlogService;

    @Service

    publicclass BlogServiceImpl implements BlogService {

    private BlogMapper blogMapper;

    publicvoid deleteBlog(int id) {

    blogMapper.deleteBlog(id);

    }

    public Blog find(int id) {

    returnblogMapper.selectBlog(id);

    }

    public List<Blog> find() {

    returnblogMapper.selectAll();

    }

    publicvoid insertBlog(Blog blog) {

    blogMapper.insertBlog(blog);

    }

    publicvoid updateBlog(Blog blog) {

    blogMapper.updateBlog(blog);

    }

    public BlogMapper getBlogMapper() {

    returnblogMapper;

    }

    @Resource

    publicvoid setBlogMapper(BlogMapper blogMapper) {

    this.blogMapper = blogMapper;

    }

    }

    MapperScannerConfigurer

    利用上面的方法進(jìn)行整合的時(shí)候,我們有一個(gè)Mapper就需要定義一個(gè)對(duì)應(yīng)的MapperFactoryBean,當(dāng)我們的Mapper比較少的時(shí)候,這樣做也還可以,但是當(dāng)我們的Mapper相當(dāng)多時(shí)我們?cè)龠@樣定義一個(gè)個(gè)Mapper對(duì)應(yīng)的MapperFactoryBean就顯得速度比較慢了。為此Mybatis-Spring為我們提供了一個(gè)叫做MapperScannerConfigurer的類,通過這個(gè)類Mybatis-Spring會(huì)自動(dòng)為我們注冊(cè)Mapper對(duì)應(yīng)的MapperFactoryBean對(duì)象。

    如果我們需要使用MapperScannerConfigurer來幫我們自動(dòng)掃描和注冊(cè)Mapper接口的話我們需要在Spring的applicationContext配置文件中定義一個(gè)MapperScannerConfigurer對(duì)應(yīng)的bean。對(duì)于MapperScannerConfigurer而言有一個(gè)屬性是我們必須指定的,那就是basePackage。basePackage是用來指定Mapper接口文件所在的基包的,在這個(gè)基包或其所有子包下面的Mapper接口都將被搜索到。多個(gè)基包之間可以使用逗號(hào)或者分號(hào)進(jìn)行分隔。最簡單的MapperScannerConfigurer定義就是只指定一個(gè)basePackage屬性,如:

    Xml代碼 收藏代碼

    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">

    <property name="basePackage" value="com.tiantian.mybatis.mapper" />

    </bean>

    這樣MapperScannerConfigurer就會(huì)掃描指定基包下面的所有接口,并把它們注冊(cè)為一個(gè)個(gè)MapperFactoryBean對(duì)象。當(dāng)使用MapperScannerConfigurer加basePackage屬性的時(shí)候,我們上面例子的applicationContext配置文件將變?yōu)檫@樣:

    Xml代碼 收藏代碼

    <?xml version="1.0" encoding="UTF-8"?>

    <beans xmlns=""

    xmlns:xsi="" xmlns:context="">

    <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 class="org.mybatis.spring.mapper.MapperScannerConfigurer">

    <property name="basePackage" value="com.tiantian.mybatis.mapper" />

    </bean>

    </beans>

    有時(shí)候我們指定的基包下面的并不全是我們定義的Mapper接口,為此MapperScannerConfigurer還為我們提供了另外兩個(gè)可以縮小搜索和注冊(cè)范圍的屬性。一個(gè)是annotationClass,另一個(gè)是markerInterface。

    annotationClass:當(dāng)指定了annotationClass的時(shí)候,MapperScannerConfigurer將只注冊(cè)使用了annotationClass注解標(biāo)記的接口。

    markerInterface:markerInterface是用于指定一個(gè)接口的,當(dāng)指定了markerInterface之后,MapperScannerConfigurer將只注冊(cè)繼承自markerInterface的接口。

    如果上述兩個(gè)屬性都指定了的話,那么MapperScannerConfigurer將取它們的并集,而不是交集。即使用了annotationClass進(jìn)行標(biāo)記或者繼承自markerInterface的接口都將被注冊(cè)為一個(gè)MapperFactoryBean。

    現(xiàn)在假設(shè)我們的Mapper接口都繼承了一個(gè)SuperMapper接口,那么我們就可以這樣來定義我們的MapperScannerConfigurer。

    Xml代碼 收藏代碼

    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">

    <property name="basePackage" value="com.tiantian.mybatis.mapper" />

    <property name="markerInterface" value="com.tiantian.mybatis.mapper.SuperMapper"/>

    </bean>

    如果是都使用了注解MybatisMapper標(biāo)記的話,那么我們就可以這樣來定義我們的MapperScannerConfigurer。

    Xml代碼 收藏代碼

    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">

    <property name="basePackage" value="com.tiantian.mybatis.mapper" />

    <property name="annotationClass" value="com.tiantian.mybatis.annotation.MybatisMapper"/>

    </bean>

    除了用于縮小注冊(cè)Mapper接口范圍的屬性之外,我們還可以指定一些其他屬性,如:

    sqlSessionFactory:這個(gè)屬性已經(jīng)廢棄。當(dāng)我們使用了多個(gè)數(shù)據(jù)源的時(shí)候我們就需要通過sqlSessionFactory來指定在注冊(cè)MapperFactoryBean的時(shí)候需要使用的SqlSessionFactory,因?yàn)樵跊]有指定sqlSessionFactory的時(shí)候,會(huì)以Autowired的方式自動(dòng)注入一個(gè)。換言之當(dāng)我們只使用一個(gè)數(shù)據(jù)源的時(shí)候,即只定義了一個(gè)SqlSessionFactory的時(shí)候我們就可以不給MapperScannerConfigurer指定SqlSessionFactory。

    sqlSessionFactoryBeanName:它的功能跟sqlSessionFactory是一樣的,只是它指定的是定義好的SqlSessionFactory對(duì)應(yīng)的bean名稱。

    sqlSessionTemplate:這個(gè)屬性已經(jīng)廢棄。它的功能也是相當(dāng)于sqlSessionFactory的,因?yàn)榫拖袂懊嬲f的那樣,MapperFactoryBean最終還是使用的SqlSession的getMapper方法取的對(duì)應(yīng)的Mapper對(duì)象。當(dāng)定義有多個(gè)SqlSessionTemplate的時(shí)候才需要指定它。對(duì)于一個(gè)MapperFactoryBean來說SqlSessionFactory和SqlSessionTemplate只需要其中一個(gè)就可以了,當(dāng)兩者都指定了的時(shí)候,SqlSessionFactory會(huì)被忽略。

    sqlSessionTemplateBeanName:指定需要使用的sqlSessionTemplate對(duì)應(yīng)的bean名稱。

    注意:由于使用sqlSessionFactory和sqlSessionTemplate屬性時(shí)會(huì)使一些內(nèi)容在PropertyPlaceholderConfigurer之前加載,導(dǎo)致在配置文件中使用到的外部屬性信息無法被及時(shí)替換而出錯(cuò),因此官方現(xiàn)在新的Mybatis-Spring中已經(jīng)把sqlSessionFactory和sqlSessionTemplate屬性廢棄了,推薦大家使用sqlSessionFactoryBeanName屬性和sqlSessionTemplateBeanName屬性。

    xdowns.com

    Xml代碼 收藏代碼

    <?xml version="1.0" encoding="UTF-8"?>

    <beans xmlns=""

    xmlns:xsi="" xmlns:context="">

    <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 class="org.mybatis.spring.mapper.MapperScannerConfigurer">

    <property name="basePackage" value="com.tiantian.mybatis.mapper" />

    <property name="markerInterface" value="com.tiantian.mybatis.mapper.SuperMapper"/>

    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>

    </bean>

    </beans>

    SqlSessionTemplate

    除了上述整合之后直接使用Mapper接口之外,Mybatis-Spring還為我們提供了一種直接使用SqlSession的方式。Mybatis-Spring為我們提供了一個(gè)實(shí)現(xiàn)了SqlSession接口的SqlSessionTemplate類,它是線程安全的,可以被多個(gè)Dao同時(shí)使用。同時(shí)它還跟Spring的事務(wù)進(jìn)行了關(guān)聯(lián),確保當(dāng)前被使用的SqlSession是一個(gè)已經(jīng)和Spring的事務(wù)進(jìn)行綁定了的。而且它還可以自己管理Session的提交和關(guān)閉。當(dāng)使用了Spring的事務(wù)管理機(jī)制后,SqlSession還可以跟著Spring的事務(wù)一起提交和回滾。

    使用SqlSessionTemplate時(shí)我們可以在Spring的applicationContext配置文件中如下定義:

    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">

    <constructor-arg index="0" ref="sqlSessionFactory" />

    </bean>

    這樣我們就可以通過Spring的依賴注入在Dao中直接使用SqlSessionTemplate來編程了,這個(gè)時(shí)候我們的Dao可能是這個(gè)樣子:

    Java代碼 收藏代碼

    package com.tiantian.mybatis.dao;

    import java.util.List;

    import javax.annotation.Resource;

    import org.mybatis.spring.SqlSessionTemplate;

    import org.springframework.stereotype.Repository;

    import com.tiantian.mybatis.model.Blog;

    @Repository

    publicclass BlogDaoImpl implements BlogDao {

    private SqlSessionTemplate sqlSessionTemplate;

    publicvoid deleteBlog(int id) {

    sqlSessionTemplate.delete("com.tiantian.mybatis.mapper.BlogMapper.deleteBlog", id);

    }

    public Blog find(int id) {

    returnsqlSessionTemplate.selectOne("com.tiantian.mybatis.mapper.BlogMapper.selectBlog", id);

    }

    public List<Blog> find() {

    returnthis.sqlSessionTemplate.selectList("com.tiantian.mybatis.mapper.BlogMapper.selectAll");

    }

    publicvoid insertBlog(Blog blog) {

    this.sqlSessionTemplate.insert("com.tiantian.mybatis.mapper.BlogMapper.insertBlog", blog);

    }

    publicvoid updateBlog(Blog blog) {

    this.sqlSessionTemplate.update("com.tiantian.mybatis.mapper.BlogMapper.updateBlog", blog);

    }

    public SqlSessionTemplate getSqlSessionTemplate() {

    returnsqlSessionTemplate;

    }

    @Resource

    publicvoid setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {

    this.sqlSessionTemplate = sqlSessionTemplate;

    }

    }

    注:

    本文是基于Mybatis3.2.1、Mybatis-Spring1.1.0和Spring3.1寫的。

    更多信息請(qǐng)查看IT技術(shù)專欄

    更多信息請(qǐng)查看網(wǎng)絡(luò)編程
    易賢網(wǎng)手機(jī)網(wǎng)站地址:Mybatis整合Spring
    由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

    2026上岸·考公考編培訓(xùn)報(bào)班

    • 報(bào)班類型
    • 姓名
    • 手機(jī)號(hào)
    • 驗(yàn)證碼
    關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn) | 投訴建議
    工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
    云南網(wǎng)警備案專用圖標(biāo)
    聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號(hào):hfpxwx
    咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
    云南網(wǎng)警報(bào)警專用圖標(biāo)