Mybatis和spring整合


mybatis和spring整合也就是把兩者的優點集合到一起下面我們看下配置步驟

  1. 導入jar

    1. 整合spring和mybatis需要mybatis-spring.jar我用的是1.2.0版本
    2. 整合需要用到spring數據源和事物支持,需要spring-jdbc和spring-tx的包
    3. spring中使用具體的數據源實現,此次需要dbcp,commons-dbcp及commons-pool包
    4. 導入后如圖所示
    5. spring官網下載地址:https://repo.spring.io/webapp/#/artifacts/browse/tree/General/libs-release-local/org/springframework/spring/4.3.2.RELEASE
    6. 另一個地址:http://repo.spring.io/release/org/springframework/spring/
    7. mybatis官網下載地址:https://github.com/mybatis/mybatis-3/releases
  2. mybatis的配置請參考我之前的這篇:https://www.cnblogs.com/hfx123/p/9590509.html

  3. 搭建好mybatis框架后確保mybatis環境搭建沒有錯誤,在此基礎上進行spring融合

    1. 修改配置文件
      1. 首先需要把mybatis中數據庫連接和映射mapper文件的部分刪除 如下
      2. <properties resource="database.properties"/>
      3. <environments default="dpCommodity">
                <environment id="dpCommodity">
                    <transactionManager type="JDBC"/>
                    <dataSource type="POOLED">
                        <property name="driver" value="${driver}"/>
                        <property name="url" value="${url}"/>
                        <property name="username" value="${user}"/>
                        <property name="password" value="${pwd}"/>
                    </dataSource>
                </environment>
            </environments>
            <mappers>
                <mapper resource="cn/dao/CommodityMapper.xml"/>
            </mappers>
    2. 刪除之后新建spring配置文件導入database.properties文件
      <!-- 引入properties文件 -->
           <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
               <property name="location" value="classpath:database.properties"/>
           </bean>

      之后配置數據源其中大括號里面的名稱對應 database.properties文件中的名稱

    3. <!-- 配置數據源 -->
           <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
               <property name="driverClassName" value="${driver}"/>
               <property name="url" value="${url}"/>
               <property name="username" value="${user}"/>
               <property name="password" value="${pwd}"/>
           </bean>

       database文件內容如下:

    4. 配置sqlSessionFactory
      <!-- 配置sqlSessionFactory -->
          <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
              <!-- 引用數據源組件 -->
              <property name="dataSource" ref="dataSource"/>
              <!-- 引用mybatis配置文件中的配置 -->
              <property name="configLocation" value="classpath:mybatis-config.xml"/>
              <!-- 配置SQL映射文件信息 -->
              <property name="mapperLocations">
                  <list>
                      <value>classpath:cn/dao/**/*.xml</value>
                  </list>
              </property>
          </bean>

      其他配置 

<!-- 配置SQLsessionTemplate -->
    <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/>
    </bean>
    <!--  配置dao組件並注入SQLsession  session為實現類中的屬性 class中的路徑為 所需要使用接口的實現類路徑--> 
    <bean id="workinggMapper" class="cn.dao.impl.WorkinggMapperImpl">
        <property name="session" ref="sqlSessionTemplate"/>
    </bean>
    <!-- 配置業務bean並且注入 wM為業務bean中的屬性 class中的路徑為 所需要使用接口的業務實現bean路徑 -->
    <bean id="workinggService" class="cn.service.impl.WorkinggServiceImpl">
        <property name="wM" ref="workinggMapper"/>
    </bean>
  1. 測試

    1. 測試類代碼如下
      public class Test {
          public static void main(String[] args) {
              ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
              WorkinggService cs = (WorkinggServiceImpl)ctx.getBean("workinggService");
              List<Workingg> cList = cs.allWorking();
              for (Workingg w : cList) {
                  System.out.println(w.getTitle());
              }
          }
      }

自動生成映射器實現類

    1. 其實還有另外一種配置方法,因為上面的配置方法如果我換一個接口,那么又要修改配置文件那么有沒有好點的方法呢

        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
              <!-- basePackage屬性指定了掃描的基准包,MapperScannerConfigurer將遞歸掃描基准包(包括下面的子包)下所有接口
                  如果他們在sql映射文件中定義過,則將他們動態注冊為mapperFactoryBean,這樣既可批量產生映射器實現類
              -->
              <property name="basePackage" value="cn.dao"/>    
          </bean>

      通過上面這一步就可以讓它自動生成映射器實現類,其中basePackage屬性中可以包含多個包名,多個包名直接使用逗號或分號隔開

    2. 注意如果sqlSessionFactory配置了多個那么自動裝配則無法進行,需要指定 sqlSessionFactory如下

      <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
              <!-- basePackage屬性指定了掃描的基准包,MapperScannerConfigurer將遞歸掃描基准包(包括下面的子包)下所有接口
                  如果他們在sql映射文件中定義過,則將他們動態注冊為mapperFactoryBean,這樣既可批量產生映射器實現類
              -->
              <property name="basePackage" value="cn.dao"/>
              <!-- 注意此屬性時name,而不是sqlSessionFactory,為其賦值使用的是 value -->
              <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>    
          </bean>

      如上則可以自動生成映射器實現類 

      <!-- 定義業務bean -->
          <bean id="workinggService" class="cn.service.impl.WorkinggServiceImpl">
              <property name="wM" ref="workinggMapper"/>
          </bean>

      自動生成映射器實現類的名字默認為,接口名第一個單詞小寫后面的不變 如接口名:WorkinggMapper 默認名稱:workinggMapper

    3. 注意:SQL映射文件中必須遵循以下命名規則
      1. 映射命名空間和映射器接口的名稱相同
      2. 映射元素的id和映射器接口的方法相同

