之前用maven+spring+mybatis+spring mvc搭建了一个web项目,用于学习spring及相关知识,现在打算将mybatis换成hibernate,一样搭建一个框架。

其实mybatis或者hibernate都只是orm框架,负责数据持久层的工作,spring对这二者都提供了较好的支持。只不过在具体的实现配置上有一些差异。

话不多说,接下来以一个实例一步一步介绍如何搭建spring+hibernate的框架。

1.新建maven项目

导入必要的jar包。关于如何新建maven项目,可以看这篇文章。maven安装配置及使用maven创建一个web项目

2.引入jar包

我们来看下maven项目的pom.xml文件,这份文件是我从之前做maven+spring+mybatis+spring mvc项目的pom.xml文件中拷贝过来,并且将其中的mybatis相关包换成hibernate的相关包。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.</modelVersion>
<groupId>com.xdx</groupId>
<artifactId>warrior_hibernate</artifactId>
<packaging>war</packaging>
<version>0.0.-SNAPSHOT</version>
<name>warrior_hibernate Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<!-- spring核心包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.2..RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.2..RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.2..RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.2..RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.2..RELEASE</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.2..RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.2..RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.2..RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>4.2..RELEASE</version>
</dependency>
<!-- jdbc驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.-dmr</version>
</dependency>
<!-- hibernate核心包 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.3..Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.3..Final</version>
</dependency>
<!-- 连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.</version>
</dependency>
<!-- 打印日志 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.</version>
</dependency>
<!-- 其他 -->
<!-- jsp标签 -->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
<exclusions>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
<exclusion>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jstl-impl</artifactId>
<version>1.2</version>
<exclusions>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
<exclusion>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
</exclusion>
<exclusion>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- net.sf.json-lib -->
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
<!-- websocket -->
<dependency>
<groupId>org.java-websocket</groupId>
<artifactId>Java-WebSocket</artifactId>
<version>1.3.</version>
</dependency>
<!-- 文件上传 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.</version>
</dependency>
<!-- 分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.0.-beta</version>
</dependency>
<!-- 百度富文本 -->
<dependency>
<groupId>com.github.qiuxiaoj</groupId>
<artifactId>ueditor</artifactId>
<version>1.1.</version>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version></version>
</dependency>
<!-- 防止responseBody中文乱码 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.5.</version>
</dependency> <dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.</version>
</dependency>
<!-- 邮件 -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>javax.mail-api</artifactId>
<version>1.6.</version>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>smtp</artifactId>
<version>1.6.</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>mailapi</artifactId>
<version>1.6.</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.7</version>
</dependency>
<!-- quartz -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.</version>
</dependency>
<!-- redis -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.8..RELEASE</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.</version>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
<version>1.3..RELEASE</version>
<type>pom</type>
</dependency>
<!-- 照片处理 -->
<dependency>
<groupId>com.mortennobel</groupId>
<artifactId>java-image-scaling</artifactId>
<version>0.8.</version>
</dependency>
<!-- 测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- 第三方统计 -->
<dependency>
<groupId>net.bull.javamelody</groupId>
<artifactId>javamelody-core</artifactId>
<version>1.69.</version>
</dependency>
</dependencies>
<build>
<finalName>warrior_hibernate</finalName>
</build>
</project>

主要的包是spring核心包,hibernate核心包,jdbc驱动,以及测试包等,其他包是今后扩展功能的时候用到的,暂时可以不用。

这边还需要注意的是,我本来用的是hibernate5.x的包,但是在启动项目的时候报错了,最后查出是因为包的版本太高,与spring的jar包发生了冲突,后面将其降为hibernate4.x才排除了错误。具体的排错过程,可以看这里。tomcat启动失败的一种可能性

3.建立数据库

并且建表。选取其中一个表t_admin,其表结构如下图所示。

4.建立实体对象

既然是用hibernate,则需要为数据库的表对象建立相应的java实体对象。具体可以参考这边文章。使用Myeclipse为数据表创建hibernate实体对象

创建后的实体文件如下所示。

TAdmin.java

package com.xdx.entity;

import java.sql.Timestamp;

