十分钟年华老去

倒数时日,焦躁空下。

导航

Spring3.1+SpringMVC3.1+ SpringJDBC+Hibernate4.0

Posted on 2013-04-29 22:05  CN.programmer.Luxw  阅读(1539)  评论(0编辑  收藏  举报

SpringMVC是越来越火,自己也弄一个Spring+SpringMVC+SpringJDBC+Hibernate的简单框架。文件结构:

 

1、搭建环境。

    1)下载Spring3.1.2的发布包,Hibernate4.1.7的发布包,下载 dbcp 连接池框架及其依赖的jar,全部所用到的jar包如下 (有的包暂时木用到,如ehcache缓存包、oracle驱动包等): 

antlr-2.7.7.jar

aopalliance-1.0.jar

commons-beanutils-1.8.3.jar

commons-collections-3.2.1.jar

commons-dbcp-1.4.jar

commons-fileupload-1.2.2.jar

commons-io-2.0.1.jar

commons-lang-2.5.jar

commons-logging-1.1.1.jar

commons-pool-1.5.6.jar

dom4j-1.6.1.jar

ehcache-core-2.5.2.jar

ftplet-api-1.0.6.jar

ftpserver-core-1.0.6.jar

hibernate-commons-annotations-4.0.1.Final.jar

hibernate-core-4.0.1.Final.jar

hibernate-jpa-2.0-api-1.0.1.Final.jar

jackson-all-1.8.5.jar

javabase64-1.3.1.jar

javassist-3.15.0-GA.jar

jboss-logging-3.1.0.CR2.jar

jboss-transaction-api_1.1_spec-1.0.0.Final.jar

jcl-over-slf4j-1.5.2.jar

jstl-1.1.2.jar

jtds-1.2.5.jar

junit-4.9b2.jar

log4j-1.2.16.jar

mina-core-2.0.4.jar

mysql-connector-java-5.1.18-bin.jar

ojdbc14_g.jar

org.springframework.aop-3.1.1.RELEASE.jar

org.springframework.asm-3.1.1.RELEASE.jar

org.springframework.aspects-3.1.1.RELEASE.jar

org.springframework.beans-3.1.1.RELEASE.jar

org.springframework.context.support-3.1.1.RELEASE.jar

org.springframework.context-3.1.1.RELEASE.jar

org.springframework.core-3.1.1.RELEASE.jar

org.springframework.expression-3.1.1.RELEASE.jar

org.springframework.instrument.tomcat-3.1.1.RELEASE.jar

org.springframework.instrument-3.1.1.RELEASE.jar

org.springframework.jdbc-3.1.1.RELEASE.jar

org.springframework.jms-3.1.1.RELEASE.jar

org.springframework.orm-3.1.1.RELEASE.jar

org.springframework.oxm-3.1.1.RELEASE.jar

org.springframework.test-3.1.1.RELEASE.jar

org.springframework.transaction-3.1.1.RELEASE.jar

org.springframework.web.portlet-3.1.1.RELEASE.jar

org.springframework.web.servlet-3.1.1.RELEASE.jar

org.springframework.web.struts-3.1.1.RELEASE.jar

org.springframework.web-3.1.1.RELEASE.jar

servlet-api.jar

slf4j-api-1.5.2.jar

slf4j-log4j12-1.5.2.jar

standard-1.1.2.jar

  2)建立一个Web Project,引入上述jar包

    2.1)web.xml配置如下:

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <!-- 配置Spring提供的,用于创建容器对象的监听器 -->
    <listener>
        <description>spring监听器</description>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring.xml,classpath:spring-hibernate.xml</param-value>
    </context-param>
    
    <!-- 配置Spring的OpenSessionInViewFilter,用于解决懒异常的问题 -->
    <filter>
        <filter-name>openSessionInViewFilter</filter-name>
        <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>openSessionInViewFilter</filter-name>
        <url-pattern>*.do</url-pattern>
    </filter-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>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
    <!-- Spring 刷新Introspector防止内存泄露 -->
    <listener>
        <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
    </listener>
    
    <!-- springmvc配置 -->
    <servlet>
        <servlet-name>springMvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <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>*.do</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>3</session-timeout>
    </session-config>
    
      <welcome-file-list>
                <welcome-file>index.jsp</welcome-file>
       </welcome-file-list>
</web-app>

    2.2)在resources目录下建立log4j.properties日志配置文件,内容如下:

 

log4j.rootLogger=INFO,A1,R

log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.Target=System.out
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=[%c]%m%n

log4j.appender.R=org.apache.log4j.RollingFileAppender 
log4j.appender.R.File=../programmer.log
log4j.appender.R.MaxFileSize=10MB
log4j.appender.R.Threshold=ALL
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH\:mm\:ss,SSS}][%c]%m%n

 

   2.3)在resources目录下建立数据库连接属性配置文件config.properties,内容如下:

hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.hbm2ddl.auto=update
hibernate.show_sql=true
hibernate.format_sql=false
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/programmer?useUnicode=true&characterEncoding=UTF-8
username=root
password=root

   2.4)在resources目录下spring.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"
    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
">

    <!-- 引入属性文件 -->
    <context:property-placeholder location="classpath:config.properties" />

    <!-- 自动扫描dao和service包(自动注入) -->
    <context:component-scan base-package="cn.**.dao,cn.**.service" />

</beans>

   2.5)在resources目录下spring-hibernate.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:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
">

    
    <!-- dbcp数据源 -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="${driverClassName}"></property>
        <property name="url" value="${url}"></property>
        <property name="username" value="${username}"></property>
        <property name="password" value="${password}"></property>
    </bean>

    
    <bean id="nativeJdbcExtractor" class="org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor" lazy-init="true" >
    </bean>     
    
    <!-- 配置Jdbc模板 -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
         <property name="nativeJdbcExtractor" ref="nativeJdbcExtractor"/>
    </bean>
    
     <!-- 大字段处理 --> 
    <bean id="lobHandler" class="org.springframework.jdbc.support.lob.DefaultLobHandler">
    </bean>
    <!-- 用hibernate来管理事务
    <bean id="jdbcTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
     -->
    
    
    <!-- hibernate框架配置 -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
                <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>
            </props>
        </property>

        <!-- 注解方式配置 -->
        <!-- <property name="packagesToScan"> <list> <value>sy.hbm</value> </list> 
            </property> -->

        <!-- hbm方式配置 -->
        <property name="mappingDirectoryLocations">
            <list>
                <value>classpath:model/hbm</value>
            </list>
        </property>
    </bean>

    <!-- 配置事务 -->
    <bean name="hibernateTransactionManager"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>
    <!-- 以 @Transactional 标注来定义事务 -->
    <tx:annotation-driven transaction-manager="hibernateTransactionManager" />
    
    

</beans>

  2.6)在resources目录下spring-mvc.xml配置文件,内容如下:

<?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"
    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.0.xsd">

    <!-- 自动扫描controller包下的所有类,使其认为spring mvc的控制器 -->
    <context:component-scan base-package="cn.**.controller" />
    
    
    <!-- 避免IE执行AJAX时,返回JSON出现下载文件 -->
    <bean id="mappingJacksonHttpMessageConverter"
        class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
        <property name="supportedMediaTypes">
            <list>
                <value>text/html;charset=UTF-8</value>
            </list>
        </property>
    </bean>

    <!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
    <bean
        class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <list>
                <ref bean="mappingJacksonHttpMessageConverter" /><!-- json转换器 -->
            </list>
        </property>
    </bean>

    <!-- 配置视图解析器,将ModelAndView及字符串解析为具体的页面 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"  p:viewClass="org.springframework.web.servlet.view.JstlView"  p:prefix="/WEB-INF/jsp/"  p:suffix=".jsp" />

    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="defaultEncoding">
            <value>UTF-8</value>
        </property>
        <property name="maxUploadSize">
            <value>32505856</value><!-- 上传文件大小限制为31M,31*1024*1024 -->
        </property>
        <property name="maxInMemorySize">
            <value>4096</value>
        </property>
    </bean>
</beans>

 2、编写代码

    1)在WEB-INF目录下建立名叫jsp的文件夹,用于放置jsp页面,和SpringMVC配置文件中的<property name="prefix" value="/WEB-INF/jsp/"/>相对应。

    2)2)创建一个实体。

 

package cn.luxw.app.model;

import java.io.Serializable;




/**
 * 用户
 * 
 * @author luxw
 * 
 */
@SuppressWarnings("serial")
public class User implements Serializable {
    private int id;
    private String userName;
    private String password;
    
    
    public User(){}
    public User(String userName) {
        this.userName = userName;
    }
    public String getUserName() {
        return userName;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", userName=" + userName + ", password="
                + password + "]";
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }

}

 

  3)hibernate映射文件

 

<?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">

<hibernate-mapping package="cn.luxw.app.model">
    <class name="User" table="t_user">
        <id name="id">
            <generator class="native"></generator>
        </id>
        <property name="userName"></property>
        <property name="password"></property>
    </class>
</hibernate-mapping>

  4)通用DAO,用于其他DAO继承

 

package cn.luxw.app.common;


import java.util.List;
public interface BaseDao<T> {

    /**
     * 保存实体
     * 
     * @param entity
     */
    void save(T entity);

    /**
     * 更新实体
     * 
     * @param entity
     */
    void update(T entity);

    /**
     * 删除实体
     * 
     * @param id
     */
    void delete(Long id);

    /**
     * 根据id获取
     * 
     * @param id
     * @return
     */
    T getById(Long id);

    /**
     * 获取多个
     * 
     * @param ids
     * @return
     */
    List<T> getByIds(Long[] ids);

    /**
     * 查询所有
     * 
     * @return
     */
    List<T> findAll();

}

 

   5)实现

package cn.luxw.app.common;


import java.lang.reflect.ParameterizedType;
import java.util.Collections;
import java.util.List;

import javax.annotation.Resource;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

@SuppressWarnings("unchecked")
public abstract class BaseDaoImpl<T> implements BaseDao<T> {

    @Resource
    private SessionFactory sessionFactory;
    protected Class<T> clazz; 

    public BaseDaoImpl() {
        // 通过反射得到T的真实类型,这个类型是由子类声明中传递过来的
        ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
        this.clazz = (Class<T>) pt.getActualTypeArguments()[0];

        System.out.println("clazz = " + clazz);
    }

    public void save(T entity) {
        getSession().save(entity);
    }

    public void update(T entity) {
        getSession().update(entity);
    }

    public void delete(Long id) {
        Object obj = getSession().get(clazz, id);
        getSession().delete(obj);
    }

    public T getById(Long id) {
        if (id == null) {
            return null;
        } else {
            return (T) getSession().get(clazz, id);
        }
    }

    public List<T> getByIds(Long[] ids) {
        // 要先判断参数的有效性
        if (ids == null || ids.length == 0) {
            return Collections.EMPTY_LIST;
        } else {
            return getSession().createQuery(//
                    "FROM " + clazz.getName() + " o WHERE o.id IN (:ids)")//
                    .setParameterList("ids", ids)//
                    .list();
        }
    }

    public List<T> findAll() {
        return getSession().createQuery("FROM " + clazz.getName()).list();
    }

    /**
     * 获取当前可用的Session
     * 
     * @return
     */
    protected Session getSession() {
        return sessionFactory.getCurrentSession();
    }
}

6)springJdbc的实现类

package cn.luxw.app.dao.impl;


import java.sql.ResultSet;
import java.sql.SQLException;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowCallbackHandler;
import org.springframework.stereotype.Repository;

import cn.luxw.app.dao.UserDao;
import cn.luxw.app.model.User;

@Repository
public class UserDaoImpl implements UserDao {
    
    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Override
    public void register(User user) {
        System.out.println("注册----方法");
        String sqlStr = "insert into t_user(userName,password) values(?,?)";
        Object[] params = new Object[]{user.getUserName(),user.getPassword()};
        jdbcTemplate.update(sqlStr, params);
    }

    @Override
    public User findUserByUserName(String userName) {
        String sqlStr = "select id,userName,password from t_user where userName=?";
        final User user = new User();
        jdbcTemplate.query(sqlStr, new Object[]{userName}, new RowCallbackHandler() {
            @Override
            public void processRow(ResultSet rs) throws SQLException {
                user.setId(rs.getInt("id"));
                user.setUserName(rs.getString("userName"));
                user.setPassword(rs.getString("password"));
            }
        });
        return user;
    }

}

  7)controller控制器

package cn.luxw.app.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

import cn.luxw.app.model.Role;
import cn.luxw.app.service.RoleService;
import cn.luxw.app.service.UserService;


@Controller
@RequestMapping("/UserController") 
public class UserController extends MultiActionController{
    
    @Autowired
    private UserService userService;
    
    @Autowired
    private RoleService roleService;
    
    @RequestMapping("/login") 
    public void login(){
        System.out.println("================进入控制层login=============");
        userService.register(0);
    }
    
    @RequestMapping("/save") 
    public void save(){
        System.out.println("================进入控制层save=============");
        Role user1 = new Role("叶飞");
        roleService.save1(user1);
        
    }
    
}

  8)其他实体类和接口略,springjdbc的事务管理用hibernate的实现,Controller/login传入参数为了在service处抛异常,测试事务。

        

      访问地址1http://localhost:8080/APP/UserController/login.do

       访问地址1http://localhost:8080/APP/UserController/save.do