研究,百度,查资料+好友帮助,使用MyEcplise2015工具,通过maven搭建hibernate+springMVC+spring的项目,数据库采用MySql5.5 不过使用的版本会在项目搭建过程中介绍。

大概就是下面的几个步骤:

1. 设计数据库,得到数据库

2.使用maven搭建项目,导入包的依赖

3.引入spring的配置信息,放在资源文件中

4.引入Log4j日志文件配置

5.配置hibernate

6.配置ehcache.xml

7.使用hibernate  tools生成实体

8.创建Dao层、service层

9.配置spring-mvc.xml

10.配置web.xml容器

11.创建Controller层

12.创建view层

13.打包,部署,运行项目

1.设计数据库,并创建数据库

1.1 使用powerDesigner,设计数据表,生成cdm

设计三个数据表分别为角色表,权限表以及用户表,三张表之间分别是多对多的关系。三个实体的主键均使用UUID,因此设计主键长度为varchar(36)

1.2 继续生成pdm

由于三张表之间是多对多,生成两张中间表,分别是角色权限表和用户角色表

这个怎么用就不介绍了,总而言之,最后生成SQL语句,然后在MySQL运行,创建一个新的数据库,生成如下的数据库:

2.创建maven项目,导入项目所需依赖架包

2.1创建maven项目

新创建成的maven项目结构如下,我们将这个项目结构完善

首先将这个项目转化为web项目,项目右键-->properties,在设置过程中,注意Web版本与jave版本的相互支持

项目转成web项目之后,会生成下面的这个目录

我们要做的就是把这个WebRoot目录下的东西放到src下的webapp下,让它符合maven项目的结构标准.然后,删除WebRoot目录即可。

2.2 调一下项目中的小错误

首先双击pom.xml文件,设置web版本

双击Inxde.jsp文件,发现没有httpservlet架包,那我们就进入build path,给项目添加所支持架包

既然改到这里了,我们的JRE版本太低了,把它替换成高的版本,顺便把J2EE的架包也搞进来,以备不时之需

搞进来J2EE的lib

搞进来JRE的lib

此时,小错误全部消除完成,现在的项目结构如下所示:

2.3 现在配置pom.xml。导入项目依赖架包

 <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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.it</groupId>
<artifactId>mySecond</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<build>
<plugins>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<version>3.0</version>
</configuration>
</plugin>
</plugins>
</build> <name>myAgen</name>
<url>http://maven.apache.org</url> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.version>4.1.4.RELEASE</spring.version>
<hibernate.version>4.3.8.Final</hibernate.version>
<jackson.version>2.5.0</jackson.version> </properties> <dependencies> <!-- junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency> <!-- spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<scope>test</scope>
</dependency> <!-- 使用SpringMVC需配置 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- spring cglib 代理 -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2.2</version>
</dependency>
<!-- 关系型数据库整合时需配置 如hibernate jpa等 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency> <!-- hibernate -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
</dependency> <dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>${hibernate.version}</version>
</dependency> <!-- 二级缓存ehcache -->
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>2.9.0</version>
</dependency> <!-- log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency> <!-- mysql连接 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.34</version>
</dependency> <!-- c3p0数据源 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5-pre10</version>
</dependency> <!-- json -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.3</version>
</dependency> <dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson.version}</version>
</dependency> <dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson.version}</version>
</dependency> <dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency> <!-- aop -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.4</version>
</dependency> <!-- servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>3.0-alpha-1</version>
<scope>provided</scope>
</dependency> <dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency> </dependencies>
</project>

3.引入spring的配置信息,放在资源文件中

路径下创建config.properties文件,这里面存放的就是一堆的变量,有关hibernate配置的变量

 #application configs

 #jdbc c3p0 config
jdbc.driver = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=utf-8
jdbc.username = root
jdbc.password = root #hibernate config
hibernate.dialect = org.hibernate.dialect.MySQLDialect
hibernate.show_sql = true
hibernate.format_sql = false
hibernate.hbm2ddl.auto = update
hibernate.cache.use_second_level_cache = true
hibernate.cache.use_query_cache = true
hibernate.cache.region.factory_class = org.hibernate.cache.ehcache.EhCacheRegionFactory
hibernate.cache.provider_configuration_file_resource_path =ehcache.xml