使用注解定義業務bean

    通過上面的改造,可不用手動生成映射器實現類了但是去依然要寫業務bean,這時候就有了注解當需要某種業務bean時執行添加注解即可

    如下吧之前生成業務bean的代碼替換成

  <!-- 自動掃描cn下面所包(包括子包)下面所有類 -->
    <context:component-scan base-package="cn"/>

再在業務bean中寫兩個注釋即可如下

 

業務bean繼承SqlSessionDaoSupport類

  修改之前的業務bean如下

package cn.service.impl;

import java.util.List;

import javax.annotation.Resource;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Service;

import cn.dao.WorkinggMapper;
import cn.pojo.Workingg;
import cn.service.WorkinggService;

//加上這行注釋掃描的時候則 會自動生成名為workinggService的業務bean
@Service("workinggService")
public class WorkinggServiceImpl implements WorkinggService {
    //掃描時會自動注入 WorkinggMapper
    @Resource
    WorkinggMapper wM;
    public WorkinggMapper getwM() {
        return wM;
    }

    public void setwM(WorkinggMapper wM) {
        this.wM = wM;
    }

    @Override
    public int screenTitle(String title) {
        
        return wM.screenTitle(title);
    }

    @Override
    public Workingg screenId(Integer id) {
        // TODO Auto-generated method stub
        return wM.screenId(id);
    }

    @Override
    public List<Workingg> allWorking() {
        // TODO Auto-generated method stub
        return wM.allWorking();
    }

    @Override
    public int count() {
        // TODO Auto-generated method stub
        return wM.count();
    }

    @Override
    public int addWorking(Workingg workingg) {
        // TODO Auto-generated method stub
        return wM.addWorking(workingg);
    }

    @Override
    public int del(Integer id) {
        // TODO Auto-generated method stub
        return wM.del(id);
    }

    @Override
    public int modify(Workingg workingg) {
        // TODO Auto-generated method stub
        return wM.modify(workingg);
    }
    public static WorkinggService getWorkinggService() {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        WorkinggService wService = (WorkinggServiceImpl)ctx.getBean("WorkinggService");
        return wService;
    }
}

繼承之后dao的實現類就沒什么用了,因為業務類以及不依賴dao的實現類了,繼承后代碼如下

package cn.service.impl;

import java.util.List;

import org.mybatis.spring.support.SqlSessionDaoSupport;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Service;

import cn.dao.WorkinggMapper;
import cn.pojo.Workingg;
import cn.service.WorkinggService;
public class WorkinggServiceImpl extends SqlSessionDaoSupport implements WorkinggService {

    @Override
    public int screenTitle(String title) {
        
        return super.getSqlSession().getMapper(WorkinggMapper.class).screenTitle(title);
    }

    @Override
    public Workingg screenId(Integer id) {
        // TODO Auto-generated method stub
        return super.getSqlSession().getMapper(WorkinggMapper.class).screenId(id);
    }

    @Override
    public List<Workingg> allWorking() {
        // TODO Auto-generated method stub
        return super.getSqlSession().getMapper(WorkinggMapper.class).allWorking();
    }

    @Override
    public int count() {
        // TODO Auto-generated method stub
        return super.getSqlSession().getMapper(WorkinggMapper.class).count();
    }

    @Override
    public int addWorking(Workingg workingg) {
        // TODO Auto-generated method stub
        return super.getSqlSession().getMapper(WorkinggMapper.class).addWorking(workingg);
    }

    @Override
    public int del(Integer id) {
        // TODO Auto-generated method stub
        return super.getSqlSession().getMapper(WorkinggMapper.class).del(id);
    }

    @Override
    public int modify(Workingg workingg) {
        // TODO Auto-generated method stub
        return super.getSqlSession().getMapper(WorkinggMapper.class).modify(workingg);
    }
    public static WorkinggService getWorkinggService() {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        WorkinggService wService = (WorkinggServiceImpl)ctx.getBean("WorkinggService");
        return wService;
    }
}

修改前的配置文件有映射,繼承之后不需要了

把這一段替換成了這段,測試類代碼不變就好了

<bean id="workinggService" class="cn.service.impl.WorkinggServiceImpl">
        <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
    </bean>

不清楚的可以去網盤下載這個項目跑下

鏈接:https://pan.baidu.com/s/1IaWdAkeK97V_XWcuzDdeLg 密碼:l2ji

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM