Spring-datatable-Jpa实现增删改查及分页

废话不多说,先上图,如果是你想要的或者能有所学习就可以接着往下看了。
Spring-datatable-Jpa实现增删改查及分页_第1张图片前端使用的是插件datatable,外加了一些bootstroop的样式。完成的功能为对数据库的增删改查,页面的模糊查询和分页。源码呈上

1、创建project

在idea中new project–>maven–>右侧选中maven-archetype-webapp,然后一路next,新建的好的项目目录如下
Spring-datatable-Jpa实现增删改查及分页_第2张图片
成型的项目目录如下
Spring-datatable-Jpa实现增删改查及分页_第3张图片
因此需要在main文件夹下新家java,test,testResources三个文件夹,后两个用于测试,并不必需。新建后在file->Project Structure->Modiles页面将新建的文件夹赋予相应的属性,如将java文件夹mark as Sources,这样才能被spring识别。至此,总体结构上便完整了。

2、资源文件配置

1、pom.xml依赖设置
简单而言就是添加项目所需要的jar包,但是maven大大简化了这个过程,只需要将依赖包名按标准加入,剩下的maven自动搞定,推荐一个查询依赖包的网站,http://mvnrepository.com/,只要记得包名就能找到。在该项目下添加的依赖如下,直接copy放入

<dependencies>
    <dependency>
      <groupId>org.springframeworkgroupId>
      <artifactId>spring-coreartifactId>
      <version>4.1.1.RELEASEversion>
    dependency>
    <dependency>
      <groupId>org.springframeworkgroupId>
      <artifactId>spring-contextartifactId>
      <version>4.1.1.RELEASEversion>
    dependency>
    <dependency>
      <groupId>org.springframeworkgroupId>
      <artifactId>spring-context-supportartifactId>
      <version>4.1.1.RELEASEversion>
    dependency>
    <dependency>
      <groupId>org.springframeworkgroupId>
      <artifactId>spring-ormartifactId>
      <version>4.1.1.RELEASEversion>
    dependency>
    <dependency>
      <groupId>org.springframeworkgroupId>
      <artifactId>spring-aopartifactId>
      <version>4.1.1.RELEASEversion>
    dependency>
    <dependency>
      <groupId>org.springframeworkgroupId>
      <artifactId>spring-webmvcartifactId>
      <version>4.1.1.RELEASEversion>
    dependency>
    <dependency>
      <groupId>org.springframework.datagroupId>
      <artifactId>spring-data-jpaartifactId>
      <version>1.7.0.RELEASEversion>
    dependency>
    <dependency>
      <groupId>mysqlgroupId>
      <artifactId>mysql-connector-javaartifactId>
      <version>5.1.8version>
    dependency>
    <dependency>
      <groupId>org.hibernategroupId>
      <artifactId>hibernate-entitymanagerartifactId>
      <version>4.3.7.Finalversion>
    dependency>
    <dependency>
      <groupId>org.aspectjgroupId>
      <artifactId>aspectjweaverartifactId>
      <version>1.8.3version>
    dependency>
    <dependency>
      <groupId>log4jgroupId>
      <artifactId>log4jartifactId>
      <version>1.2.12version>
    dependency>
    <dependency>
      <groupId>org.slf4jgroupId>
      <artifactId>slf4j-log4j12artifactId>
      <version>1.7.7version>
    dependency>
    <dependency>
      <groupId>org.freemarkergroupId>
      <artifactId>freemarkerartifactId>
      <version>2.3.21version>
    dependency>
    <dependency>
      <groupId>javax.servletgroupId>
      <artifactId>javax.servlet-apiartifactId>
      <version>3.0.1version>
      <scope>providedscope>
    dependency>
    <dependency>
      <groupId>javax.servletgroupId>
      <artifactId>jstlartifactId>
      <version>1.2version>
    dependency>
    <dependency>
      <groupId>org.testnggroupId>
      <artifactId>testngartifactId>
      <version>6.11version>
    dependency>
    <dependency>
      <groupId>com.google.code.gsongroupId>
      <artifactId>gsonartifactId>
      <version>2.8.2version>
    dependency>
    <dependency>
      <groupId>javax.persistencegroupId>
      <artifactId>persistence-apiartifactId>
      <version>1.0.2version>
    dependency>
    <dependency>
      <groupId>com.mchangegroupId>
      <artifactId>c3p0artifactId>
      <version>0.9.5-pre9version>
    dependency>
    <dependency>
      <groupId>com.alibabagroupId>
      <artifactId>fastjsonartifactId>
      <version>1.2.38version>
    dependency>
