快速搭建springmvc+spring data jpa工程


一、前言

  這里簡單講述一下如何快速使用springmvc和spring data jpa搭建后台開發工程,並提供了一個簡單的demo作為參考。

二、創建maven工程

  http://www.cnblogs.com/hujunzheng/p/5450255.html

三、配置文件說明

  1.application.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/springdata?useUnicode=true&characterEncoding=utf-8
jdbc.username=root
jdbc.password=123456
jdbc.pool.initialSize=5
jdbc.pool.maxActive=300
jdbc.pool.maxIdle=10
jdbc.pool.minIdle=8
jdbc.pool.maxWait=60000
jdbc.pool.minEvictableIdleTimeMillis=6000
jdbc.pool.removeAbandoned=true
jdbc.pool.removeAbandonedTimeout=120
jdbc.pool.logAbandoned=true
jdbc.pool.testOnBorrow=true
jdbc.pool.testWhileIdle=true
jdbc.pool.validationQuery=select 1 from dual
jdbc.pool.validationQueryTimeout=1
jdbc.pool.timeBetweenEvictionRunsMillis=30000
jdbc.pool.numTestsPerEvictionRun=300
View Code

  配置數據庫連接的常用屬性

  2.spring公共配置文件

<?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-4.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"
    default-lazy-init="true">

    <description>Spring公共配置</description>

    <bean id="propertyConfigurer"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>/WEB-INF/config/application.properties</value>
            </list>
        </property>
    </bean>

    <bean id="configProperties"
        class="org.springframework.beans.factory.config.PropertiesFactoryBean">
        <property name="locations">
            <list>
                <value>/WEB-INF/config/application.properties</value>
            </list>
        </property>
    </bean>
 
    <!-- 使用annotation 自動注冊bean, 並保證@Required、@Autowired的屬性被注入 -->
    <context:component-scan base-package="com.hjz">
        <context:exclude-filter type="annotation"
            expression="org.springframework.stereotype.Controller" />
        <context:exclude-filter type="annotation"
            expression="org.springframework.web.bind.annotation.ControllerAdvice" />
    </context:component-scan>
</beans>
View Code

  配置configProperties(可以在xml文件中讀取application.properties中屬性),當然換成<context:property-placeholder location="application.properties"/>更簡潔一些。還有就是使用annotation 自動注冊bean, 並保證@Required、@Autowired的屬性被注入,這里排除了Controller注解類的掃描。

  3.spring mvc配置文件

<?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/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">

    <context:component-scan base-package="com.hjz"
        use-default-filters="false">
        <context:include-filter type="annotation"
            expression="org.springframework.stereotype.Controller" />
        <context:include-filter type="annotation"
            expression="org.springframework.web.bind.annotation.ControllerAdvice" />
    </context:component-scan>

    <mvc:annotation-driven>
        <mvc:message-converters register-defaults="true">
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <constructor-arg value="UTF-8" />
                <property name="writeAcceptCharset" value="false" />
            </bean>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="prettyPrint" value="true" />
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/" />
        <property name="suffix" value=".jsp" />
    </bean>
    <!-- 靜態資源訪問  -->
    <mvc:resources location="/WEB-INF/img/" mapping="/img/**"/>   
    <mvc:resources location="/WEB-INF/js/" mapping="/js/**"/>    
    <mvc:resources location="/WEB-INF/css/" mapping="/css/**"/>  
        
    <mvc:default-servlet-handler />

</beans>
View Code

  配置對Controller注解類的掃描,消息轉換器(針對String和Json的解析),視圖解析器(這里只配置了jsp的視圖解析器),靜態資源的訪問映射。

  4.spring data jpa配置文件

