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