dependencies>

2、配置文件.xml设置
在文件夹下新建一个application.xml(名称无要求),添加代码如下,注解在代码中


<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"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        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-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/aop  http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
                                            http://www.springframework.org/schema/tx  http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
                                            http://www.springframework.org/schema/mvc  http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
                                            http://www.springframework.org/schema/data/jpa  http://www.springframework.org/schema/data/jpa/spring-jpa-1.8.xsd  ">

        
        <context:component-scan base-package="com.zhang.Demo" />

        
        <bean  id="dataSource"  class="com.mchange.v2.c3p0.ComboPooledDataSource">
                <property  name="driverClass"  value="com.mysql.jdbc.Driver"/>
                <property  name="jdbcUrl"  value="jdbc:mysql:///demo"/>
                <property  name="user"  value="root"/>
                <property  name="password"  value="wangzhang"/>
                
                <property  name="maxPoolSize"  value="1000"/>
                
                <property  name="minPoolSize"  value="800"/>
                
                <property  name="initialPoolSize"  value="500"/>
        bean>

        <bean  id="entityManagerFactory"
               class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
                <property  name="dataSource"  ref="dataSource"  />
                <property  name="jpaVendorAdapter"  ref="hibernateJpaVendorAdapter"  />
                <property  name="packagesToScan"  value="com.zhang.Demo.entity"  />
                <property  name="jpaProperties">
                        <props>
                                <prop  key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategyprop>
                                <prop  key="hibernate.show_sql">trueprop>
                                <prop  key="hibernate.hbm2ddl.auto">updateprop>
                        props>
                property>
        bean>

        <bean  id="hibernateJpaVendorAdapter"
               class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property  name="databasePlatform"  value="org.hibernate.dialect.MySQLDialect"  />
        bean>

        <bean  id="transactionManager"  class="org.springframework.orm.jpa.JpaTransactionManager">
                <property  name="entityManagerFactory"  ref="entityManagerFactory"  />
        bean>

        <jpa:repositories base-package="com.zhang.Demo.repository"
                          entity-manager-factory-ref="entityManagerFactory"
                          transaction-manager-ref="transactionManager">
        jpa:repositories>

        <tx:annotation-driven transaction-manager="transactionManager"
                              proxy-target-class="true" />

        <mvc:default-servlet-handler/>
        <mvc:annotation-driven/>
        <mvc:resources mapping="/static/**" location="/WEB-INF/static/"/>
        <mvc:resources location="/WEB-INF/js/" mapping="/js/**"/>
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
                <property name="prefix" value="/WEB-INF/page/"/>
                <property name="suffix" value=".jsp"/>
        bean>

beans>

3、web.xml配置
在web.xml中加入过滤器与服务器映射