4.引入Log4j日志文件配置

下创建log4j.properties,

 ### set log levels ###
log4j.rootLogger = INFO , C , D , E ### console ###
log4j.appender.C = org.apache.log4j.ConsoleAppender
log4j.appender.C.Target = System.out
log4j.appender.C.layout = org.apache.log4j.PatternLayout
log4j.appender.C.layout.ConversionPattern = [springmvc_hibernate_demo][%p] [%-d{yyyy-MM-dd HH:mm:ss}] %C.%M(%L) | %m%n ### log file ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = ../logs/springmvc_hibernate_demo.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = INFO
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = [springmvc_hibernate_demo][%p] [%-d{yyyy-MM-dd HH:mm:ss}] %C.%M(%L) | %m%n ### exception ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File = ../logs/springmvc_hibernate_demo_error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern =[sspringmvc_hibernate_demo][%p] [%-d{yyyy-MM-dd HH\:mm\:ss}] %C.%M(%L) | %m%n

5.配置hibernate

下创建spring-hibernate.xml,其中配置了数据源dataSource,配置sessionFactory,配置事务管理器。【如果需要连接多干服务器上的多个数据库,那就可以再多配一份同样的dataSource,sessionFacrory,事务管理器,在注入的时候,在Controller中,@Resource(注明是哪个sessionFactory即可)这里可能有误,之后再说】

 <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd"> <!-- 自动扫描@Controller注入为bean -->
<context:property-placeholder location="classpath:config.properties"/> <!-- 配置数据源 c3p0 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="${jdbc.driver}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" /> <!-- 请求超时时间 -->
<property name="checkoutTimeout" value="30000" />
<!-- 每60秒检查所有连接池中的空闲连接。默认值: 0,不检查 -->
<property name="idleConnectionTestPeriod" value="30" />
<!-- 连接数据库连接池最大空闲时间 -->
<property name="maxIdleTime" value="30" />
<!-- 连接池初始化连接数 -->
<property name="initialPoolSize" value="5" />
<property name="minPoolSize" value="5" />
<property name="maxPoolSize" value="20" />
<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。默认值: 3 -->
<property name="acquireIncrement" value="5" />
</bean> <!-- 配置hibernate的SessionFactory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<!-- 注入数据源 相关信息看源码 -->
<property name="dataSource" ref="dataSource" />
<!-- hibernate配置信息 -->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
<prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop> <!-- 开启二级缓存 ehcache -->
<prop key="hibernate.cache.use_second_level_cache">${hibernate.cache.use_second_level_cache}</prop>
<prop key="hibernate.cache.use_query_cache">${hibernate.cache.use_query_cache}</prop>
<prop key="hibernate.cache.region.factory_class">${hibernate.cache.region.factory_class}</prop>
<prop key="hibernate.cache.provider_configuration_file_resource_path">${hibernate.cache.provider_configuration_file_resource_path}
</prop>
</props>
</property>
<!-- 扫描hibernate注解配置的entity -->
<property name="packagesToScan" value="com.it.entity" />
</bean> <!-- 配置事务管理器 -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean> </beans>

6.配置ehcache.xml

下创建ehcache.xml,配置的二级缓存

 <?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
<diskStore path="D:/ehcache" />
<!-- DefaultCache setting. -->
<defaultCache
maxElementsInMemory="1000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
maxElementsOnDisk="1000000"
overflowToDisk="true"
memoryStoreEvictionPolicy="LRU"> </defaultCache> <!-- Special objects setting. --> <cache
name="org.andy.work.entity.AcctUser"
maxElementsInMemory="2"
memoryStoreEvictionPolicy="LRU"
eternal="true"
diskPersistent="false"
overflowToDisk="false"
maxElementsOnDisk="1000000" /> </ehcache>

7.使用hibernate  tools生成实体

在MyEcplise右上角,点击【如果没有,就点击MyEcplise Java Enterprise 左边的小图标】MyEcplise  Hibernate,进入

在这里,New一个新的连接。连接到指定的数据库上

编辑新的连接,下面的这些,必须完全一致,除了账号密码和驱动的路径,但是选择了驱动之后,Driver ClassName必须得是com.mysql.jdbc.Driver【如果是MySQL数据库的话】.

编辑完成之后可以Test Driver一下看看是否可以连接成功。

连接成功之后如下,我们就开始选择所有数据表,点击hibernate反转,生成entity

但是此刻发现我们要选择的folder中不能指定到我们的项目中,我们的项目没有被识别出来。

因此需要点击MyEcplise Jave Enterprise,回去设置我们的项目,让项目支持hibernate,或者说让项目变成hibernate项目

右键项目 --->properties--->Project Facets

完了之后会有两个自动生成的文件,看看是否需要留着,或者删除

然后再回到hibernate tools下面

这次就可以看到本项目了

因为要使用注解的形式,所以,按照下面的选择,

主键使用UUID,注意hibernate的版本的问题,需要注意选择的主键生成策略

包下生成的实体如下:

下面贴出来生成实体的代码:

Authority.java

 package com.it.entity;

 import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator; /**
* Authority entity. @author MyEclipse Persistence Tools
*/
@Entity
@Table(name = "authority", catalog = "testdb")
public class Authority implements java.io.Serializable { // Fields private String authorityId;
private String authorityName;
private Set<Role> roles = new HashSet<Role>(0); // Constructors /** default constructor */
public Authority() {
} /** full constructor */
public Authority(String authorityName, Set<Role> roles) {
this.authorityName = authorityName;
this.roles = roles;
} // Property accessors
@GenericGenerator(name = "generator", strategy = "uuid.hex")
@Id
@GeneratedValue(generator = "generator")
@Column(name = "authorityId", unique = true, nullable = false, length = 36)
public String getAuthorityId() {
return this.authorityId;
} public void setAuthorityId(String authorityId) {
this.authorityId = authorityId;
} @Column(name = "authorityName", length = 50)
public String getAuthorityName() {
return this.authorityName;
} public void setAuthorityName(String authorityName) {
this.authorityName = authorityName;
} @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "authorities")
public Set<Role> getRoles() {
return this.roles;
} public void setRoles(Set<Role> roles) {
this.roles = roles;
} }

Myuser.java

 package com.it.entity;

 import java.sql.Timestamp;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator; /**
* Myuser entity. @author MyEclipse Persistence Tools
*/
@Entity
@Table(name = "myuser", catalog = "testdb")
public class Myuser implements java.io.Serializable { // Fields private String myUserId;
private String myUserName;
private String myUserPhone;
private Timestamp myUserTime;
private Set<Role> roles = new HashSet<Role>(0); // Constructors /** default constructor */
public Myuser() {
} /** minimal constructor */
public Myuser(Timestamp myUserTime) {
this.myUserTime = myUserTime;
} /** full constructor */
public Myuser(String myUserName, String myUserPhone, Timestamp myUserTime,
Set<Role> roles) {
this.myUserName = myUserName;
this.myUserPhone = myUserPhone;
this.myUserTime = myUserTime;
this.roles = roles;
} // Property accessors
@GenericGenerator(name = "generator", strategy = "uuid.hex")
@Id
@GeneratedValue(generator = "generator")
@Column(name = "myUserId", unique = true, nullable = false, length = 36)
public String getMyUserId() {
return this.myUserId;
} public void setMyUserId(String myUserId) {
this.myUserId = myUserId;
} @Column(name = "myUserName", length = 20)
public String getMyUserName() {
return this.myUserName;
} public void setMyUserName(String myUserName) {
this.myUserName = myUserName;
} @Column(name = "myUserPhone", length = 11)
public String getMyUserPhone() {
return this.myUserPhone;
} public void setMyUserPhone(String myUserPhone) {
this.myUserPhone = myUserPhone;
} @Column(name = "myUserTime", nullable = false, length = 19)
public Timestamp getMyUserTime() {
return this.myUserTime;
} public void setMyUserTime(Timestamp myUserTime) {
this.myUserTime = myUserTime;
} @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "myusers")
public Set<Role> getRoles() {
return this.roles;
} public void setRoles(Set<Role> roles) {
this.roles = roles;
} }

