1. 程式人生 > >spring和mybatis的整合簡介

spring和mybatis的整合簡介

今天我來說一下我spring和mybatis的整合,我也是才學這個只能給大家講一些粗淺的,有大神路過請指點一二 ,謝謝 好現在我們開始講解

首先 我們還是需要匯入jar包,這次我們需要的jar包比較多這裡寫圖片描述

第二步搭建整體的框架
包括:dao介面層,mapper.xml
pojo層,User
service層 service介面
serviceImpl 介面實現層
servlet控制層
第三步 搭建好框架之後我們就開始配置xml
建立一個mybatis-cfg.xml檔案
建立一個beans.xml檔案
第四步配置資料來源:
編寫beans.xml配置檔案,將DataSource資料來源,通過配置sqlsessionFactoryBean讀取mybatis的核心配置檔案,並且掃描實體類】
資料來源配置如下 可以說是建立一個驅動類:

    <!-- 配置資料來源 -->
        <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
            <property name="url" value="jdbc:mysql://localhost:3306/zhanghao?characterEncoding=UTF-8"
>
</property> <property name="username" value="zhanghao"></property> <property name="password" value="zhanghao"></property> </bean>

這裡的class的值是一個數據源驅動管理類,而且每個property的命名也是有緣由的,通過jar包的反編譯我們可以看到這個我也截了一段給大家看一下

public class DriverManagerDataSource
extends AbstractDriverBasedDataSource {
public DriverManagerDataSource() { } public DriverManagerDataSource(String url) { setUrl(url); } public DriverManagerDataSource(String url, String username, String password) { setUrl(url); setUsername(username); setPassword(password); } public DriverManagerDataSource(String url, Properties conProps) { setUrl(url); setConnectionProperties(conProps); } public void setDriverClassName(String driverClassName) { Assert.hasText(driverClassName, "Property 'driverClassName' must not be empty"); String driverClassNameToUse = driverClassName.trim(); try { Class.forName(driverClassNameToUse, true, ClassUtils.getDefaultClassLoader()); } catch (ClassNotFoundException ex) { throw new IllegalStateException("Could not load JDBC driver class [" + driverClassNameToUse + "]", ex); }

第四步,利用bean建立一個sqlSessionFactoryBean

<!--配置SqlSessionFactoryBean讀取mybatis核心配置檔案 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation" value="classpath:mybatis-cfg.xml" />
        <property name="typeAliasesPackage" value="cn.mmmm.pojo" />
    </bean>

這是初始化sqlSessionFactoryBean,property的name是對應類的屬性,這些都是通過反編譯jar得到的這裡也給大家截了一些

 private static final Log LOGGER = LogFactory.getLog(SqlSessionFactoryBean.class);
  private Resource configLocation;
  private Resource[] mapperLocations;
  private DataSource dataSource;
  private TransactionFactory transactionFactory;
  private Properties configurationProperties;
  private SqlSessionFactoryBuilder sqlSessionFactoryBuilder;
  private SqlSessionFactory sqlSessionFactory;
  private String environment;
  private boolean failFast;
  private Interceptor[] plugins;
  private TypeHandler<?>[] typeHandlers;
  private String typeHandlersPackage;
  private Class<?>[] typeAliases;
  private String typeAliasesPackage;
  private Class<?> typeAliasesSuperType;
  private DatabaseIdProvider databaseIdProvider;
  private ObjectFactory objectFactory;
  private ObjectWrapperFactory objectWrapperFactory;

這是對應的一些屬性,我沒有都配置,只把用到的配置了

第五步 配置掃描mapper的對映介面類

<!-- 掃描mybatis對映介面類 -->
        <bean id="userMapper"  class="org.mybatis.spring.mapper.MapperFactoryBean">
            <property name="mapperInterface" value="cn.mmmm.mapper.UserMapper"></property>
            <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
        </bean>

這也是對應的類,我也反編譯了,截取了屬性給大家看

private Class<T> mapperInterface;

這是這個類的唯一一個屬性是對應的介面,第二個是和工廠發生關係,這相當於寫到getmapper的地方

馬上就要到頭了堅持一下,第六步:建立service實現類:引用userMapper

<!--    建立service實現類 -->
    <bean id="userService" class="cn.mmmm.service.impl.UserServiceImpl">
     <property name="userMapper" ref="userMapper"></property>
    </bean>

到這我們其實可以去寫一個測試類看看準確性了我 這也提供了測試類 方便大家,其實寫這個主要是細心,我有時候也會因為馬虎而費好大的勁;
測試:

package cn.bjsxt.test;

import java.util.List;

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




import cn.mmmm.service.impl.UserServiceImpl;

public class Test {
    public static void main(String[] args) {
        ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
        UserServiceImpl us =  (UserServiceImpl) ac.getBean("userService");
        System.out.println(us.findAll());
}
}

最後我們要加一個事務管理,為什麼要加入事務管理呢?大家知道事務的四大特性嗎?原子性,一致性,隔離性,永續性。因為有了事務,我們的資料才會更安全,減少不安全因素
這裡一次我就都給出了
1.在sping配置檔案中新增名稱空間
2.新增事務管理類
3.配置事務通知
4.配置事務的切面

 <!-- 建立事務管理 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"></property>
    </bean>

    <tx:advice id="txAdvice" transaction-manager="transactionManager">
            <!-- 配置事務傳播特性:propagation:REQUIRED:每次查詢的時候,看是否開啟事務,如果沒有開啟事務,則開啟事務 -->
        <tx:attributes>
            <tx:method name="add" propagation="REQUIRED"/>
            <tx:method name="delete" propagation="REQUIRED" />
            <tx:method name="update" propagation="REQUIRED"/>
            <tx:method name="get" read-only="true"/>
            <tx:method name="*" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>

    <!-- 配置切面 -->
    <aop:config>
        <aop:pointcut expression="execution(* cn.mmmm.service.impl.*.*(..))" id="pointcut"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/>
    </aop:config>

最後說一下事務的傳播特性
1、Propagation.REQUIRED
方法被呼叫時自動開啟事務,在事務範圍內使用則使用同一個事務,否則開啟新事務。
2、Propagation.REQUIRES_NEW
無論何時自身都會開啟事務
3、Propagation.SUPPORTS
自身不會開啟事務,在事務範圍內則使用相同事務,否則不使用事務
4、Propagation.NOT_SUPPORTED
自身不會開啟事務,在事務範圍內使用掛起事務,執行完畢恢復事務
5、Propagation.MANDATORY
自身不開啟事務,必須在事務環境使用否則報錯
6、Propagation.NEVER
自身不會開啟事務,在事務範圍使用丟擲異常
7、Propagation.NESTED
如果一個活動的事務存在,則執行在一個巢狀的事務中. 如果沒有活動事務, 則按TransactionDefinition.PROPAGATION_REQUIRED 屬性執行。需要JDBC3.0以上支援。