1. 程式人生 > >SpringMVC+Spring+Hibernate+Mybatis+Shiro等整合及開發(2)

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