Role.java

 package com.it.entity;

 import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator; /**
* Role entity. @author MyEclipse Persistence Tools
*/
@Entity
@Table(name = "role", catalog = "testdb")
public class Role implements java.io.Serializable { // Fields private String roleId;
private String roleName;
private Set<Myuser> myusers = new HashSet<Myuser>(0);
private Set<Authority> authorities = new HashSet<Authority>(0); // Constructors /** default constructor */
public Role() {
} /** full constructor */
public Role(String roleName, Set<Myuser> myusers, Set<Authority> authorities) {
this.roleName = roleName;
this.myusers = myusers;
this.authorities = authorities;
} // Property accessors
@GenericGenerator(name = "generator", strategy = "uuid.hex")
@Id
@GeneratedValue(generator = "generator")
@Column(name = "roleId", unique = true, nullable = false, length = 36)
public String getRoleId() {
return this.roleId;
} public void setRoleId(String roleId) {
this.roleId = roleId;
} @Column(name = "roleName", length = 20)
public String getRoleName() {
return this.roleName;
} public void setRoleName(String roleName) {
this.roleName = roleName;
} @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "userrole", catalog = "testdb", joinColumns = { @JoinColumn(name = "roleId", nullable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(name = "myUserId", nullable = false, updatable = false) })
public Set<Myuser> getMyusers() {
return this.myusers;
} public void setMyusers(Set<Myuser> myusers) {
this.myusers = myusers;
} @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "roleauthor", catalog = "testdb", joinColumns = { @JoinColumn(name = "roleId", nullable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(name = "authorityId", nullable = false, updatable = false) })
public Set<Authority> getAuthorities() {
return this.authorities;
} public void setAuthorities(Set<Authority> authorities) {
this.authorities = authorities;
} }

上面有几个需要注意的

上面大多数都是Hibernate tools自动生成的,但是有几个需要手动添加:

1、如果这个实体使用二级缓存的话,需要添加@cache注解;

2、如果该实体里面还有集合元素(set, map,list),如果实体要采用二级缓存,那么这些集合元素必须也添加@cache注解

3、@JsonIgnoreProperties注解是为了防止SpringMVC在json返回时产生循环输出使用,如果不配置的话就会出现json死循环(还有多对多,一对多的属性时)。

4、@JsonIgnore这个是在转换成json是忽略该属性,而@JsonIgnoreProperties(value={"acctUsers", "acctAuthorities"})则是忽略acctRoles里面的acctUsers和acctAuthorites属性。

8.创建Dao层、service层

8.1 创建Dao层,面向接口的思想创建

8.1.1  先要创建一个基础Dao

 package com.it.dao;

 import java.io.Serializable;
import java.util.List; public interface GenericDao<T, PK extends Serializable> { T load(PK id); T get(PK id); List<T> findAll(); void persist(T entity); PK save(T entity); void saveOrUpdate(T entity); void delete(PK id); void flush();
}

8.1.2 再定义具体的接口,继承基础的Dao

 package com.it.dao;

 import com.it.entity.Myuser;

 /**
* MyUser的Dao
* @author Administrator
*
*/
public interface MyUserDao extends GenericDao<Myuser, String> { }

8.1.3 接着定义具体的DaoImpl的实现类

 package com.it.dao.Impl;

 import java.util.List;

 import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository; import com.it.dao.MyUserDao;
import com.it.entity.Myuser; @Repository("myUserDao")
public class MyUserDaoImpl implements MyUserDao { @Autowired
private SessionFactory sessionFactory; private Session getCurrentSession() {
return this.sessionFactory.getCurrentSession();
} public Myuser load(String id) {
// TODO Auto-generated method stub
return (Myuser) this.getCurrentSession().load(Myuser.class, id);
} public Myuser get(String id) {
// TODO Auto-generated method stub
return (Myuser) this.getCurrentSession().get(Myuser.class, id);
} public List<Myuser> findAll() {
@SuppressWarnings("unchecked")
List<Myuser> allUser = this.getCurrentSession().createQuery("from Myuser").list();
return allUser;
} public void persist(Myuser entity) {
this.getCurrentSession().persist(entity);
} /**
* 可以选择手动控制事务的提交,也可以交给spring自动去提交
*/
public String save(Myuser entity) {
// TODO Auto-generated method stub
// Session session = sessionFactory.openSession();
// session.getTransaction().begin();
// session.;
// session.getTransaction().commit();
// session.flush();
// session.close();
return (String) this.getCurrentSession().save(entity);
} public void saveOrUpdate(Myuser entity) {
// TODO Auto-generated method stub
this.getCurrentSession().saveOrUpdate(entity);
} public void delete(String id) {
// TODO Auto-generated method stub
Myuser myuser=this.load(id);
this.getCurrentSession().delete(myuser);
} public void flush() {
this.getCurrentSession().flush();
} }

