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以上支援。