spring + spring mvc + hibernate 整合
说明:链接oracle maven项目 最基础的没有文件上传之类的包
重新加载oracle的jar文件
- pom.xml
<properties>
<!-- 解决ajax的json接收转换问题 -->
<jackson.version>2.9.5</jackson.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.3.11.Final</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>javax.transaction</groupId>
<artifactId>jta</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<!-- Spring start -->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.8</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.21</version>
</dependency>
<!-- json自动转换 -->
<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-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<!-- josn end -->
- db.properties
#数据库驱动如果不配置,系统会根据url自动识别 #driverClassName=com.mysql.jdbc.Driver
#URL
druid.url=jdbc:oracle:thin:@localhost:1521:orcl
#用户名
druid.username=banxianyuan
#密码
druid.password=banxianyuan
filters=stat
initialSize=5
#最大连接池数量
maxActive=300
#获取连接时最大等待时间,单位毫秒
maxWait=60000
#Destroy线程会检测连接的间隔时间
timeBetweenEvictionRunsMillis=60000
minEvictableIdleTimeMillis=300000
#用来检测连接是否有效的sql,要求是一个查询语句
validationQuery=SELECT1
#建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,
#如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
testWhileIdle=true
#申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
testOnBorrow=false
#归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
testOnReturn=false
#是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。
poolPreparedStatements=false
maxPoolPreparedStatementPerConnectionSize=200
- 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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="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.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<import resource="applicationContext-tx.xml"/>
<context:component-scan base-package="com.mokong">
<!-- 不扫描带@Controller的注解 -->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- 加载外部配置文件 -->
<context:property-placeholder location="classpath:db.properties"/>
<!-- 配置数据源 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="username" value="${druid.username}"></property>
<property name="password" value="${druid.password}"></property>
<property name="url" value="${druid.url}"></property>
<property name="initialSize" value="${initialSize}"></property>
<property name="maxWait" value="${maxWait}"></property>
<property name="maxActive" value="${maxActive}"></property>
</bean>
<!-- SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="hibernateProperties">
<props>
<!-- 数据库方言 -->
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
<!-- 展示sql -->
<prop key="hibernate.show_sql">true</prop>
<!-- 格式化SQL -->
<prop key="hibernate.format_sql">true</prop>
<!-- 自动创建表 -->
<prop key="hibernate.hbm2ddl.auto">update</prop>
<!-- 指定数据库用户名 仅限于ORACLE -->
<prop key="default_schema">mokong</prop>
</props>
</property>
<!-- 扫描实体类所在包 -->
<property name="packagesToScan" value="com.mokong.stu.model"></property>
</bean>
<!-- 配置模板 -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate4.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
</beans>
- applicationContext-tx.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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="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.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<import resource="applicationContext-tx.xml"/>
<context:component-scan base-package="com.mokong">
<!-- 不扫描带@Controller的注解 -->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- 加载外部配置文件 -->
<context:property-placeholder location="classpath:db.properties"/>
<!-- 配置数据源 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="username" value="${druid.username}"></property>
<property name="password" value="${druid.password}"></property>
<property name="url" value="${druid.url}"></property>
<property name="initialSize" value="${initialSize}"></property>
<property name="maxWait" value="${maxWait}"></property>
<property name="maxActive" value="${maxActive}"></property>
</bean>
<!-- SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="hibernateProperties">
<props>
<!-- 数据库方言 -->
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
<!-- 展示sql -->
<prop key="hibernate.show_sql">true</prop>
<!-- 格式化SQL -->
<prop key="hibernate.format_sql">true</prop>
<!-- 自动创建表 -->
<prop key="hibernate.hbm2ddl.auto">update</prop>
<!-- 指定数据库用户名 仅限于ORACLE -->
<prop key="default_schema">mokong</prop>
</props>
</property>
<!-- 扫描实体类所在包 -->
<property name="packagesToScan" value="com.mokong.stu.model"></property>
</bean>
<!-- 配置模板 -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate4.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
</beans>
- log4j.properties
# Global logging configuration
log4j.rootLogger=DEBUG,stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p[%t]-%m%n
- 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:aop="http://www.springframework.org/schema/aop"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd">
<!-- 启动时自动扫描该包下所有的Bean -->
<context:component-scan base-package="com.mokong.*.controller" />
<!-- 静态资源放行 -->
<mvc:default-servlet-handler/>
<!-- 添加注解驱动 -->
<mvc:annotation-driven />
<!--所有的访问都统一先由InternalResourceViewResolver类处理-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--定义跳转的文件的前缀(jsp文件所在目录)-->
<property name="prefix" value="/" />
<!-- 定义跳转的文件的后缀 -->
<property name="suffix" value=".jsp" />
</bean>
</beans>
- wed.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<!--加载Spring配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- spring的监听 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 前端控制器配置 -->
<servlet>
<servlet-name>spring-mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 加载springmvc的配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<!-- 当启动Tomcat时立即加载此Servlet -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring-mvc</servlet-name>
<!-- restful风格 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 配置中文乱码 -->
<filter>
<filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
文件结构目录
- 实体类 stu 带hibernate注解
package com.mokong.stu.model;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.*;
@Entity
@Table(name="stu")
public class Stu implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="s_seq")
@SequenceGenerator(allocationSize=1,name="s_seq",sequenceName="s_seq")
//这里s_seq是oracle中序列
private Integer id;
@Column
private String name;
@Column
private Integer age;
@Column
private Date birthday;
public Stu() {
// TODO Auto-generated constructor stub
}
public Stu(Integer id, String name, Integer age, Date birthday) {
super();
this.id = id;
this.name = name;
this.age = age;
this.birthday = birthday;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "Stu [id=" + id + ", name=" + name + ", age=" + age + ", birthday=" + birthday + "]";
}
}
- 工具包 SessionFactoryUtils
package utils;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate4.HibernateTemplate;
public class SessionFactoryUtils {
@Autowired
private SessionFactory sessionFactory;
@Autowired
private HibernateTemplate hibernateTemplate;
//获取Session的方法
public Session getCurrentSession() {
if(sessionFactory!=null) {
return sessionFactory.getCurrentSession();
}
return null;
}
//获取模版
public HibernateTemplate getTemplate() {
return hibernateTemplate;
}
}
- 创建dao层接口
package com.mokong.stu.dao;
import com.mokong.stu.model.Stu;
public interface StuDao_I {
public Integer saveStudent(Stu stu);
public void deleteId(Stu stu);
public void update(Stu stu);
public Stu getId(Stu stu);
}
- 创建dao层接口的实例化
package com.mokong.stu.dao;
import org.springframework.stereotype.Repository;
import com.mokong.stu.model.Stu;
import utils.SessionFactoryUtils;
@Repository
public class StuDao extends SessionFactoryUtils implements StuDao_I {
@Override
public Integer saveStudent(Stu stu) {
Integer i=(Integer) getTemplate().save(stu);
return i;
}
@Override
public void deleteId(Stu stu) {
getTemplate().delete(stu);
}
@Override
public void update(Stu stu) {
getTemplate().update(stu);
}
@Override
public Stu getId(Stu stu) {
System.out.println("ss");
Stu stu2 = (Stu)getTemplate().get(Stu.class, stu.getId());
System.out.println(stu2);
return stu2;
}
}
- 创建service层接口 这里的方法名要对应applicationContext-tx.xml设置的命名规则
package com.mokong.stu.service;
import com.mokong.stu.model.Stu;
public interface StuService_I {
String saveStudent(Stu stu);
String deleteId(Stu stu);
String update(Stu stu);
Stu getId(Stu stu);
}
- 创建service层实例化
package com.mokong.stu.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.mokong.stu.dao.StuDao_I;
import com.mokong.stu.model.Stu;
@Service
public class StuService implements StuService_I{
@Autowired
private StuDao_I stuDao;
@Override
public String saveStudent(Stu stu) {
Integer saveStudent = stuDao.saveStudent(stu);
return saveStudent>0?"添加成功":"添加失败";
}
@Override
public String deleteId(Stu stu) {
int i = 0;
try {
i++;
stuDao.deleteId(stu);
} catch (Exception e) {
e.printStackTrace();
}
return i<0?"删除成功":"删除失败";
}
@Override
public String update(Stu stu) {
int i = 0;
try {
i++;
stuDao.update(stu);
} catch (Exception e) {
e.printStackTrace();
}
return i<0?"修改成功":"修改失败";
}
@Override
public Stu getId(Stu stu) {
return stuDao.getId(stu);
}
}
- controller层
package com.mokong.stu.controller;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.mokong.stu.model.Stu;
import com.mokong.stu.service.StuService_I;
@Controller
@RequestMapping("stu")
public class StuController {
@Autowired
private StuService_I stuService;
@RequestMapping("save")
@ResponseBody
public String save(Stu stu) {
String result = stuService.saveStudent(stu);
return result;
}
@RequestMapping("del")
@ResponseBody
public String deleteId(Stu stu) {
String result = stuService.deleteId(stu);
return result;
}
@RequestMapping("update")
@ResponseBody
public String update(Stu stu) {
String result = stuService.update(stu);
return reult;
}
@RequestMapping("getId")
@ResponseBody
public Stu getId(Stu stu) {
Stu stu2 = stuService.getId(stu);
return stu2;
}
}
- 测试
在controller层save方法点上debug
在浏览器地址栏http://localhost:8080/stu/save?name=张三
运行之后看数据库是否添加张三这条数据