8.2 创建service层,也是面向接口的思想创建

8.2.1 创建一个基础Service

 package com.it.service;

 import java.io.Serializable;
import java.util.List; public interface GenericService<T, PK extends Serializable> { T load(PK id); T get(PK id); List<T> findAll(); void persist(T entity); PK save(T entity); void saveOrUpdate(T entity); void delete(PK id); void flush();
}

8.2.2 创建service继承基础的Service

 package com.it.service;

 import com.it.entity.Myuser;

 public interface MyUserService extends GenericService<Myuser, String> {

 }

8.2.3 创建serviceImpl

 package com.it.service.Impl;

 import java.util.List;

 import javax.annotation.Resource;

 import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import com.it.dao.MyUserDao;
import com.it.entity.Myuser;
import com.it.service.GenericService;
import com.it.service.MyUserService; @Service("myUserService")
@Transactional
public class MyUserServiceImpl implements MyUserService { @Resource(name = "myUserDao")
private MyUserDao myUserDao; public Myuser load(String id) {
// TODO Auto-generated method stub
return myUserDao.load(id);
} public Myuser get(String id) {
// TODO Auto-generated method stub
return myUserDao.get(id);
} public List<Myuser> findAll() {
// TODO Auto-generated method stub
return myUserDao.findAll();
} public void persist(Myuser entity) {
// TODO Auto-generated method stub
myUserDao.persist(entity);
} public String save(Myuser entity) {
// TODO Auto-generated method stub
return myUserDao.save(entity);
} public void saveOrUpdate(Myuser entity) {
// TODO Auto-generated method stub
myUserDao.saveOrUpdate(entity);
} public void delete(String id) {
// TODO Auto-generated method stub
myUserDao.delete(id);
} public void flush() {
// TODO Auto-generated method stub
myUserDao.flush();
} }

9.配置spring-mvc.xml

spring-mvc.xml中配置了自动扫描Controller层注解+视图解析器

 <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd"> <!-- 自动扫描@Controller注入为bean -->
