MyEclipse2017CI下 Maven整合Spring4+Springmvc+HIbernate5详细过程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/water_3700348/article/details/83585216

第一步:新建Web Project

1.勾选Add Maven support,添加Maven的支持

2.点击两次Next,勾选Generate web.xml,生成web.xml配置文件。

3.点击一次Next,选择Standard Maven JEE,标准的JEEMaven工程。

4.点击Finish完成工程的创建,工程的目录如下。

第二步:添加pom.xml文件的maven依赖包

1. properties节点下,定义三大框架以及其他一些jar包的版本属性

<commons.version>1.2</commons.version>
<mysql.version>5.1.39</mysql.version>
<c3p0.version>0.9.2.1</c3p0.version>
<hibernate.version>5.2.10.Final</hibernate.version>
<hibernate.validator.version>5.4.0.Final</hibernate.validator.version>
<spring.version>4.3.3.RELEASE</spring.version>
<log.version>1.2.17</log.version>
<junit.version>4.12</junit.version>

2. dependencies节点下,添加三大框架以及其他jar包的依赖,除了三大框架以为,其他jar包根据自己的需要添加。

                <dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>${junit.version}</version>

		</dependency>
		<dependency>
			<groupId>commons-logging</groupId>
			<artifactId>commons-logging</artifactId>
			<version>${commons.version}</version>
		</dependency>


		<!-- Hibernate start -->
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-core</artifactId>
			<version>${hibernate.version}</version>
		</dependency>

		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-validator</artifactId>
			<version>${hibernate.validator.version}</version>
		</dependency>

		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-entitymanager</artifactId>
			<version>${hibernate.version}</version>
		</dependency>

		<!-- Hibernate end -->

		<!-- 引用c3p0 依赖 start -->
		<dependency>
			<groupId>com.mchange</groupId>
			<artifactId>c3p0</artifactId>
			<version>${c3p0.version}</version>
		</dependency>
		<!-- 引用c3p0 依赖 end -->

		<!-- Mysql start -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>${mysql.version}</version>
		</dependency>
		<!-- Mysql end -->

		<!-- Spring start -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</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-context</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>${spring.version}</version>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-orm</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<!-- Spring end -->

		<!-- Log4j start -->
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>${log.version}</version>
		</dependency>
		<!-- Log4j end -->

注意:添加依赖包的时候切勿覆盖了之前工程中已经有的依赖,否则会出现其他错误。

修改完pom.xml文件之后,点击左边工程目录,右键找到Maven,点击选择Update Projetct,更新一下依赖包,如果依赖包本地不存在则会去云端下载,耐心等待下载完成即可。

第三步:配置框架的配置文件

1. 在src/main/resources目录下新建applicationContext.xml文件,配置以下内容:

<?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:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">





	<!-- 自动扫描与装配bean -->
	<context:component-scan base-package="{实际的包名}"></context:component-scan>

	<!-- 读取properties配置文件 -->
	<bean
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">
			<list>
				<value>classpath:db.properties</value>
			</list>

		</property>
	</bean>


	<!-- 配置数据源c3p0 -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="user" value="${username}"></property>
		<property name="password" value="${password}"></property>
		<property name="jdbcUrl" value="${url}"></property>
		<property name="driverClass" value="${driver_class}"></property>

		<!-- 初始化池子大小 -->
		<property name="initialPoolSize" value="${initPoolSize}"></property>

		<!-- 池子最大数 -->
		<property name="maxPoolSize" value="${maxPoolSize}"></property>
	</bean>

	<!-- Hibernate session factory -->
	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		
		<!-- //加载实体类的映射文件位置及名称 -->
        <property name="mappingLocations">
			<list>
				<value>classpath:{实际路径}/*.hbm.xml</value>
			</list>
		</property>
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">${hibernate.dialect}</prop>
				<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
				<prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>

				<prop key="hibernate.jdbc.batch_size">${hibernate.jdbc.batch_size}</prop>
				<prop key="hibernate.enable_lazy_load_no_trans">${hibernate.enable_lazy_load_no_trans}</prop>
			</props>
		</property>
	</bean>

	<!-- 配置事务管理器 -->
	<bean id="transactionManager"
		class="org.springframework.orm.hibernate5.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>

	<!-- 事务扫描开始(开启@Tranctional) -->
	<tx:annotation-driven transaction-manager="transactionManager"
		proxy-target-class="true" />

</beans>

2. 在src/main/resources目录下新建db.properties文件,配置以下内容:

#Mysql
driver_class=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/{数据库名}?characterEncoding=UTF-8
username=root
password={密码}
 
initPoolSize=5
maxPoolSize=10
 
#Hibernate config
hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
hibernate.hbm2ddl.auto=update
hibernate.show_sql=true
hibernate.format_sql=false
#hibernate.current_session_context_class=org.springframework.orm.hibernate5.SpringSessionContext
hibernate.current_session_context_class=thread
 
hibernate.jdbc.batch_size=50
hibernate.enable_lazy_load_no_trans=true

3.  在src/main/resources目录下新建spring-mvc.xml文件,配置以下内容:

<?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:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd    
http://www.springframework.org/schema/context    http://www.springframework.org/schema/context/spring-context-3.0.xsd 
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd"
	>

	<!-- 开启MVC注解,表示SpringMVC支持注解功能 做了很多事情,不包括添加自己定义的拦截器 -->
	<mvc:annotation-driven />

	
	<context:component-scan base-package="{实际包名}" />

	<!-- <context:component-scan /> -->
	<!-- 扫描指定的包中的类上的注解,常用的注解有: -->
	<!-- @Controller 声明Action组件 -->
	<!-- @Service 声明Service组件 @Service("xxxService") -->
	<!-- @Repository 声明Dao组件 -->
	<!-- @Component 泛指组件, 当不好归类时. -->
	<!-- @RequestMapping("/menu") 请求映射 -->
	<!-- @Resource 用于注入,( j2ee提供的 ) 默认按名称装配,@Resource(name="beanName") -->
	<!-- @Autowired 用于注入,(spring提供的) 默认按类型装配 -->
	<!-- @Transactional( rollbackFor={Exception.class}) 事务管理 -->
	<!-- @ResponseBody将内容或对象作为 HTTP 响应正文返回,并调用适合HttpMessageConverter的Adapter转换对象,写入输出流 -->
	<!-- @Scope("prototype") 设定bean的作用域 -->


	<!-- 通过mvc:resources设置静态资源,这样servlet就会处理这些静态资源,而不通过控制器 -->
	<!-- 设置不过滤内容,比如:css,jquery,img 等资源文件 -->
	<mvc:resources location="/*.html" mapping="/**.html" />
	<mvc:resources location="/css/*" mapping="/css/**" />
	<mvc:resources location="/js/*" mapping="/js/**" />
	<mvc:resources location="/images/*" mapping="/images/**" />

	<!-- 对模型视图名称的解析,在请求时模型视图名称添加前后缀 -->
	<bean id="viewResolver"
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="viewClass"
			value="org.springframework.web.servlet.view.JstlView" />
		<property name="prefix" value="/" />      <!-- 前缀 -->
		<property name="suffix" value=".jsp" />   <!-- 后缀 -->
	</bean>

</beans>

4. 打开src/main/webapp/WEB-INF/web.xml,添加以下配置:

<!-- 配置web.xml,使其具有springmvc特性,主要配置两处,一个是ContextLoaderListener,一个是DispatcherServlet -->

	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext.xml</param-value>
	</context-param>

	<!-- 配置ContextLoaderListener表示,该工程要以spring的方式启动。启动时会默认在/WEB-INF目录下查找applicationContext.xml 
		作为spring容器的配置文件,该文件里可以初始化一些bean -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<!-- spring mvc 配置 -->
	<!-- 配置DispatcherServlet表示,该工程将采用springmvc的方式。启动时也会默认在/WEB-INF目录下查找XXX-servlet.xml作为配置文件, 
		XXX就是DispatcherServlet的名字,该文件中将配置两项重要的mvc特性:HandlerMapping,负责为DispatcherServlet这个前端控制器的请求查找Controller; 
		ViewResolver,负责为DispatcherServlet查找ModelAndView的视图解析器。 此处使用指定的配置文件spring-mvc.xml -->
	<servlet>
		<servlet-name>springmvc</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<!--<param-value>/WEB-INF/classes/spring-mvc-servlet.xml</param-value> -->
			<param-value>classpath*:/spring-mvc.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>springmvc</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>


	<filter>
		<filter-name>SpringOpenSessionInViewFilter</filter-name>
		<filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>SpringOpenSessionInViewFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>


	<!-- 字符集过滤器 -->
	<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>
	</filter>
	<filter-mapping>
		<filter-name>encodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

5. 添加log4j的配置文件,在src/main/resources目录下新建log4j.propertise,配置以下内容

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=d\:\\mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### set log levels - for more verbose logging change 'info' to 'debug' ###
### fatal error warn info debug trace
log4j.rootLogger=debug, stdout

至此,整个基础配置就算是完成了,项目右键运行,看看是否正常运行并访问根目录,出错则查出原因。

以下内容为测试:

一、测试springmvc

1. 新建一个Controller类,使用注解注册。

package ssh.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping(value="Demo")
public class DemoController {

	@RequestMapping(value="demo")
	public String demo(){
		
		System.out.println("demo");
		
		return "index";
	}
	
}

控制台打印demo则证明正常,如果出错:

1.1检查apoplicatonContext.xml的

<context:component-scan base-package="{实际包名}"></context:component-scan>

是否正确配置。

1.2检查spring-mvc.xml的

<context:component-scan base-package="{实际包名}" />

是否正确配置。

二、测试Hibernate,通过一个完成的业务流程来测试Hibernate

假定需求:通过id查询用户表,已有数据库表user,字段id,name,age

1.通过Hibernate reverse engine生成POJO类以及对应的映射xml

User.java

package com.shuidi168.server.entity;

import java.io.Serializable;

/**
 * User entity. @author MyEclipse Persistence Tools
 */