<?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:jpa="http://www.springframework.org/schema/data/jpa"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
       http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd

       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd"
    default-lazy-init="true">

    <!-- 數據源配置, 使用Tomcat JDBC連接池 -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="${jdbc.driver}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <!--initialSize: 初始化連接 -->
        <property name="initialSize" value="${jdbc.pool.initialSize}" />
        <!--maxActive: 最大連接數量 -->
        <property name="maxActive" value="${jdbc.pool.maxActive}" />
        <!--minIdle: 最小空閑連接 -->
        <property name="minIdle" value="${jdbc.pool.minIdle}" />
        <!--maxIdle: 最大空閑連接 -->
        <property name="maxIdle" value="${jdbc.pool.maxIdle}" />
        <!--maxWait: 超時等待時間以毫秒為單位 -->
        <property name="maxWait" value="${jdbc.pool.maxWait}" />
        <!-- 連接被泄露時是否打印 -->
        <property name="logAbandoned" value="${jdbc.pool.logAbandoned}" />
        <!--removeAbandoned: 是否自動回收超時連接 -->
        <property name="removeAbandoned" value="${jdbc.pool.removeAbandoned}" />
        <!--removeAbandonedTimeout: 超時時間(以秒數為單位) -->
        <property name="removeAbandonedTimeout" value="${jdbc.pool.removeAbandonedTimeout}" />
        <!-- 連接在池中保持空閑而不被空閑連接回收器線程(如果有)回收的最小時間值,單位毫秒 -->
        <property name="minEvictableIdleTimeMillis" value="${jdbc.pool.minEvictableIdleTimeMillis}" />
        <property name="testOnBorrow" value="${jdbc.pool.testOnBorrow}" />
        <property name="testWhileIdle" value="${jdbc.pool.testWhileIdle}" />
        <property name="validationQuery" value="${jdbc.pool.validationQuery}" />
        <property name="validationQueryTimeout" value="${jdbc.pool.validationQueryTimeout}" />
        <property name="timeBetweenEvictionRunsMillis" value="${jdbc.pool.timeBetweenEvictionRunsMillis}" />
        <property name="numTestsPerEvictionRun" value="${jdbc.pool.numTestsPerEvictionRun}" />
    </bean>

    <!-- Jpa Entity Manager 配置 -->
    <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter" />
        <property name="packagesToScan">
            <array>
                <value>com.hjz</value>
            </array>
        </property>
        <property name="jpaProperties">
            <props>
                <!-- 命名規則 My_NAME->MyName -->
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop>
                <prop key="hibernate.show_sql">true</prop>
            </props>
        </property>
    </bean>

    <!-- Spring Data Jpa配置 -->
    <jpa:repositories base-package="com.hjz"
        transaction-manager-ref="transactionManager"
        entity-manager-factory-ref="entityManagerFactory"
        factory-class="com.hjz.dao.impl.BaseDaoFactoryBean">
    </jpa:repositories>
 
    <bean id="hibernateJpaVendorAdapter"
        class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
        <property name="databasePlatform">
            <bean factory-method="getDialect"
                class="org.springside.modules.persistence.Hibernates">
                <constructor-arg ref="dataSource" />
            </bean>
        </property>
    </bean>

    <!-- Jpa 事務配置 -->
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>

    <!-- 使用annotation定義事務 -->
    <tx:annotation-driven transaction-manager="transactionManager"
        proxy-target-class="true" />

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

</beans>
View Code

  數據源配置, 使用Tomcat JDBC連接池;Jpa Entity Manager 配置;Spring Data Jpa repository 自定義工廠配置。

  5.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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
    <display-name>Archetype Created Web Application</display-name>
    <welcome-file-list>
        <welcome-file>/WEB-INF/views/index.html</welcome-file>
    </welcome-file-list>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/config/applicationContext.xml,
            /WEB-INF/config/applicationContext-jpa.xml
        </param-value>
    </context-param>
    <context-param>
        <param-name>spring.profiles.default</param-name>
        <param-value>production</param-value>
    </context-param>
    <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>

    <filter>
        <filter-name>accessControlFilter</filter-name>
        <filter-class>com.hjz.filter.AccessControlFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>accessControlFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <filter>
        <filter-name>openEntityManagerInViewFilter</filter-name>
        <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>openEntityManagerInViewFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <servlet>
        <servlet-name>springServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/config/spring-mvc-config.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>20</session-timeout>
    </session-config>
    <error-page>
        <exception-type>java.lang.Throwable</exception-type>
        <location>/WEB-INF/views/error/500.jsp</location>
    </error-page>
    <error-page>
        <error-code>500</error-code>
        <location>/WEB-INF/views/error/500.jsp</location>
    </error-page>
    <error-page>
        <error-code>404</error-code>
        <location>/WEB-INF/views/error/404.jsp</location>
    </error-page>