<context:component-scan base-package="com.it" > </context:component-scan>
<!-- 标明注解事务 -->
<tx:annotation-driven transaction-manager="transactionManager" /> <!-- 以下为SpringMVC配置 -->
<mvc:annotation-driven>
<!-- 返回json数据,@response使用 -->
<mvc:message-converters register-defaults="true">
<bean
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property> </bean>
</mvc:message-converters>
</mvc:annotation-driven> <!-- 对模型视图名称的解析,即在模型视图名称添加前后缀 -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/views" />
<property name="suffix" value=".jsp" />
</bean> <!-- 下面设置配置事物以及事务管理,是一种事务的处理方式,还可以有另一种 就是不写下面这一大块,直接在service层添加@Transactional
解释一下这两种的区别:
1.@Transactional 在serviceImpl层使用这个注解,表示默认的事务都是propagation="REQUIRED",这样不会有下面read-only这一项了,那么比如在查询的时候只要保证这个查询是在一个事务中,将结果查询出来,对这个对象进行修改,不用调用save等方法,事务会自动帮你进行持久化的操作,会将你这个操作保存在数据库中
2.使用下面的这两个事务管理,可以自己配置什么方法什么操作【insert、get】,可以自己设置事务的类型,也可以设置read-only。设置了read-only的话,在从数据库中查询出一条记录,对对象进行更改,那就必须调用save或者update方法才能进行保存 配置事务增强处理Bean,指定事务管理器 意思是这个id为transactionAdvice的事务(建议),他的事务管理者是上面指定的id为transactionManager的事务管理器
<tx:advice id="transactionAdvice" transaction-manager="transactionManager" >
配置详细事务处理语义
<tx:attributes>
在指定的如下的这些操作发生时,例如insert插入数据发生时,事务类型的request ,而get等操作,事务类型是supports,并且是只读
<tx:method name="insert*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" /> <tx:method name="get*" propagation="SUPPORTS" read-only="true" />
<tx:method name="find*" propagation="SUPPORTS" read-only="true" />
<tx:method name="select*" propagation="SUPPORTS" read-only="true" />
<tx:method name="load*" propagation="SUPPORTS" read-only="true" /> 其他采用默认事务方式
<tx:method name="*" propagation="REQUIRED" /> </tx:attributes>
</tx:advice> Spring aop事务管理
<aop:config proxy-target-class="true">
配置切入点 指定这个aop:pointcut去引用上面规定的advice,也就是说规定下面的这个expression指定的路径下的service.impl下的所有的方法,都按照上面advice中的规定去执行,碰上什么操作,事务就是什么类型的,这就是事务管理器的好处了
解释一下,为什么这个要指定在service层:因为在同一个事务中,可能要对多张表进行多个不同的操作,才是一个完整的逻辑,例如淘宝上买东西,你转账之后你的钱减少了,对方的钱应该增加了,这两个操作在一起才是一个完整的操作,而如果这两个操作不在一个事务中,也就是如果将事务的操作指定在Dao层【MVC的设计模式:Dao层就是对数据库进行最简单的增删改查操作,而service层是进行逻辑处理的,一个完整的逻辑处理就要涉及到多次操作】事务操作失败,发生回滚,那你的帐减少了,对方的帐并没有增加,这样就不美丽的,因此,将事务的管理,指定在了service层
<aop:pointcut id="transactionPointcut"
expression="execution(* com.it.service..*Impl.*(..))" />expression中表达式所指意思: 所有的文件下的 com.it.service开头的包,以Impl结尾的类下的所有的方法,都执行上面advice的规定
指定在txAdvice切入点应用txAdvice事务增强处理
<aop:advisor pointcut-ref="transactionPointcut"
advice-ref="transactionAdvice" />
</aop:config> --> </beans>

10.配置web.xml容器

 <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<!-- web容器是web项目的大脑 -->
<!-- 在web.xml中,执行顺序是:1.先执行listener 2。再执行filter 3.最后执行servlet 这就是执行顺序
就像spring-hibernate.xml文件是在执行Listener的时候加载的,那注意这几个配置文件在web.xml中的加载顺序,因为资源文件是在配置文件【xml文件】中加载的,肯定是先加载的资源文件【properties文件】,才能在配置文件中调用资源文件中的变量的值使用 -->
<display-name>springmvc_demo</display-name>
<!-- web容器,首先需要引入spring,让spring管理各个框架,并将其注入为bean -->
<!-- 这个相当于定一个 变量在web.xml中,在下面的listener org.springframework.web.context.ContextLoaderListener中,加载这个spring-hibernate.xml文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-hibernate.xml</param-value>
</context-param>
<!-- 配置控制层的filter信息 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> <!-- openSessionInView配置 作用是延迟session关闭到view层 -->
<filter>
<filter-name>openSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
<init-param>
<param-name>singleSession</param-name>
<param-value>true</param-value>
</init-param>
</filter> <!-- 监听servletContext,启动contextConfigLocation中的spring配置信息 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener> <!-- 防止spring内存溢出监听器 可用可不用-->
<listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener> <!-- 类似与servlet 需要在web.xml中都需要配置一样,spring的思想是让这些servlet【controller也是servlet】继承了一个基础的servlet,那就只需在web.xml中配置一个servlet即可。 -->
<!-- 这个servlet和下面的servlet-mapping相配合使用,注明了所有的以.htmls结尾的请求都被截取到,去到servlet中去找相对应的方法 进行处理 -->
<servlet>
<description>spring mvc servlet</description>
<servlet-name>rest</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<!-- 此处配置的是SpringMVC的配置文件 -->
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 配置了springmvc拦截的url为以.hmls结尾的请求 -->
<servlet-mapping>
<servlet-name>rest</servlet-name>
<url-pattern>*.htmls</url-pattern>
</servlet-mapping> <filter-mapping>
<filter-name>openSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> <!-- 配置session超时时间,单位分钟 -->
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<!-- 欢迎界面 默认的项目访问界面 -->
<welcome-file-list>
<welcome-file>/index.jsp</welcome-file>
</welcome-file-list>
</web-app>

11.创建Controller层

 

 package com.it.controller;

 import java.sql.Timestamp;
import java.util.List;
import java.util.UUID; import javax.annotation.Resource; import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody; import com.it.entity.Myuser;
import com.it.service.MyUserService; @Controller
@RequestMapping("/myuser")
public class MyUserController { private static final Logger LOGGER = Logger.getLogger(MyUserController.class); @Resource( name = "myUserService")
private MyUserService myUserService; @RequestMapping("/saveOne")
public String saveOne(){
Myuser myuser = new Myuser();
//myuser.setMyUserId(UUID.randomUUID().toString());
myuser.setMyUserName("andy");
myuser.setMyUserPhone("13823237878");
myuser.setMyUserTime(Timestamp.valueOf("1995-09-15 12:12:12"));
myUserService.save(myuser);
return "/user/showInfo";
} @RequestMapping("/showInfo/{userId}")
public String showUserInfo(ModelMap model, @PathVariable String userId){
LOGGER.info("查询用户:"+userId);
Myuser myuser = myUserService.load(userId);
model.addAttribute("userInfo", myuser);
return "/user/showInfo";
} @RequestMapping("/showInfos")
public @ResponseBody List<Myuser> showAllUser(){
LOGGER.info("查询所有用户");
List<Myuser> list = myUserService.findAll();
return list;
}
}

12.创建view视图层

在src/main/webapp/WEB-INF/views下 创建user/showInfo.jsp

 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> <%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<base href="<%=basePath%>" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="js/jquery-1.9.1.min.js"></script>
<title>用户信息展示</title>
</head>
<body>
用户信息 昵称: ${userInfo.myUserName} 用户id:${userInfo.myUserId} 用户电话:${userInfo.myUserPhone } 注册时间:
<fmt:formatDate value="${userInfo.myUserTime }" pattern="yyyy-MM-dd HH:mm:ss" />
角色:[
<c:forEach items="${ userInfo.roles}" var="role">
${role.roleName } 权限[
<c:forEach items="${ role.authorities}" var="authority">
${authority.authorityName }
</c:forEach> ]
</c:forEach>
] <br /> ajax显示全部用户信息:
<div id="show_all_user"></div>
</body>
<script type="text/javascript">
$.ajax({
type : "get",
url : "myuser/showInfos.htmls",
dataType : "json",
success : function(data) {
$(data).each(
function(i, user) {
var p = "<p>昵称:" + user.myUserName + " 电话:"
+ user.myUserPhone + " 注册时间:"
+ user.myUserTime + " id:" + user.myUserId +
"</p>";
$("#show_all_user").append(p);
});
},
async : true
});
</script>
</html>

 13. 一切准备就绪,把项目部署到tomcat中,启动即可

可能你会说,那要这个view页面做什么??因为参考别人的嘛 并且,这个页面比较值得钻研

