mybatis和spring整合也就是把兩者的優點集合到一起下面我們看下配置步驟
-
導入jar
- 整合spring和mybatis需要mybatis-spring.jar我用的是1.2.0版本
- 整合需要用到spring數據源和事物支持,需要spring-jdbc和spring-tx的包
- spring中使用具體的數據源實現,此次需要dbcp,commons-dbcp及commons-pool包
- 導入后如圖所示
- spring官網下載地址:https://repo.spring.io/webapp/#/artifacts/browse/tree/General/libs-release-local/org/springframework/spring/4.3.2.RELEASE
- 另一個地址:http://repo.spring.io/release/org/springframework/spring/
- mybatis官網下載地址:https://github.com/mybatis/mybatis-3/releases
-
mybatis的配置請參考我之前的這篇:https://www.cnblogs.com/hfx123/p/9590509.html
-
搭建好mybatis框架后確保mybatis環境搭建沒有錯誤,在此基礎上進行spring融合
- 修改配置文件
- 首先需要把mybatis中數據庫連接和映射mapper文件的部分刪除 如下
-
<properties resource="database.properties"/>
-
<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>
- 刪除之后新建spring配置文件導入database.properties文件
<!-- 引入properties文件 --> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location" value="classpath:database.properties"/> </bean>
之后配置數據源其中大括號里面的名稱對應 database.properties文件中的名稱
-
<!-- 配置數據源 --> <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文件內容如下:
- 配置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>
-
測試
- 測試類代碼如下
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()); } } }
- 測試類代碼如下
自動生成映射器實現類
-
-
其實還有另外一種配置方法,因為上面的配置方法如果我換一個接口,那么又要修改配置文件那么有沒有好點的方法呢
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!-- basePackage屬性指定了掃描的基准包,MapperScannerConfigurer將遞歸掃描基准包(包括下面的子包)下所有接口 如果他們在sql映射文件中定義過,則將他們動態注冊為mapperFactoryBean,這樣既可批量產生映射器實現類 --> <property name="basePackage" value="cn.dao"/> </bean>
通過上面這一步就可以讓它自動生成映射器實現類,其中basePackage屬性中可以包含多個包名,多個包名直接使用逗號或分號隔開
-
注意如果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
- 注意:SQL映射文件中必須遵循以下命名規則
- 映射命名空間和映射器接口的名稱相同
- 映射元素的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