spring+springMVC+hibernate整合
首先我们要知道hibernate五大对象:,本实例通过深入的使用这五大对象和spring+springMVC相互结合,体会到框架的好处,提高我们的开发效率
Hibernate有五大核心接口,分别是:Session
Transaction Query SessionFactoryConfiguration 。这五个接口构成了Hibernate运行的基本要素,可以执行存取,持久化,事务管理等操作。这五个接口可以位于系统的业务逻辑层和持久化层。下面是一张Hibernate的关系图:
Session接口:
Session接口 Session 接口对于Hibernate
开发人员来说是一个最重要的接口。然而在Hibernate中,实例化的Session是一个轻量级的类,创建和销毁它都不会占用很多资源。这在实际项目中确实很重要,因为在客户程序中,可能会不断地创建以及销毁Session对象,如果Session
的开销太大,会给系统带来不良影响。但是Session对象是非线程安全的,因此在你的设计中,最好是一个线程只创建一个Session对象。
session可以看作介于数据连接与事务管理一种中间接口。我们可以将session想象成一个持久对象的缓冲区,Hibernate能检测到这些持久对象的改变,并及时刷新数据库。我们有时也称Session是一个持久层管理器,因为它包含这一些持久层相关的操作,
诸如存储持久对象至数据库,以及从数据库从获得它们。需要注意的是,Hibernate的session不同于JSP 应用中的HttpSession。当我们使用session这个术语时,我们指的Hibernate 中的session,而我们以后会将HttpSesion 对象称为用户session。
SessionFactory接口:
SessionFactroy接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
Transaction接口
Transaction接口负责事务相关的操作,一般在Hibernate的增删改中出现,但是使用Hibernate的人一般使用Spring去管理事务。
Query接口
Query负责执行各种数据库查询。它可以使用HQL语言或SQL语句两种表达方式。它的返回值一般是List。需要自己转换。
Configuration接口:
Configuration对象用于配置并根启动Hibernate。Hibernate应用通过Configuration实例来指定对象—关系映射文件的位置或者动态配置Hibernate的属性,然后创建SessionFactory实例。我们可以查看Configuration的源代码,它的configure()方法是这样实现的:
了解了这五大对象之后,,以上博客我们配置好了spring+springMVC的环境,现在我们继续集成hibernate的相关配置,框架图如下:
第一步:引入相关的包
(对于每个包,我们要有意识的去了解其功能,这样今后的时候项目中报错之后我们也可以及时知道错误出在哪里?)
第二: 继续配置hibernatexml文件( springAnnotation-hibernate.xml)
- <span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;"><?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd" [
- <!ENTITY contextInclude SYSTEM "org/springframework/web/context/WEB-INF/contextInclude.xml">
- ]>
- <beans>
- <!-- 配置hibernate相关数据库的操作 -->
- <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
- <!-- 数据库的驱动 -->
- <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
- <!-- 数据库的Id,用户名与密码 -->
- <property name="url" value="jdbc:oracle:thin:@192.168.24.248:1521:ORCL"/>
- <property name="username" value="lishehe"/>
- <property name="password" value="lishehe"/>
- </bean>
- <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
- <property name="dataSource" ref="dataSource"/>
- <property name="hibernateProperties">
- <props>
- <!-- 配置不同数据库的方言 -->
- <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
- <!-- 其实这个参数的作用主要用于:自动创建|更新|验证数据库表结构。如果不是此方面的需求建议set value="none".
- 其它几个参数的意思,我解释一下:
- validate 加载hibernate时,验证创建数据库表结构
- create 每次加载hibernate,重新创建数据库表结构,这就是导致数据库表数据丢失的原因。
- create-drop 加载hibernate时创建,退出是删除表结构
- update 加载hibernate自动更新数据库结构 -->
- <prop key="hibernate.hbm2ddl.auto">update</prop>
- <!-- 是否显示sql语句 -->
- <prop key="hibernate.show_sql">true</prop>
- <prop key="hiberante.format_sql">true</prop>
- </props>
- </property>
- <property name="configLocations">
- <list>
- <value>
- <!-- 读取和实体相关的xml -->
- classpath*:com/tgb/web/controller/hibernate/hibernate.cfg.test.xml
- </value>
- </list>
- </property>
- </bean>
- <!-- 定义事务管理器(声明式的事务) -->
- <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
- <property name="sessionFactory" ref="sessionFactory"></property>
- </bean>
- <bean id="transactionBese" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" lazy-init="true" abstract="true">
- <!-- 配置事务管理器 -->
- <property name="transactionManager" ref="transactionManager"></property>
- <!-- 配置事务管理器 -->
- <property name="transactionAttributes">
- <props>
- <!-- 下面就开始配置各个模块所必须的部分,在各自的applicationContext-XXX-beans.xml配置的对于事务管理的详细信息。
- 首先就是配置事务的传播特性,如下: -->
- <!-- 配置事务传播特性 -->
- <prop key="add*">PROPAGATION_REQUIRED,-Exception</prop>
- <prop key="update*">PROPAGATION_REQUIRED,-Exception</prop>
- <prop key="insert*">PROPAGATION_REQUIRED,-Exception</prop>
- <prop key="modify*">PROPAGATION_REQUIRED,-Exception</prop>
- <prop key="delete*">PROPAGATION_REQUIRED,-Exception</prop>
- <prop key="get*">PROPAGATION_NEVER</prop>
- </props>
- </property>
- </bean>
- </beans>
- </span></span></span>
第三: 新建IUserDAO
- <span style="font-size:18px;"><span style="font-size:18px;">package com.tgb.web.controller.dao;
- import java.util.List;
- import com.tgb.web.controller.entity.User;
- public interface IUserDAO {
- public void addUser(User user);
- public List<User> getAllUser();
- public boolean delUser(String id);
- public User getUser(String id);
- public boolean updateUser(User user);
- }
- </span></span>
实现类UserDAo
- <span style="font-size:18px;"><span style="font-size:18px;">package com.tgb.web.controller.dao;
- import java.util.List;
- import org.hibernate.Query;
- import org.hibernate.SessionFactory;
- import com.tgb.web.controller.entity.User;
- public class UserDAO implements IUserDAO {
- private SessionFactory sessionFactory;
- public void setSessionFactory(SessionFactory sessionFactory) {
- this.sessionFactory = sessionFactory;
- }
- @Override
- public void addUser(User user) {//添加用户
- sessionFactory.getCurrentSession().save(user);
- }
- @Override
- public List<User> getAllUser() {//查找所有用户信息
- String hql = "from User";
- Query query = sessionFactory.getCurrentSession().createQuery(hql);
- return query.list();
- }
- @Override
- public boolean delUser(String id) {//删除用户
- String hql = "delete User u where u.id=?";
- Query query = sessionFactory.getCurrentSession().createQuery(hql);
- query.setString(0, id);
- return (query.executeUpdate() > 0);
- }
- @Override
- public User getUser(String id) {//根据id得到单个用户
- String hql = "from User u where u.id=?";
- Query query = sessionFactory.getCurrentSession().createQuery(hql);//此时使用的是hql语句
- query.setString(0, id);
- return (User) query.uniqueResult();
- }
- @Override
- public boolean updateUser(User user) {//修改用户信息,hql语句
- String hql = "update User u set u.userName=?,u.age=? where u.id=?";
- Query query = sessionFactory.getCurrentSession().createQuery(hql);
- query.setString(0, user.getUserName());
- query.setString(1, user.getAge());
- query.setString(2, user.getId());
- return (query.executeUpdate() > 0);
- }
- }
- </span></span>
第四: 新建实体User
- <span style="font-size:18px;"><span style="font-size:18px;">package com.tgb.web.controller.entity;
- import javax.persistence.Column;
- import javax.persistence.Entity;
- import javax.persistence.GeneratedValue;
- import javax.persistence.Id;
- import javax.persistence.Table;
- import org.hibernate.annotations.GenericGenerator;
- @Entity
- @Table(name="T_USER")
- public class User {
- @Id
- @GeneratedValue(generator = "system-uuid") //使用uuid生成主键的方式
- @GenericGenerator(name = "system-uuid", strategy = "uuid")
- @Column(length=32)
- private String id;
- @Column(length=32)
- private String userName;
- @Column(length=32)
- private String age;
- public String getUserName() {
- return userName;
- }
- public void setUserName(String userName) {
- this.userName = userName;
- }
- public String getAge() {
- return age;
- }
- public void setAge(String age) {
- this.age = age;
- }
- public String getId() {
- return id;
- }
- public void setId(String id) {
- this.id = id;
- }
- }
- </span></span>
通常是 hibernate.cfg.xml)中声明持久性类 hibernate.cfg.test.xml
- <span style="font-size:18px;"><span style="font-size:18px;"><!DOCTYPE hibernate-configuration PUBLIC
- "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
- "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
- <!-- (通常是 hibernate.cfg.xml)中声明持久性类: -->
- <hibernate-configuration>
- <session-factory>
- <mapping class="com.tgb.web.controller.entity.User"/>
- </session-factory>
- </hibernate-configuration></span></span>
第五 : IUserManager
- <span style="font-size:18px;"><span style="font-size:18px;">package com.tgb.web.controller.service;
- import java.util.List;
- import com.tgb.web.controller.entity.User;
- public interface IUserManager {
- public void addUser(User user);
- public List<User> getAllUser();
- public boolean delUser(String id);
- public User getUser(String id);
- public boolean updateUser(User user);
- }
- </span></span>
UserManager实现类
- <span style="font-size:18px;"><span style="font-size:18px;">package com.tgb.web.controller.service;
- import java.util.List;
- import com.tgb.web.controller.dao.IUserDAO;
- import com.tgb.web.controller.entity.User;
- public class UserManager implements IUserManager {
- private IUserDAO userDao;
- public void setUserDao(IUserDAO userDao) {
- this.userDao = userDao;
- }
- @Override
- public void addUser(User user) {
- userDao.addUser(user);
- }
- @Override
- public List<User> getAllUser() {
- return userDao.getAllUser();
- }
- @Override
- public boolean delUser(String id) {
- return userDao.delUser(id);
- }
- @Override
- public User getUser(String id) {
- return userDao.getUser(id);
- }
- @Override
- public boolean updateUser(User user) {
- return userDao.updateUser(user);
- }
- }
- </span></span>
第六 UserController,控制类
- <span style="font-size:18px;">package com.tgb.web.controller;
- import java.io.IOException;
- import java.io.PrintWriter;
- import java.util.List;
- import javax.annotation.Resource;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.RequestMapping;
- import com.tgb.web.controller.entity.User;
- import com.tgb.web.controller.service.IUserManager;
- @Controller
- @RequestMapping("/user")
- public class UserController {
- @Resource(name="userManager")// 获取spring配置文件中bean的id为userManager的,并注入
- private IUserManager userManager;
- @RequestMapping("/toAddUser")
- public String toAddUser(){
- return "/addUser";
- }
- @RequestMapping("/addUser")// 请求url地址映射,类似Struts的action-mapping
- public String addUser(User user){
- userManager.addUser(user);
- return "redirect:/user/getAllUser";
- }
- @RequestMapping("/getAllUser")
- public String getAllUser(HttpServletRequest request){
- List<User> user = userManager.getAllUser();
- request.setAttribute("user", user);
- return "/userManager";
- }
- @RequestMapping("/delUser")
- public void delUser(String id,HttpServletResponse response){
- String result = "{\"result\":\"error\"}";
- if(userManager.delUser(id)){
- result = "{\"result\":\"success\"}";
- }
- PrintWriter out = null;
- response.setContentType("application/json");
- try {
- out = response.getWriter();
- out.write(result);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- @RequestMapping("/getUser")
- public String getUser(String id,HttpServletRequest request){
- User user = userManager.getUser(id);
- request.setAttribute("user", user);
- return "/editUser";
- }
- @RequestMapping("/updateUser")
- public String updateUser(User user,HttpServletRequest request){
- if(userManager.updateUser(user)){
- user = userManager.getUser(user.getId());
- request.setAttribute("user", user);
- return "/editUser";
- }else{
- return "/error";
- }
- }
- }
- </span>
第七:前台页面(详细内容不再详列出,源码分享给大家)
运行效果
:
总结
这个过程虽然简单,但是自己操作的过程中还是出现了很多的问题,解决问题,快速成长,进一步验证了一句话:实践是检验真理的唯一标准!
转自 http://blog.csdn.net/lishehe/article/details/38356261
源码下载 http://download.csdn.net/detail/lishehe/7708997
源码下载 https://pan.baidu.com/s/1kVeDlcV
spring+springMVC+hibernate整合的更多相关文章
- 框架篇:Spring+SpringMVC+hibernate整合开发
前言: 最近闲的蛋疼,搭个框架写成博客记录下来,拉通一下之前所学知识,顺带装一下逼. 话不多说,我们直接步入正题. 准备工作: 1/ IntelliJIDEA的安装配置:jdk/tomcat等..(本 ...
- spring+springmvc+hibernate整合遇到的问题
spring+springmvc+hibernate整合遇到的问题2016年10月20日 23:24:03 守望dfdfdf 阅读数:702 标签: ssh学习经历的异常exception异常框架更多 ...
- springmvc框架(Spring SpringMVC, Hibernate整合)
直接干货 model 考虑给用户展示什么.关注支撑业务的信息构成.构建成模型. control 调用业务逻辑产生合适的数据以及传递数据给视图用于呈献: view怎样对数据进行布局,以一种优美的方式展示 ...
- spring+springmvc+hibernate 整合
三大框架反反复复搭了很多次,虽然每次都能搭起来,但是效率不高.最近重新搭了一次,理顺了思路,整理了需要注意的地方,分享出来. 工具:Eclipse(jdk 1.7) spring和hibernate版 ...
- Spring MVC基础知识整理➣Spring+SpringMVC+Hibernate整合操作数据库
概述 Hibernate是一款优秀的ORM框架,能够连接并操作数据库,包括保存和修改数据.Spring MVC是Java的web框架,能够将Hibernate集成进去,完成数据的CRUD.Hibern ...
- Spring+SpringMvc+Hibernate整合记录
Spring+SpringMvc+Hibernate+Maven整合各大配置文件记录 1.Idea新建的Maven架构 2.Maven的对象模型的内容 <project xmlns=" ...
- 笔记48 Spring+SpringMVC+Hibernate整合
搭建Spring+SpringMVC+Hibernate的框架的思路如下: 1.创建Maven项目,按需映入Maven包依赖. 2.搭建Spring:配置Spring对控件层Bean的注入. 3.搭建 ...
- spring+springmvc+hibernate整合实例
最近要弄一个自动化生成表及其实体对应的增删改查的框架,于是我想到了hibernate,hibernate就有根据实体自动建表,而且增删改查,都不需要想mybatis那样在xml文件中配置. 不过怎样让 ...
- SSH(Spring SpringMVC Hibernate)框架整合
项目说明: 使用SSH(Spring SpringMVC Hibernate)框架整合添加部门功能 项目结构 1.导入依赖jar包 <!--单测--> <dependency&g ...
随机推荐
- Codeforces 954H Path Counting(DP)
题目链接 Path Counting 题意 给定一棵高度为$n$的树,给出每一层的每个点的儿子个数(某一层的所有点儿子个数相同). 令$f_{k}$为长度为$k$的路径条数,求$f_{1}, ...
- Google Kickstart Round E 2018 B. Milk Tea
太蠢了,,,因为初始化大数据没过,丢了10分,纪念一下这个错误 大概思路:先求出让损失值最小的排列,由已生成的这些排列,通过更改某一个位置的值,生成下一个最优解,迭代最多生成m+1个最优解即可,遍历求 ...
- 用jmeter进行多用户并发压力测试
测试要求如下,多用户同时登陆web应用程序,并进行操作,查看在多用户操作下,程序的performence.恰好,jemter下有个CSV Data Set Config,它用来设定一组参数,以便在向程 ...
- ARC 098 D - Xor Sum 2
Problem Statement There is an integer sequence A of length N. Find the number of the pairs of intege ...
- Linux下查看某个进程的网络带宽占用情况
说明: 1.可能查看某个进程的带宽占用需要明确知道PID.进程名字.发送速度.接收速度. 2.很遗憾,在Linux原生的软件中没有这样的一款,只能额外装,最符合以上的情况就只有nethogs. 3.n ...
- Ubuntu 16.04/CentOS 6.9安装Apache压力(并发)测试工具ab
说明: ab工具已经在Apache中包含,如果不想安装Apache,那么可以使用下面方法单独安装. 安装: Ubuntu: sudo apt-get install apache2-utils Cen ...
- 有关奇葩的mex编程时的matlab出现栈内存错误的问题
错误提示信息 (ntdll.dll) (MATLAB.exe中)处有未经处理的异常:0xC0000374:堆已损坏 该错误的表现是,matlab调用.mexw64函数时,第一次调用正常,第二次调用出现 ...
- iOS开发之字符串比较
Object-c中比较两个字符串是否相等时,应该用isEqualToString:而不能仅仅只是比较字符串的指针值. NSString *str1=@"hello 1"; NSS ...
- django发送邮箱
要用django发送邮箱之前需要在setting中配置一下 EMAIL_HOST = 'smtp.qq.com' EMAIL_PORT = 25 EMAIL_HOST_USER = 'xxx@qq.c ...
- Java之Jackson框架
在Jackson框架中,提供了三种方式用来处理JSON数据: 流式API 在该方式下,使用JsonParser读取JSON数据,使用JsonGenerator写JSON数据.这种方式性能最佳(最低开销 ...