/**
* TAdmin entity. @author MyEclipse Persistence Tools
*/ public class TAdmin implements java.io.Serializable { // Fields private Integer adminId;
private String adminName;
private String password;
private String realName;
private Integer roleId;
private Timestamp createTime;
private Timestamp updateTime;
private Integer isDel; // Constructors /** default constructor */
public TAdmin() {
} /** minimal constructor */
public TAdmin(String password, Integer roleId, Timestamp createTime,
Integer isDel) {
this.password = password;
this.roleId = roleId;
this.createTime = createTime;
this.isDel = isDel;
} /** full constructor */
public TAdmin(String adminName, String password, String realName,
Integer roleId, Timestamp createTime, Timestamp updateTime,
Integer isDel) {
this.adminName = adminName;
this.password = password;
this.realName = realName;
this.roleId = roleId;
this.createTime = createTime;
this.updateTime = updateTime;
this.isDel = isDel;
} // Property accessors public Integer getAdminId() {
return this.adminId;
} public void setAdminId(Integer adminId) {
this.adminId = adminId;
} public String getAdminName() {
return this.adminName;
} public void setAdminName(String adminName) {
this.adminName = adminName;
} public String getPassword() {
return this.password;
} public void setPassword(String password) {
this.password = password;
} public String getRealName() {
return this.realName;
} public void setRealName(String realName) {
this.realName = realName;
} public Integer getRoleId() {
return this.roleId;
} public void setRoleId(Integer roleId) {
this.roleId = roleId;
} public Timestamp getCreateTime() {
return this.createTime;
} public void setCreateTime(Timestamp createTime) {
this.createTime = createTime;
} public Timestamp getUpdateTime() {
return this.updateTime;
} public void setUpdateTime(Timestamp updateTime) {
this.updateTime = updateTime;
} public Integer getIsDel() {
return this.isDel;
} public void setIsDel(Integer isDel) {
this.isDel = isDel;
} }

TAdmin.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="com.xdx.entity.TAdmin" table="t_admin" catalog="qgranite">
<id name="adminId" type="java.lang.Integer">
<column name="admin_id" />
<generator class="native" />
</id>
<property name="adminName" type="java.lang.String">
<column name="admin_name" length="100" />
</property>
<property name="password" type="java.lang.String">
<column name="password" length="100" not-null="true" />
</property>
<property name="realName" type="java.lang.String">
<column name="real_name" length="100" />
</property>
<property name="roleId" type="java.lang.Integer">
<column name="role_id" not-null="true" />
</property>
<property name="createTime" type="java.sql.Timestamp">
<column name="create_time" length="19" not-null="true" />
</property>
<property name="updateTime" type="java.sql.Timestamp">
<column name="update_time" length="19" />
</property>
<property name="isDel" type="java.lang.Integer">
<column name="is_del" not-null="true" />
</property>
</class>
</hibernate-mapping>

5.创建项目的主要包

分别创建com.xdx.entity,com.xdx.service,com.xdx.dao,com.xdx.controller,com.xdx.util等包。如下图所示。并将上面生成的实体放入com.xdx.entity包中。

6.编写数据源配置文件

项目采用阿里数据连接池,druid。jdpc.properities配置文件如下。

#数据源1
url:jdbc:mysql://xxx.xxx.xxx.xxx:3306/qgranite?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=UTC&useSSL=false
driverClassName:com.mysql.cj.jdbc.Driver
username:xdx
password:xxxxxxxxx
filters:stat
maxActive:20
initialSize:1
maxWait:60000
minIdle:10
maxIdle:15
timeBetweenEvictionRunsMillis:60000
minEvictableIdleTimeMillis:300000
validationQuery:SELECT 'x'
testWhileIdle:true
testOnBorrow:false
testOnReturn:false
maxOpenPreparedStatements:20
removeAbandoned:true
removeAbandonedTimeout:1800
logAbandoned:true
# hibernate.X
hibernate.connection.driverClass=org.gjt.mm.mysql.Driver
hibernate.connection.url=jdbc:mysql://139.196.235.228:3306/qgranite
hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
hibernate.connection.username=xdx
hibernate.connection.password=wonyen@1602
hibernate.show_sql=true
#hibernate.hbm2ddl.auto=create-drop 这边千万不要写create-drop,不然每次项目启动他会先删除表,再重建,表中的数据也会丢失
hibernate.hbm2ddl.auto=update

这边需要注意3个地方。

a.url的配置需要跟上后面那堆参数,那是新的jdbc驱动要求的,如果不跟,会报错。

b.driverClassName要写com.mysql.cj.jdbc.Driver而不是旧版本的com.mysql.jdbc.Driver,因为后者已经过时了。

c.hibernate.hbm2ddl.auto千万不要写=create-drop,否则项目启动的时候会把所有数据表删除,然后再新建,这样里面的数据就不见了,我这边写的是update,即有修改的时候会自动update.

上述配置文件会被spring的主配置文件,ApplicationContext.xml引用。

7.编写spring主配置文件

spring主配置文件是spring项目最重要的一个配置文件,数据源配置,事务管理配置,以及加载所有javabean等都在此处配置。当我们启动一个web项目的时候,先去加载项目所引用的jar包(包括jdk,tomcat,还有maven处所引用的jar包),接下来去访问web.xml文件,根据web.xml文件的配置,找到spring主配置文件的位置,读取其内容,然后就可以进行加载javabean,初始化数据库连接池等工作了。(关于web项目启动的步骤,可以参照这篇文章。)

