SpringMVC+Spring+Hibernate+Mybatis+Shiro等整合及開發(2)
spring+hibernate+mybatis整合
上面我們整合spring 和springmvc 因為都是spring的東西所以只要保證版本一致就能順利的跑起來。我使用的本本如下
<properties> <spring.version>4.3.14.RELEASE</spring.version> <mybatis.version>3.4.5</mybatis.version> <hinernate.version>5.1.12.Final</hinernate.version> </properties>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.45</version>
</dependency
如果你搭建的時候出現:org/hibernate/Query : Unsupported major.minor version 52.0
錯誤這因為你使用的 jdk版本,mysql驅動和hibernate不相容導致的,所以你需要切換本版試試
一.spring+hibernate整合
1.hibernate裝配流程
1). 讀取並解析配置檔案
2).讀取並解析對映資訊,建立SessionFactory
3). 開啟Sesssion
4).建立事務Transation
5). 持久化操作
6).提交事務
7).關閉Session
8). 關閉SesstionFactory
根據裝配流程需要先把配置檔案以spring配置檔案的形式保持了起來
<!--alibaba 連線池 配置資料來源--> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <!-- 基本屬性 url、user、password --> <property name="driverClassName" value="${jdbc.driverclass}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <!-- 配置初始化大小、最小、最大 --> <property name="initialSize" value="1" /> <property name="minIdle" value="1" /> <property name="maxActive" value="20" /> <!-- 配置獲取連線等待超時的時間 --> <property name="maxWait" value="60000" /> <!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連線,單位是毫秒 --> <property name="timeBetweenEvictionRunsMillis" value="60000" /> <!-- 配置一個連線在池中最小生存的時間,單位是毫秒 --> <property name="minEvictableIdleTimeMillis" value="300000" /> <!-- property name="validationQuery" value="SELECT 'x'" / --> <property name="testWhileIdle" value="true" /> <property name="testOnBorrow" value="true" /> <property name="testOnReturn" value="true" /> <!-- 開啟PSCache,並且指定每個連線上PSCache的大小 --> <property name="poolPreparedStatements" value="true" /> <property name="maxPoolPreparedStatementPerConnectionSize" value="20" /> <!-- 配置監控統計攔截的filters --> <property name="filters" value="stat" /> </bean> <!--hibernate 配置 建立HibernateSessionFactory--> <bean id="hibernateSessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <!--資料庫資訊--> <property name="dataSource" ref="dataSource"/> <property name="mappingLocations"><!--裝配entity--> <list><!--entity是根據資料庫表使用idea生成的--> <value>classpath:com/yanghs/common/entity/hbm/Authority.hbm.xml</value> <value>classpath:com/yanghs/common/entity/hbm/RoleAuthority.hbm.xml</value> <value>classpath:com/yanghs/common/entity/hbm/Roleinfo.hbm.xml</value> <value>classpath:com/yanghs/common/entity/hbm/UserRole.hbm.xml</value> <value>classpath:com/yanghs/common/entity/hbm/Userinfo.hbm.xml</value> </list> </property> <!--hibernate 配置設定--> <property name="hibernateProperties"> <props> <!--資料庫方言--> <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop> <!--更新表結構 create:表示啟動的時候先drop,再create create-drop: 也表示建立,只不過再系統關閉前執行一下drop update: 這個操作啟動的時候會去檢查schema是否一致,如果不一致會做scheme更新 validate: 啟動時驗證現有schema與你配置的hibernate是否一致,如果不一致就丟擲異常,並不做更新 --> <prop key="hibernate.hbm2ddl.auto">validate</prop> <!--是否顯示sql--> <prop key="hibernate.show_sql">true</prop> <!--是否格式化sql--> <prop key="hibernate.format_sql">true</prop> </props> </property> </bean> <!--二次封裝的hibernate的dao--> <bean id="hibernateDao" class="com.yanghs.common.dao.HibernateDao"> <property name="sessionFactory" ref="hibernateSessionFactory"/> </bean>
事務管理使用spring提供,因為同時使用hibernate 和 mybatis 所以事務交給spring管理。
<!-- 針對單一資料來源的事務管理器 spring提供事務管理 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 事務 攔截器方式-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 傳播行為 -->
<tx:method name="*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
</tx:attributes>
</tx:advice>
<!-- aop 使用那些包下的方法的帶事務 -->
<aop:config>
<aop:advisor advice-ref="txAdvice" pointcut="execution(* com.yanghs.*.service.impl.*.*(..))"/>
</aop:config>
根據hibernate的流程 用spring配置檔案實現了。在要使用hibernate 操作資料庫的地方使用 Resource注入就行
2.spring 與mybatis的整合流程基本一致增加如下的配置
<!--配置 sqlSessionFactory Mybatis-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 資料庫連線池 -->
<property name="dataSource" ref="dataSource" />
<!-- 載入mybatis配置檔案 -->
<property name="configLocation" value="classpath:sqlMapConfig.xml" />
</bean>
<!-- 生成sqlsession mybatis -->
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
至此spring+hibernate+mybatis整合的配置檔案就基本完。
3.資料庫結構
使用idea生成的entity就是這幾張表,初步是這樣後期會根據實際情況做修改
4.測試,增加userservice.java
package com.yanghs.common.service.impl;
import com.yanghs.common.dao.HibernateDao;
import com.yanghs.common.entity.hbm.Userinfo;
import com.yanghs.common.service.IUserService;
import org.mybatis.spring.SqlSessionTemplate;
import javax.annotation.Resource;
/**
* @author yanghs
* @Description:
* @date 2018/3/4 14:18
*/
public class UserService implements IUserService {
//注入 SqlSessionTemplate
@Resource(name = "sqlSessionTemplate")
SqlSessionTemplate dao;
//注入 hibernateDao
@Resource(name = "hibernateDao")
HibernateDao hibernateDao;
/**
*
* @param userinfo
* @return
* @throws Exception
*/
public Userinfo getUser(Userinfo userinfo) throws Exception {
return hibernateDao.findObject(userinfo);
}
}
增加controller測試方法 TestController.java
package com.yanghs.common.controller;
import com.yanghs.common.entity.hbm.Userinfo;
import com.yanghs.common.service.IUserService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
/**
* @author yanghs
* @Description:
* @date 2018/2/27 15:49
*/
/*springmvc controller註解 註冊為controller*/
@Controller
public class testController {
@Resource(name = "userService")
IUserService userService;
/**
* requestmapping 註解 設定訪問地址 method 設定訪問的方法
* 此註解可以在controller類上 設定後相當於 Struts2的namespace 訪問地址變為 類似 類/方法.do
* @param httpRequest
* @param map
* @return
* ResponseBody 註解讓當前方法返回json物件 轉換器就是 配置檔案裡面 配置的 fastjson
*/
@RequestMapping(value = "/a.do",method = RequestMethod.GET)
@ResponseBody
public Userinfo test1(HttpServletRequest httpRequest, @RequestParam Map map) throws Exception {
String a = (String) map.get("name");
//mv.setViewName("test");
return userService.getUser(new Userinfo(null,"yanghs",null,null));
}
}
訪問地址:http://localhost:8080/lab/a.do