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





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值