spring+hibernate项目demo搭建的更多相关文章

  1. spring boot 学习入门篇【spring boot项目的搭建以及如何加载jsp界面】

    [ 前言]  Spring Boot 简介:Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置, ...

  2. Struts+Spring+Hibernate项目的启动线程

    在Java Web项目中,经常要在项目开始运行时启动一个线程,每隔一定的时间就运行一定的代码,比如扫描数据库的变化等等.要实现这个功能,可以现在web.xml文件中定义一个Listener,然后在这个 ...

  3. 【Dubbo】Zookeeper+Dubbo项目demo搭建

    一.Dubbo的注解配置 在Dubbo 2.6.3及以上版本提供支持. 1.@Service(全路径@org.apache.dubbo.config.annotation.Service) 配置服务提 ...

  4. Dubbo项目demo搭建

    项目参考: http://dubbo.io/User+Guide-zh.htm https://my.oschina.net/superman158/blog/466637 项目使用 maven+id ...

  5. Spring Security项目的搭建以及Spring Security的BCrypt加密

    .personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...

  6. Hibernate项目环境搭建

    1.首先在eclipse里面新建一个Java工程. 2.在数据库中新建一个数据库(无需创建表,有Hibernate生成). 3.在项目中导入Hibernate所依赖的jar包,该jar包可以在此下载: ...

  7. 用intellj 建一个spring mvc 项目DEMO

    spring的起初可能经常碰壁,因为网上的资料都是混乱的xml堆成的,混乱难以理解,我这个也是,阿哈哈哈哈! 新建一个Maven->create from archetype->org.j ...

  8. Spring MVC项目快速搭建(编程模型)

    1)配置DispatcherServlet前端控制器(web配置) 2)将xml文件路径告诉Spring MVC(DispatcherServlet) 以上两步等价于继承了WebApplication ...

  9. Struts+Spring+Hibernate项目整合AJAX+JSON

    1.什么是AJAX AJAX是 "Asynchronous JavaScript and XML" 的简称,即异步的JavaScript和XML. 所谓异步,就是提交一个请求不必等 ...

随机推荐

  1. 重构手法之Replace Temp with Query(以查询取代临时变量)

    返回总目录 6.4Replace Temp with Query(以查询取代临时变量) 概要 你的程序以一个临时变量保存某一表达式的运算结果. 将这个表达式提炼到一个独立函数中.将这个临时变量的所有引 ...

  2. tensorflow 从入门到上天教程一

    tensorflow 是一个google开源的深度学习的框架,执行性能良好,值得使用. caffe,caffe2 通过配置就可以拼凑一个深度学习框架,大大简化流程但也依赖大量的开源库,性能也不错.20 ...

  3. c# linq的差集,并集,交集,去重【转】

    using System.Linq;      List<string> ListA = new List<string>(); List<string> List ...

  4. lua lua解读

    1.线程状态宏定义(thread status) #define LUA_OK 0 #define LUA_YIELD 1 #define LUA_ERRRUN 2 #define LUA_ERRSY ...

  5. 《java.util.concurrent 包源码阅读》21 CyclicBarrier和CountDownLatch

    CyclicBarrier是一个用于线程同步的辅助类,它允许一组线程等待彼此,直到所有线程都到达集合点,然后执行某个设定的任务. 现实中有个很好的例子来形容:几个人约定了某个地方集中,然后一起出发去旅 ...

  6. Spring框架——AOP代理

    我们知道AOP代理指的就是设计模式中的代理模式.一种是静态代理,高效,但是代码量偏大:另一种就是动态代理,动态代理又分为SDK下的动态代理,还有CGLIB的动态代理.Spring AOP说是实现了AO ...

  7. 关于 use-default-filters 属性的说明

    原创播客,如需转载请注明出处.原文地址:http://www.cnblogs.com/crawl/p/7940755.html ------------------------------------ ...

  8. Bone Collector-HDU

    Many years ago , in Teddy’s hometown there was a man who was called “Bone Collector”. This man like ...

  9. 小白关于python 对象和内存的关系的一些感悟和疑惑,望大神指教

    首先你输入了一个字符串,这个字符串是有大小的,电脑将其放在内存中,自动给其一个起始指针指向这个字符串的首位置,然后,你将这个字符串赋值给一个变量,这个对象又在内存中开辟出一个空间,这个变量会自动连接这 ...

  10. Dashboard集群

    #Dashboard集群 openstack pike 部署 目录汇总 http://www.cnblogs.com/elvi/p/7613861.html ##.Dashboard集群 #####在 ...