</web-app>
View Code

  配置welcome-file-list,contextConfigLocation,encodingFilter,accessControlFilter(解決跨域訪問),openEntityManagerInViewFilter(將一個JPAsession與一次完整的請求過程對應的線程相綁定,session在整個view層結束后才關閉。),Spring ContextLoaderListener,Spring MVC DispatcherServlet。

四、spring data jpa自定義repository工廠

  1.基礎實體類

package com.hjz.entity;

import org.hibernate.annotations.GenericGenerator;

import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import java.io.Serializable;
import java.sql.Timestamp;

@MappedSuperclass
public abstract class AbsIdEntity implements Serializable {

    private static final long serialVersionUID = 7988377299341530426L;

    public final static int IS_DELETE_YES = 1;// 標記刪除
    public final static int IS_DELETE_NO = 0;// 未刪除,保留的

    @Id
    @GenericGenerator(name="uuid", strategy="uuid")
    @GeneratedValue(generator="uuid")
    protected String id;

    @Column(name = "creationtime")
    protected Timestamp creationTimestamp = new Timestamp(System.currentTimeMillis());

    @Column(name = "lastmodifiedtime")
    protected Timestamp modificationTimestamp = new Timestamp(System.currentTimeMillis());
    
    @Column(name = "dr")
    protected int dr;// 是否刪除。0:未刪除;1:已刪除

    /**
     * 主鍵,對應id字段
     */
    public String getId() { return id; }
    public void setId(String id) { this.id = id; }

    /**
     * 創建日期,對應ts_insert字段
     */
    public Timestamp getCreationTimestamp() { return creationTimestamp; }
    public void setCreationTimestamp(Timestamp creationTimestamp) { this.creationTimestamp = creationTimestamp; }

    /**
     * 修改日期,對應ts_update字段
     */
    public Timestamp getModificationTimestamp() { return modificationTimestamp; }
    public void setModificationTimestamp(Timestamp modificationTimestamp) { this.modificationTimestamp = modificationTimestamp; }

    /**
     * 是否刪除,對應dr字段
     * @return
     */
    public int getDr() {
        return dr;
    }
    public void setDr(int dr) {
        this.dr = dr;
    }

}
View Code

  首先說明,所有的實體類都會繼承 基礎實體類 AbsIdEntity。

  對應的VO類

package com.hjz.vo;

import java.io.Serializable;

public class PersonVO extends SuperVO implements Serializable{

    private static final long serialVersionUID = -4745138914786180462L;
    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}
View Code

  2.自定義工廠

package com.hjz.dao.impl;

import java.io.Serializable;
import javax.persistence.EntityManager;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.support.JpaRepositoryFactory;
import org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean;
import org.springframework.data.jpa.repository.support.SimpleJpaRepository;
import org.springframework.data.repository.core.RepositoryInformation;
import org.springframework.data.repository.core.RepositoryMetadata;
import org.springframework.data.repository.core.support.RepositoryFactorySupport;

import com.hjz.entity.AbsIdEntity;

public class BaseDaoFactoryBean<R extends JpaRepository<T, Serializable>, T extends AbsIdEntity> extends JpaRepositoryFactoryBean<R, T, Serializable> {

    @Override
    protected RepositoryFactorySupport createRepositoryFactory(final EntityManager entityManager) {
        return new JpaRepositoryFactory(entityManager) {

            protected SimpleJpaRepository<T, Serializable> getTargetRepository(
                    RepositoryInformation information,    EntityManager entityManager) {
                return new BaseDaoImpl((Class<T>) information.getDomainType(), entityManager);
            }

            @Override
            protected Class<?> getRepositoryBaseClass(RepositoryMetadata metadata) {
                return BaseDaoImpl.class;
            }
        };
    }
}
View Code

   工廠中返回的自定義的JpaRepository, 如下。

  3.自定義JpaRepository