【maven + hibernate(注解) +spring +springMVC】 使用maven搭建项目的更多相关文章

  1. 基于Maven的ssm(spring+springMvc+Mybatis)框架搭建

    前言 本demo是在idea下搭建的maven项目,数据库使用Mysql,jdk版本是1.8.0_171,ideal:2017.3.5 一.新建项目 1.file->new->porjec ...

  2. SSM Spring+SpringMVC+mybatis+maven+mysql环境搭建

    SSM Spring+SpringMVC+mybatis+maven环境搭建 1.首先右键点击项目区空白处,选择new->other..在弹出框中输入maven,选择Maven Project. ...

  3. Maven+SSM框架(Spring+SpringMVC+MyBatis) - Hello World(转发)

    [JSP]Maven+SSM框架(Spring+SpringMVC+MyBatis) - Hello World 来源:http://blog.csdn.net/zhshulin/article/de ...

  4. Spring+SpringMVC+MyBatis+Maven框架整合

    本文记录了Spring+SpringMVC+MyBatis+Maven框架整合的记录,主要记录以下几点 一.Maven需要引入的jar包 二.Spring与SpringMVC的配置分离 三.Sprin ...

  5. SSM(Spring,SpringMVC,Mybatis)框架整合项目

    快速上手SSM(Spring,SpringMVC,Mybatis)框架整合项目 环境要求: IDEA MySQL 8.0.25 Tomcat 9 Maven 3.6 数据库环境: 创建一个存放书籍数据 ...

  6. Maven 搭建 SSM框架——Spring+SpringMVC+Mybatis的搭建教程

    一:概述 SSM框架在项目开发中经常使用到,相比于SSH框架,它在仅几年的开发中运用的更加广泛. Spring作为一个轻量级的框架,有很多的拓展功能,最主要的我们一般项目使用的就是IOC和AOP.Sp ...

  7. Spring+SpringMVC+Mybatis+MAVEN+Eclipse+项目完整环境搭建

    1.新建一个Maven项目,创建父项目. 2.创建子项目模块 3.创建javaWeb项目 4.创建后的项目目录结构 5.Maven文件配置 parent父项目pom.xml文件配置 <?xml ...

  8. [JSP]Maven+SSM框架(Spring+SpringMVC+MyBatis) - Hello World

    来源:http://blog.csdn.net/zhshulin/article/details/37956105?utm_source=tuicool&utm_medium=referral ...

  9. spring springmvc mybatis maven 项目整合示例-导航页面

    spring原理 实践解析-简单的helloworld spring原理案例-基本项目搭建 01 spring framework 下载 官网下载spring jar包 spring原理案例-基本项目 ...

随机推荐

  1. 13. javacript高级程序设计-事件

    1. 事件 1.1 事件流 事件流描述的是从页面中接受事件的顺序,IE的事件是冒泡流,而Netscape Communicator的事件流是事件捕捉流. 1.1.1 事件冒泡 <!DOCTYPE ...

  2. Java for LeetCode 218 The Skyline Problem【HARD】

    A city's skyline is the outer contour of the silhouette formed by all the buildings in that city whe ...

  3. BestCoder27 1001.Jump and Jump... (hdu 5162) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5162 题目意思:有 n 个 kid,每个 kid 有三个成绩 a, b, c.选最大的一个成绩作为这个 ...

  4. NEFU 1112 粉刷栅栏算法

    题目链接 中文题 简单搜索题 例数据 输入 6 1 1 1 1 9 9 输出 3 注意是每一个递归搜索都返回一个min 而不是只有总的返回min #include <cstdio> #in ...

  5. struts.xml配置

    1. package标签 package:完成有业务相关的Action(应用控制器的)管理 name:给包起的名字(反映该包中Action的功能),用来完成包和包之间的继承.默认继承struts-de ...

  6. java中的[Ljava.lang.Object;@2a139a55问题

    数据显示为Ljava.lang.Object;@2a139a55问题,是因为你从数据库读出数据后,存入到list集合上时,如果你没有指定要存入的数据的类型,系统会自动给你赋一个object类型,他是所 ...

  7. Java自定义注解开发

    一.背景 最近在自己搞一个项目时,遇到可需要开发自定义注解的需求,对于没有怎么关注这些java新特性的来说,比较尴尬,索性就拿出一些时间,来进行研究下自定义注解开发的步骤以及使用方式.今天在这里记下, ...

  8. ASCII 非打印字符

    项目出了问题,因为AscII非打印字符的原因,后来找了一下啊ASCII的非打印字符,总共有31个,然后我们直接全部替换成问号了. 解决方式为先找到非打印字符,这是我从网上找的非打印字符表: 进制 十六 ...

  9. Qt中如何添加.qrc文件

    You need a resource file (.qrc) within which you embed the input text file. The input file can be an ...

  10. OkHttp学习总结

    This paper mainly includes the following contents okhttp ordinary operation. okhttp interceptors. Re ...