public class User implements Serializable {

	// Fields

	private Integer id;
	private String name;
	private Integer age;

	// Constructors

	/** default constructor */
	public User() {
	}

	/** full constructor */
	public User(String name, Integer age) {
		this.name = name;
		this.age = age;
	}

	// Property accessors

	public Integer getId() {
		return this.id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return this.name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Integer getAge() {
		return this.age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

}

User.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="{完整包名}" table="user">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="identity" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="name" length="10" />
        </property>
        <property name="age" type="java.lang.Integer">
            <column name="age" />
        </property>
    </class>
</hibernate-mapping>

2.新建IBaseDao接口,定义基础的增删改查,并实现BaseDaoImpl

package com.shuidi168.server.Dao;

import java.io.Serializable;
import java.util.List;

import org.hibernate.criterion.DetachedCriteria;

public interface IBaseDao<T> {
	void save(T t);
	void delete(T t);
	void delete(Serializable id);
	void update(T t);
	T	getById(Serializable id);
	
}
package com.shuidi168.server.Dao.impl;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;

import javax.annotation.Resource;

import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;

import com.shuidi168.server.Dao.IBaseDao;

public class BaseDaoImpl<T> extends HibernateDaoSupport implements IBaseDao<T> {
	
	private Class clazz;//用于接收运行时的泛型类型
	
	public BaseDaoImpl() {
		//获得当前类型的带有泛型类型的父类
		ParameterizedType ptClass = (ParameterizedType) this.getClass().getGenericSuperclass();
		//获得运行期的泛型类型
		clazz = (Class) ptClass.getActualTypeArguments()[0];
	}
	
	@Resource
	public void setMySessionFactory(SessionFactory sessionFactory){
		super.setSessionFactory(sessionFactory);
	}

	@Override
	public void save(T t) {
		getHibernateTemplate().save(t);
	}

	@Override
	public void delete(T t) {
		getHibernateTemplate().delete(t);
		
	}

	@Override
	public void delete(Serializable id) {
		T t = this.getById(id);
		delete(t);
	}

	@Override
	public void update(T t) {
		getHibernateTemplate().update(t);
		
	}

	@Override
	public T getById(Serializable id) {
		return (T)getHibernateTemplate().get(clazz, id);
	}

}

3. 新建IUserDao接口继承IBaseDao,并新建实现类,继承BaseDaoImpl并实现IUserDao

package com.shuidi168.server.Dao;

import com.shuidi168.server.entity.User;

public interface IUserDao extends IBaseDao<User> {

}
package com.shuidi168.server.Dao.impl;

import org.springframework.stereotype.Repository;

import com.shuidi168.server.Dao.IUserDao;
import com.shuidi168.server.entity.User;

@Repository
public class UserDaoImpl extends BaseDaoImpl<User> implements IUserDao{

}

3.新建IUserService接口,并实现UserServiceImpl

package com.shuidi168.server.service;

import com.shuidi168.server.entity.User;

public interface IUserService {
	
	User getById(Integer id);

}
package com.shuidi168.server.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.shuidi168.server.Dao.IUserDao;
import com.shuidi168.server.entity.User;
import com.shuidi168.server.service.IUserService;

@Service
@Transactional
public class UserServiceImpl implements IUserService {

	@Autowired
	private IUserDao userDao; 

	@Override
	public User getById(Integer id) {
		return userDao.getById(id);
	}

}

4.在DemoController类中测试

package com.shuidi168.server.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.shuidi168.server.entity.User;
import com.shuidi168.server.service.IUserService;

@Controller
@RequestMapping(value="Demo")
public class DemoController {
	
	@Autowired
	private IUserService userService;
	
	
	@RequestMapping(value="getUser")
	public String demo(){
		User user = userService.getById(1);
		System.out.println(user.getName());
		return "index";
	}

}

如果表中存在数据,则成功取出。至此测试完成。

猜你喜欢

转载自blog.csdn.net/water_3700348/article/details/83585216