package com.hjz.dao.impl;

import java.io.Serializable;
import java.sql.Timestamp;

import javax.persistence.EntityManager;

import org.springframework.data.jpa.repository.support.JpaEntityInformation;
import org.springframework.data.jpa.repository.support.SimpleJpaRepository;
import org.springframework.transaction.annotation.Transactional;

import com.hjz.dao.BaseDao;
import com.hjz.entity.AbsIdEntity;
@Transactional
public class BaseDaoImpl<T extends AbsIdEntity> extends SimpleJpaRepository<T, Serializable> implements BaseDao<T> {

    private final EntityManager entityManager;
    
    public BaseDaoImpl(Class<T> domainClass, EntityManager entityManager) {
        super(domainClass, entityManager);
        this.entityManager = entityManager;
    }

    public BaseDaoImpl(JpaEntityInformation<T, Serializable> information, EntityManager entityManager){
        super(information, entityManager);
        this.entityManager = entityManager;
    }
    
    @Override
    public <S extends T> S save(S entity) {
        entity.setModificationTimestamp(new Timestamp(System.currentTimeMillis()));
        return super.save(entity);
    }
    
    //進行邏輯刪除
    @Override
    public void delete(T entity) {
        entity.setDr(1);
        save(entity);
    }

    @Override
    public void delete(Serializable id) {
        T entity = findOne(id);
        entity.setDr(1);
        this.save(entity);
    }
    
}
View Code

  重寫了刪除方法,這里做邏輯刪除

五、后台開發模式

  1.實體類

package com.hjz.entity;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;

@Entity
@Table(name = "person")
public class PersonEntity extends AbsIdEntity implements Serializable{

    private static final long serialVersionUID = -1649223236097252346L;
    
    @Column(name = "name")
    private String name;
    @Column(name = "age")
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}
View Code

  實體對應的VO

package com.hjz.vo;

import java.io.Serializable;

public class PersonVO extends SuperVO implements Serializable{

    private static final long serialVersionUID = -4745138914786180462L;
    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}
View Code

   2.repository類

package com.hjz.dao;

import java.util.List;

import javax.transaction.Transactional;

import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;

import com.hjz.entity.PersonEntity;

public interface PersonDao extends BaseDao<PersonEntity>{
    @Query(value = "select * from person where dr = 0", nativeQuery = true)
    List<PersonEntity> findAllPersons();
    
    @Query(value = "select * from person where dr = 0 and id = ?1", nativeQuery = true)
    PersonEntity findOneById(String id);
    
    @Transactional
    @Modifying
    @Query(value = "update PersonEntity set dr = 1 where id in (?1)")
    int deletePersons(List<String> ids);
}
View Code

  3.service類

package com.hjz.service;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;

import com.hjz.dao.PersonDao;
import com.hjz.entity.PersonEntity;
import com.hjz.vo.PersonVO;

@Service
public class PersonService {
    
    @Autowired
    private PersonDao personDao;
    
    public List<PersonVO> findAllPersons(){
        List<PersonVO> listVO = new ArrayList<>();
        List<PersonEntity> listEntity = personDao.findAllPersons();
        for(PersonEntity entity : listEntity) {
            PersonVO vo = new PersonVO();
            BeanUtils.copyProperties(entity, vo);
            listVO.add(vo);
        }
        return listVO;
    }
    
    public List<PersonVO> findPageablePersons(Pageable pageable){
        
        List<PersonVO> listVO = new ArrayList<>();
        
        Page<PersonEntity> pageEntity = personDao.findAll(new Specification<PersonEntity>() {
            @Override
            public Predicate toPredicate(Root<PersonEntity> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
                return cb.equal(root.get("dr").as(Integer.class), 0);
            }
        }, pageable);
        
        for (PersonEntity entity : pageEntity) {
            PersonVO personVO = new PersonVO();
            BeanUtils.copyProperties(entity, personVO);
            listVO.add(personVO);
        }
        
        return listVO;
    }
    