<web-app>
  <display-name>Archetype Created Web Applicationdisplay-name>

  <filter>
    <filter-name>characterEncodingFilterfilter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
    <init-param>
      <param-name>encodingparam-name>
      <param-value>UTF-8param-value>
    init-param>
    <init-param>
      <param-name>forceEncodingparam-name>
      <param-value>trueparam-value>
    init-param>
  filter>
  <filter-mapping>
    <filter-name>characterEncodingFilterfilter-name>
    <url-pattern>/*url-pattern>
  filter-mapping>

  <servlet>
    <servlet-name>Demoservlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
    <init-param>
      <param-name>contextConfigLocationparam-name>   
      <param-value>classpath:application.xmlparam-value>
    init-param>
  servlet>
  <servlet-mapping>
    <servlet-name>Demoservlet-name>
    <url-pattern>/url-pattern>
  servlet-mapping>

web-app>

至此,项目已经完成一小半了,所有的要用到的配置文件都已经配置好了,剩下的只剩下代码的编写了。

3、后台代码的编写

1、如目录结构,在java下新建一个package,在该package下新建4个package以对应springMVC结构,分别为controller控制层,entity实体层,repository持久层(控制数据库),service服务层。
<1>entity层
该层主要定义实体的字段,@Id定义主键,@GeneratedValue设置自增属性,不必须,但一般有,@Table属性为Jpa的自动建表,设置后会在数据库中自动建立一个名为user的表(数据库还是要自己建的),字段上也可以加各种属性,诸如非空,长度等。

@Entity
@Table(name = "user")
public class User {
    @Id
    @GeneratedValue
    private Integer id;

    private String name;

    private String job;

    private String phone;
    //以下加字段的set 与get方法,alt+insert键弹出快捷窗
}

<2>controller层
加@Controller以注明其为控制层,@RequestMapping注解表示其访问路径。该层主要负责控制,将前端来的访问请求转发到对应的处理service层。第一步,注入service层

    private MyService myService;
    @Autowired
    public void setMyService(MyService myService) {
        this.myService = myService;
    }

这样就可以直接调用seivice层接口,将处理过程交给service层,大幅缩减controller层代码,逻辑更加简明。自动注入之后编写的增删改查代码如下

    @RequestMapping(value="/addOne",method= RequestMethod.GET)
    @ResponseBody
    public User inSave(@ModelAttribute User user)
    {
        myService.save(user);
        return user;
    }

    @RequestMapping(value="/findOne",method= RequestMethod.GET)
    @ResponseBody
    public JSONObject findOne(int id)
    {
        User user = myService.findOne(id);
        JSONObject json = new JSONObject();
        json.put("data",user);
        return json;
    }

    @RequestMapping(value="/deleteById",method= RequestMethod.GET)
    @ResponseBody
    public void deleteById(int id)
    {
        myService.delete(id);
        return ;
    }

    @RequestMapping(value="/modifyOne",method= RequestMethod.GET)
    @ResponseBody
    //WebRequest request, ModelMap model,@RequestBody User user
    public JSONObject modifyOne(@ModelAttribute User user){

        User user1=myService.saveAndFlush(user);
        JSONObject json = new JSONObject();
        json.put("data",user1);
        return json;
    }

看起来是不是很简洁,因为它把所有的业务处理都交给service层了,由于Jpa的相当给力,你会发现service层也相当简洁,如果你没有自定义的一些方法。如果不结合datatable插件,那么查询所有的信息的代码也是很简洁的

    @RequestMapping(value="/findAll",method= RequestMethod.GET)
    @ResponseBody
    public JSONObject findAll()
    {
        List userList = myService.findAll();
        JSONObject json = new JSONObject();
        json.put("data",userList);

        return json;
    }

补充一点,如果不加@ResponseBody注解,那么上图返回的内容为“json.jsp”或者其他网页格式,而不是json格式的字段。
<3>service层
在该层下,一般建立一个service接口与一个serviceImpl实现类,以符合分层思想与层之间以接口链接。

    public interface MyService {

    User save(User user);

    List findAll();

    User findById(int id);

    List findByName(String name);

    User findOne(int id);

    void delete(int id);

    User saveAndFlush(User user);
}

接口的实现类

@Service
@Transactional    //事务标记
public class MyServiceImpl implements MyService{

    private MyRepository myRepository;

    @Autowired
    public void setMyRepository(MyRepository myRepository) {
        this.myRepository = myRepository;
    }

    public User save(User user)
    {
        myRepository.save(user);
        return user;
    }

    public List findAll() {
        List all = myRepository.findAll();
        return all;
    }

    public User findById(int id) {
        User user = myRepository.findById(id);
        return user;
    }

    public List findByName(String name) {
        List names = myRepository.findByName(name);
        return names;
    }

    public User findOne(int id) {
        User user=myRepository.findOne(id);
        return user;
    }

    public void delete(int id) {
        myRepository.delete(id);
    }

    public User saveAndFlush(User user) {
        User user1=myRepository.saveAndFlush(user);
        return user1;
    }

<4>reposiory层
也被称为Dao层,主要负责对数据库的操纵,当继承了JpaRepository后,便含有findAll,save,delete等各种自带方法,如果没有也可以使用findByxxx复写方法,程序会自动进行识别查找相应的列,当然也可以加@Query注解完全自写数据库语句。

import com.zhang.Demo.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface MyRepository extends JpaRepository<User,Integer>{
    User findById(int id);
    List findByName(String name);
}

至此,后台的业务逻辑处理就基本完成了,源码中还有其他的一些代码,那个是处理前台传输过来的dataTable封装好的json格式数据的,想看完整的功能还是建议参照源码一起看。注:每层的类都需要注明属性,诸如实体层@Entity。

4、与datatable相关的部分前端与后台处理

<1>前端datatable的固定定义代码

    
                    
                    

你可能感兴趣的:(spring,Jpa)