1. 程式人生 > >springmvc4+hibernate4整合框架的搭建,超詳細哦

springmvc4+hibernate4整合框架的搭建,超詳細哦

放假了!週六日休息!來北京真的不容易呀!和他們一起租房雖然便宜吧!但是週六都在打遊戲!無賴,只能來公司了,前幾天一直糾結於怎麼搭建springmvc+hibernate整合框架,百度了一番,各種報錯的情況,最終算是搭建好了吧!其實對於我個人來說,以前做Android開發和 Struts+spring+hibernate的網站開發來說,springmvc+hibernate應該是沒有什麼問題的,凡事都得動手,沒有看出來的技術,只有實踐的真理!下面我們來看看搭建過程吧
專案原始碼https://github.com/twjitm/sj 這是我的GitHub,歡迎star。
NO.1
建立一個web專案
這裡寫圖片描述


在WEB-INF下面建立lib資料夾,用於管理各種jar包
No.2
準備各種必備的jar包,如下圖所示
這裡寫圖片描述

No.3
配置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">
<display-name>test_ssh</display-name> <welcome-file-list> <welcome-file>login.jsp</welcome-file> </welcome-file-list> <!-- 載入所有的配置檔案 --> <context-param> <param-name>contextConfigLocation</param-name
>
<param-value>classpath*:config/spring/applicationContext.xml</param-value> </context-param> <!-- 配置Spring監聽 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</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*:config/spring/spring-servlet.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>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> <!-- 配置Session --> <filter> <filter-name>openSession</filter-name> <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class> </filter> <filter-mapping> <filter-name>openSession</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>

No.4
配置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:p="http://www.springframework.org/schema/p"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:jaxws="http://cxf.apache.org/jaxws"
    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://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.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">
    <!--需要引入的配置檔案
            <import resource="classpath:META-INF/cxf/cxf.xml"/>
            <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>
            <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
--> 
        <context:component-scan base-package="com.tgb.*" />
        <!-- 開啟註釋處理器 -->
        <context:annotation-config/>
        <!-- 配置資料來源 -->
        <context:property-placeholder location="classpath*:config/spring/jdbc.properties" />
    <!-- 配置資料來源 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://127.0.0.1:3306/lrdb"></property>
        <property name="username" value="root"></property>
<!--        <property name="password" value="1"></property>
 -->    </bean>
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource"><ref bean="dataSource" /></property>
        <!-- 掃描實體(pojo) -->
        <property name="namingStrategy">
        <bean class="org.hibernate.cfg.ImprovedNamingStrategy"></bean>
        </property>
        <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> -->
            <props>
            <prop key="hibernate.show_sql">org.hibernate.dialect.MySQLInnoDBDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.format_sql">true</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>

            </props>
        </property>
        <!-- 自動掃描實體包 -->
        <property name="packagesToScan">
            <list>
                <value>com.tgb.entity</value>
                <value>com.tgb.entity.view</value>
            </list>
        </property>
    </bean>
    <!-- 實物管理器 -->
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

    <tx:advice id="transactionAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="add*" />
            <tx:method name="save*" />
            <tx:method name="update*" />
            <tx:method name="modify*" />
            <tx:method name="edit*" />
            <tx:method name="delete*" />
            <tx:method name="remove*" />
            <tx:method name="change*" />
            <tx:method name="repair" />
            <tx:method name="deleteAndRepair" />
            <tx:method name="get*" propagation="SUPPORTS" />
            <tx:method name="find*" propagation="SUPPORTS" />
            <tx:method name="load*" propagation="SUPPORTS" />
            <tx:method name="search*" propagation="SUPPORTS" />
            <tx:method name="datagrid*" propagation="SUPPORTS" />
            <tx:method name="*" propagation="SUPPORTS" />
        </tx:attributes>

    </tx:advice>

    <aop:config proxy-target-class="true">
        <aop:pointcut id="transactionPointcut" expression="execution(* com.tgb.service.*.*(..))" />
        <aop:advisor pointcut-ref="transactionPointcut"
            advice-ref="transactionAdvice" />
    </aop:config>
    <!-- 註解方式配置事物 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>
    </beans>

No.5配置spring-servlet.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"
    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-3.2.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
    <!-- 註解掃描包 -->
    <context:component-scan base-package="com.tgb" />
    <!-- 開啟註解 -->
    <mvc:annotation-driven />
    <!-- 靜態資源(js/image)的訪問 -->
    <mvc:resources location="/js/" mapping="/js/**"/>

    <!-- 定義檢視解析器 -->    
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>
</beans>

No.6配置jdbc.properties檔案

proxool.alias=lrdb
proxool.file=proxool.xml
proxool.providerClass=org.hibernate.service.jdbc.connections.internal.ProxoolConnectionProvider 
proxool.maxConnCount=100
proxool.minConnCount=10
proxool.statistics=1m,15m,1h,1d
proxool.simultaneousBuildThrottle=5
proxool.trace=false
proxool.verbose=false
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/dbname
jdbc.username=root
jdbc.password=

hibernate.hbm2ddl.auto=none
hibernate.show_sql=true
hibernate.format_sql=true
hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.temp.use_jdbc_metadata_defaults=false

測試:
到這裡,環境基本搭建完成了,寫程式碼測試一下
首先看看程式碼的結構圖
這裡寫圖片描述
資料庫表設計
這裡寫圖片描述
為了方便測試環境框架就建立了一個簡簡單單的實體類
dao層程式碼

package com.tgb.dao;

import java.util.List;

import com.tgb.entity.User;

public interface IUserDao {

    public User getUser(String id);

    public List<User> getAllUser();

    public void addUser(User user);

    public boolean delUser(String id);

    public boolean updateUser(User user);
}

dao實現類

package com.tgb.dao;

import java.util.List;

import javax.annotation.Resource;

import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.tgb.base.BaseDao;
import com.tgb.entity.User;
@Repository
public class UserDao implements IUserDao {
     @Autowired
    private SessionFactory sessionFactory;
     @Resource
     private BaseDao<User> baseDao;
    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    @Override
    public User getUser(String id) {

        String hql = "from User u where u.id=?";
        Query query = sessionFactory.getCurrentSession().createQuery(hql);
        query.setString(0, id);

        return (User)query.uniqueResult();
    }

    @Override
    public List<User> getAllUser() {
        String hql = "from User";
        //baseDao.find(hql);
        //Query query = sessionFactory.getCurrentSession().createQuery(hql);
        return baseDao.find(hql);
    }

    @Override
    public void addUser(User user) {
        sessionFactory.getCurrentSession().save(user);
    }

    @Override
    public boolean delUser(String id) {

        String hql = "delete User u where u.id = ?";
        Query query = sessionFactory.getCurrentSession().createQuery(hql);
        query.setString(0, id);
        return (query.executeUpdate() > 0);
    }

    @Override
    public boolean updateUser(User user) {

        String hql = "update User u set u.userName = ?,u.age=? where u.id = ?";
        Query query = sessionFactory.getCurrentSession().createQuery(hql);
        query.setString(0, user.getUserName());
        query.setString(1, user.getAge());
        query.setString(2, user.getId());

        return (query.executeUpdate() > 0);
    }

}

service層方法

package com.tgb.service;

import java.util.List;

import com.tgb.entity.User;

public interface IUserService {

    public User getUser(String id);

    public List<User> getAllUser();

    public void addUser(User user);

    public boolean delUser(String id);

    public boolean updateUser(User user);

}

service實現類

package com.tgb.service;

import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import com.tgb.dao.IUserDao;
import com.tgb.entity.User;
@Service
public class UserService implements IUserService {
    @Resource
    private IUserDao userDao;

    public void setUserDao(IUserDao userDao) {
        this.userDao = userDao;
    }

    @Override
    public User getUser(String id) {
        return userDao.getUser(id);
    }

    @Override
    public List<User> getAllUser() {
        return userDao.getAllUser();
    }

    @Override
    public void addUser(User user) {
        userDao.addUser(user);
    }

    @Override
    public boolean delUser(String id) {

        return userDao.delUser(id);
    }

    @Override
    public boolean updateUser(User user) {
        return userDao.updateUser(user);
    }

}

controller層

package com.tgb.controller;

import java.io.IOException;
import java.io.PrintWriter;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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

import com.tgb.entity.User;
import com.tgb.service.IUserService;

@Controller
@RequestMapping("/user")
public class UserController {
    @Resource
    private IUserService userService;

    @RequestMapping("/getAllUser")
    public String getAllUser(HttpServletRequest request){
        request.setAttribute("userList", userService.getAllUser());
        return "/index";
    }

    @RequestMapping("/getUser")
    public String getUser(String id,HttpServletRequest request){

        request.setAttribute("user", userService.getUser(id));

        return "/editUser";
    }

    @RequestMapping("/toAddUser")
    public String toAddUser(){
        return "/addUser";
    }

    @RequestMapping("/addUser")
    public String addUser(User user,HttpServletRequest request){

        userService.addUser(user);

        return "redirect:/user/getAllUser";
    }

    @RequestMapping("/delUser")
    public void delUser(String id,HttpServletResponse response){

        String result = "{\"result\":\"error\"}";

        if(userService.delUser(id)){
            result = "{\"result\":\"success\"}";
        }

        response.setContentType("application/json");

        try {
            PrintWriter out = response.getWriter();
            out.write(result);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @RequestMapping("/updateUser")
    public String updateUser(User user,HttpServletRequest request){
        if(userService.updateUser(user)){
            user = userService.getUser(user.getId());
            request.setAttribute("user", user);
            return "redirect:/user/getAllUser";
        }else{
            return "/error";
        }
    }
}

看看效果,雖然簡單,足以說明問題
這裡寫圖片描述
這裡寫圖片描述
到此,springmvc+spring+hibernate框架搭建完成,其實我是想在家的時候無聊寫寫js才弄這個框架的,哎,我們公司要求我們必須啥都會,我一個後臺程式設計師,不說了,調css去了,要原始碼的小夥伴留下郵箱!當晚必發!!!!!!!!