    public long count() {
        return personDao.count(new Specification<PersonEntity>() {
            @Override
            public Predicate toPredicate(Root<PersonEntity> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
                return cb.equal(root.get("dr").as(Integer.class), 0);
            }
        });
    }
    
    public PersonVO findOnePerson(String id){
        PersonVO vo = new PersonVO();
        PersonEntity entity = personDao.findOneById(id);
        BeanUtils.copyProperties(entity, vo);
        return vo;
    }
    
    public void deleteOnePerson(String id) {
        personDao.delete(id);
    }
    
    public PersonVO save(PersonVO vo){
        PersonEntity entity = new PersonEntity();
        BeanUtils.copyProperties(vo, entity);
        personDao.save(entity);
        BeanUtils.copyProperties(entity, vo);
        return vo;
    }

    public void deletePersons(List<String> ids) {
        personDao.deletePersons(ids);
    }
}
View Code

  4.controller類

package com.hjz.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import com.alibaba.fastjson.JSONObject;
import com.hjz.code.ReturnCode;
import com.hjz.page.PagableResponse;
import com.hjz.service.PersonService;
import com.hjz.vo.PersonVO;

@Controller
@RequestMapping(value = "person")
public class PersonController {

    @Autowired
    private PersonService personService;
    
    @RequestMapping(value = "save", method = RequestMethod.POST)
    @ResponseBody
    public JSONObject save(@RequestBody PersonVO personVO){
        JSONObject ret = new JSONObject();
        try {
            personService.save(personVO);
            ret.put("msg", "保存成功!");
            ret.put("code", ReturnCode.SUCCESS);
        } catch (Exception e) {
            e.printStackTrace();
            ret.put("msg", "保存失敗!");
            ret.put("code", ReturnCode.FAILURE);
        }
        
        return ret;
    }
    
    @RequestMapping(value = "del")
    @ResponseBody
    public JSONObject del(@RequestParam(value="id") String id){
        JSONObject ret = new JSONObject();
        try {
            personService.deleteOnePerson(id);
            ret.put("msg", "刪除成功!");
            ret.put("code", ReturnCode.SUCCESS);
        } catch (Exception e) {
            e.printStackTrace();
            ret.put("msg", "刪除失敗!");
            ret.put("code", ReturnCode.FAILURE);
        }
        
        return ret;
    }
    
    @RequestMapping(value = "delBatch", method = RequestMethod.POST)
    @ResponseBody
    public JSONObject delBatch(@RequestParam("ids") List<String> ids){
        JSONObject ret = new JSONObject();
        try {
            personService.deletePersons(ids);
            ret.put("msg", "批量刪除成功!");
            ret.put("code", ReturnCode.SUCCESS);
        } catch (Exception e) {
            e.printStackTrace();
            ret.put("msg", "批量刪除失敗!");
            ret.put("code", ReturnCode.FAILURE);
        }
        
        return ret;
    }
    
    @RequestMapping(value = "page")
    public ModelAndView page(@RequestParam("pageNumber") int pageNumber, @RequestParam("pageSize") int pageSize) {
       PageRequest pageRequest = new PageRequest(pageNumber-1, pageSize);
       PagableResponse<PersonVO> response = new PagableResponse<PersonVO>();
       response.setPageNumber(pageNumber);
       response.setPageSize(pageSize);
       try {
            List<PersonVO> data = personService.findPageablePersons(pageRequest);
            long count = personService.count();
            response.setList(data);
            response.setCount(count);
            response.setCode(ReturnCode.SUCCESS);
            response.setMsg("獲取人員信息成功!");
        } catch(Exception e) {
            e.printStackTrace();
            response.setCode(ReturnCode.FAILURE);
            response.setMsg("獲取人員信息失敗!"); 
        }
       return new ModelAndView("person", "page", response);
    }
}
View Code

六、前端開發

  簡單的使用jquery及其一些插件完成了數據的分頁(jquery.paginate.js),數據的新增,刪除(批量刪除)等操作。具體的頁面代碼請看完整項目。演示效果如下圖所示。

 

  

七、完整項目

   https://github.com/hjzgg/springmvcAndSpringDataJpa


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM