zoukankan      html  css  js  c++  java
  • SpringDataJpa项目中的使用

    1. Jpa的使用

    1.1 pom.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <project xmlns="http://maven.apache.org/POM/4.0.0"
     3          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     5     <modelVersion>4.0.0</modelVersion>
     6 
     7     <groupId>com.springdataJpa</groupId>
     8     <artifactId>springdataJpa</artifactId>
     9     <packaging>pom</packaging>
    10     <version>1.0-SNAPSHOT</version>
    11     <modules>
    12         <module>jdbcTemplate</module>
    13         <module>jpa</module>
    14     </modules>
    15 
    16     <!-- Spring boot 父引用-->
    17     <parent>
    18         <groupId>org.springframework.boot</groupId>
    19         <artifactId>spring-boot-starter-parent</artifactId>
    20         <version>1.4.1.RELEASE</version>
    21     </parent>
    22 
    23     <dependencies>
    24         <!-- Spring boot 核心web-->
    25         <dependency>
    26             <groupId>org.springframework.boot</groupId>
    27             <artifactId>spring-boot-starter-web</artifactId>
    28         </dependency>
    29         <dependency>
    30             <groupId>org.springframework.boot</groupId>
    31             <artifactId>spring-boot-starter-data-jpa</artifactId>
    32         </dependency>
    33         <dependency>
    34             <groupId>org.projectlombok</groupId>
    35             <artifactId>lombok</artifactId>
    36             <version>1.16.18</version>
    37         </dependency>
    38         <dependency>
    39             <groupId>com.alibaba</groupId>
    40             <artifactId>fastjson</artifactId>
    41             <version>1.2.29</version>
    42         </dependency>
    43         <dependency>
    44             <groupId>org.springframework.boot</groupId>
    45             <artifactId>spring-boot-starter-logging</artifactId>
    46         </dependency>
    47         <dependency>
    48             <groupId>org.springframework.boot</groupId>
    49             <artifactId>spring-boot-starter-test</artifactId>
    50         </dependency>
    51         <dependency>
    52             <groupId>com.oracle</groupId>
    53             <artifactId>ojdbc14</artifactId>
    54             <version>10.2.0.4.0</version>
    55         </dependency>
    56         <!--<dependency>
    57             <groupId>mysql</groupId>
    58             <artifactId>mysql-connector-java</artifactId>
    59         </dependency>-->
    60     </dependencies>
    61 
    62     <build>
    63         <plugins>
    64             <plugin>
    65                 <groupId>org.springframework.boot</groupId>
    66                 <artifactId>spring-boot-maven-plugin</artifactId>
    67                 <executions>
    68                     <execution>
    69                         <goals>
    70                             <goal>repackage</goal>
    71                         </goals>
    72                     </execution>
    73                 </executions>
    74                 <configuration>
    75                     <executable>true</executable>
    76                 </configuration>
    77             </plugin>
    78         </plugins>
    79     </build>
    80 </project>

    1.2 application.properties

     1 server.port=8089
     2 server.servlet-path=/
     3 spring.resources.static-locations=classpath:/static/,classpath:/templates/
     4 spring.mvc.view.suffix=.html
     5 
     6 #配置数据源
     7 #mysql
     8 #spring.datasource.driver-class-name=com.mysql.jdbc.Driver
     9 #spring.datasource.url=jdbc:mysql://localhost:3306/jpa
    10 #spring.datasource.username=root
    11 #spring.datasource.password=root
    12 
    13 #oracle
    14 spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
    15 spring.datasource.url=jdbc:oracle:thin:@localhost:1521:orcl
    16 spring.datasource.username=scott
    17 spring.datasource.password=scott
    18 
    19 spring.jpa.hibernate.ddl-auto=update
    20 
    21 spring.jpa.properties.hibernate.hbm2ddl.auto=update
    22 spring.jpa.show-sql=true
    23 ##懒加载默认就为true
    24 spring.jpa.open-in-view=true
    25 
    26 #在控制台输出彩色日志
    27 spring.output.ansi.enabled=always

    1.3 model

      1.3.1 BaseDomain.class

     1 package com.springdatajpa.model.base;
     2 
     3 import com.alibaba.fastjson.annotation.JSONField;
     4 
     5 import javax.persistence.Column;
     6 import javax.persistence.MappedSuperclass;
     7 import javax.persistence.PrePersist;
     8 import javax.persistence.PreUpdate;
     9 import java.io.Serializable;
    10 import java.util.Date;
    11 
    12 /**
    13 * @date 2018/7/30
    14 */
    15 @MappedSuperclass
    16 abstract public class BaseDomain implements Serializable {
    17 
    18     /**
    19      * 创建日期
    20      */
    21     @Column(name = "date_created")
    22     @JSONField(format = "yyyy-MM-dd HH:mm:ss")
    23     private Date dateCreated;
    24 
    25     /**
    26      * 最后更新日期
    27      */
    28     @Column(name = "last_updated")
    29     @JSONField(format = "yyyy-MM-dd HH:mm:ss")
    30     private Date lastUpdated;
    31 
    32     @Column(name = "version")
    33     private Integer version;
    34 
    35     @Column(name = "is_delete")
    36     private Boolean isDelete = false;
    37 
    38     @JSONField(format = "yyyy-MM-dd HH:mm:ss")
    39     private Date deleteDate;
    40 
    41     public Date getDateCreated() {
    42         return dateCreated;
    43     }
    44 
    45     public void setDateCreated(Date dateCreated) {
    46         this.dateCreated = dateCreated;
    47     }
    48 
    49     public Date getLastUpdated() {
    50         return lastUpdated;
    51     }
    52 
    53     public void setLastUpdated(Date lastUpdated) {
    54         this.lastUpdated = lastUpdated;
    55     }
    56 
    57     public Integer getVersion() {
    58         return version;
    59     }
    60 
    61     public void setVersion(Integer version) {
    62         this.version = version;
    63     }
    64 
    65     public Boolean getIsDelete() {
    66         return isDelete;
    67     }
    68 
    69     public void setIsDelete(Boolean isDelete) {
    70         if (isDelete != null && isDelete) {
    71             this.deleteDate = new Date();
    72         }
    73         this.isDelete = isDelete;
    74     }
    75 
    76     @PrePersist
    77     protected void prePersist() {
    78         dateCreated = new Date();
    79         version = 1;
    80     }
    81 
    82 
    83     @PreUpdate
    84     private void preUpdate() {
    85         lastUpdated = new Date();
    86         if (version == null) {
    87             version = 1;
    88         } else {
    89             version++;
    90         }
    91     }
    92 }

    1.3.2 Student.class

     1 package com.springdatajpa.model;
     2 
     3 import com.springdatajpa.model.base.BaseDomain;
     4 import lombok.Data;
     5 import org.hibernate.annotations.GenericGenerator;
     6 
     7 import javax.persistence.*;
     8 import java.io.Serializable;
     9 import java.util.List;
    10 
    11 /**
    12  * @date 2018/7/30
    13  */
    14 @Entity
    15 @Data
    16 public class Student extends BaseDomain implements Serializable {
    17     /**
    18      * 主键.
    19      */
    20     @Id
    21     @GenericGenerator(name = "PKUUID", strategy = "uuid2")
    22     @GeneratedValue(generator = "PKUUID")
    23     private String id;
    24     /**
    25      * 姓名.
    26      */
    27     private String name;
    28     /**
    29      * 编号.
    30      */
    31     private String studentNo;
    32     /**
    33      * 年龄
    34      */
    35     private Integer age;
    36 
    37     /**
    38      * 地址列表
    39      */
    40     @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "student")
    41     private List<Address> addresses;
    42 
    43 }

    1.3.3 Address.class

     1 package com.springdatajpa.model;
     2 
     3 import com.springdatajpa.model.base.BaseDomain;
     4 import lombok.Data;
     5 import org.hibernate.annotations.GenericGenerator;
     6 
     7 import javax.persistence.*;
     8 import java.io.Serializable;
     9 
    10 /**
    11  * @author12  * @date 2018/7/30
    13  */
    14 @Entity
    15 @Data
    16 public class Address extends BaseDomain implements Serializable {
    17     /**
    18      * 主键.
    19      */
    20     @Id
    21     @GenericGenerator(name = "PKUUID", strategy = "uuid2")
    22     @GeneratedValue(generator = "PKUUID")
    23     private String id;
    24     /**
    25      * 地址
    26      */
    27     private String addressDetail;
    28     /**
    29      * 学生id.
    30      */
    31     @ManyToOne
    32     @JoinColumn(name = "STUDENT_ID", foreignKey = @ForeignKey(name = "FK_STUDENT_ADDRESS"))
    33     private Student student;
    34 
    35 }

    1.4 repository

    1.4.1 StudentRepo.class

     1 package com.springdatajpa.repository;
     2 
     3 import com.springdatajpa.model.Student;
     4 import org.springframework.data.jpa.repository.JpaRepository;
     5 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
     6 import org.springframework.data.repository.CrudRepository;
     7 
     8 /**
     9  * @author10  * @date 2018/7/30
    11  */
    12 public interface StudentRepo extends JpaRepository<Student,String>,JpaSpecificationExecutor<Student> {
    13 
    14     Student findById(String id);
    15 }

    1.4.2 AddressRepo.class

     1 package com.springdatajpa.repository;
     2 
     3 import com.springdatajpa.model.Address;
     4 import org.springframework.data.jpa.repository.JpaRepository;
     5 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
     6 
     7 /**
     8  * @author 9  * @date 2018/7/30
    10  */
    11 public interface AddressRepo extends JpaRepository<Address,String>,JpaSpecificationExecutor<Address> {
    12     Address findById(String id);
    13 }

    1.5 specification

    1.5.1 StudentSpecification.class

     1 package com.springdatajpa.specification;
     2 
     3 import com.springdatajpa.dto.StudentQuery;
     4 import org.springframework.data.jpa.domain.Specification;
     5 import org.springframework.util.StringUtils;
     6 
     7 import javax.persistence.criteria.CriteriaBuilder;
     8 import javax.persistence.criteria.CriteriaQuery;
     9 import javax.persistence.criteria.Predicate;
    10 import javax.persistence.criteria.Root;
    11 import java.util.ArrayList;
    12 import java.util.List;
    13 
    14 /**
    15  * @author16  * @date 2018/7/30
    17  */
    18 public class StudentSpecification<T> implements Specification<T> {
    19     private StudentQuery studentQuery;
    20 
    21     public StudentSpecification() {
    22     }
    23 
    24     public StudentSpecification(StudentQuery studentQuery) {
    25         this.studentQuery = studentQuery;
    26     }
    27 
    28     @Override
    29     public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
    30         List<Predicate> predicates = new ArrayList<>();
    31         predicates.add(cb.equal(root.get("isDelete"), false));
    32         if (!StringUtils.isEmpty(studentQuery.getName()) && !studentQuery.getName().isEmpty()) {
    33             predicates.add(cb.equal(root.get("name"), studentQuery.getName()));
    34         }
    35         if (!StringUtils.isEmpty(studentQuery.getAge()) && !studentQuery.getAge().isEmpty()) {
    36             predicates.add(cb.equal(root.get("age"), studentQuery.getAge()));
    37         }
    38         if (!StringUtils.isEmpty(studentQuery.getStudentNo()) && !studentQuery.getStudentNo().isEmpty()) {
    39             predicates.add(cb.equal(root.get("studentNo"), studentQuery.getStudentNo()));
    40         }
    41         if (studentQuery.getStartTime() != null) {
    42             predicates.add(cb.greaterThanOrEqualTo(root.get("dateCreated"), studentQuery.getStartTime()));
    43         }
    44         if (studentQuery.getEndTime() != null) {
    45             predicates.add(cb.lessThanOrEqualTo(root.get("dateCreated"), studentQuery.getEndTime()));
    46         }
    47         return query.where(predicates.toArray(new Predicate[predicates.size()])).getRestriction();
    48     }
    49 }

    1.5.2 AddressSpecification.class

    package com.springdatajpa.specification;
    
    import com.springdatajpa.dto.AddressQuery;
    import com.springdatajpa.dto.StudentQuery;
    import org.springframework.data.jpa.domain.Specification;
    import org.springframework.util.StringUtils;
    
    import javax.persistence.criteria.CriteriaBuilder;
    import javax.persistence.criteria.CriteriaQuery;
    import javax.persistence.criteria.Predicate;
    import javax.persistence.criteria.Root;
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * @author luoxianwei
     * @date 2018/7/30
     */
    public class AddressSpecification<T> implements Specification<T> {
        private AddressQuery addressQuery;
    
        public AddressSpecification() {
        }
    
        public AddressSpecification(AddressQuery addressQuery) {
            this.addressQuery = addressQuery;
        }
    
        @Override
        public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
            List<Predicate> predicates = new ArrayList<>();
            predicates.add(cb.equal(root.get("isDelete"), false));
            if (!StringUtils.isEmpty(addressQuery.getAddressDetail()) && !addressQuery.getAddressDetail().isEmpty()) {
                predicates.add(cb.equal(root.get("addressDetail"), addressQuery.getAddressDetail()));
            }
            if (!StringUtils.isEmpty(addressQuery.getStudentNo()) && !addressQuery.getStudentNo().isEmpty()) {
                predicates.add(cb.equal(root.get("student").get("studentNo"), addressQuery.getStudentNo()));
            }
            if (!StringUtils.isEmpty(addressQuery.getName()) && !addressQuery.getName().isEmpty()) {
                predicates.add(cb.equal(root.get("student").get("name"), addressQuery.getName()));
            }
            if (addressQuery.getStartTime() != null) {
                predicates.add(cb.greaterThanOrEqualTo(root.get("dateCreated"), addressQuery.getStartTime()));
            }
            if (addressQuery.getEndTime() != null) {
                predicates.add(cb.lessThanOrEqualTo(root.get("dateCreated"), addressQuery.getEndTime()));
            }
            return query.where(predicates.toArray(new Predicate[predicates.size()])).getRestriction();
        }
    }

    1.6 dto

    1.6.1 StudentQuery.class

    package com.springdatajpa.dto;
    
    import com.alibaba.fastjson.annotation.JSONField;
    import lombok.Data;
    
    import java.util.Date;
    
    /**
     * @author luoxianwei
     * @date 2018/7/30
     */
    @Data
    public class StudentQuery {
        /**
         * 姓名.
         */
        private String name;
        /**
         * 编号.
         */
        private String studentNo;
        /**
         * 年龄
         */
        private String age;
    
        @JSONField(format = "yyyy-MM-dd HH:mm:ss")
        private Date startTime;
    
        @JSONField(format = "yyyy-MM-dd HH:mm:ss")
        private Date EndTime;
    
    }

    1.6.2 AddressQuery.class

    package com.springdatajpa.dto;
    
    import com.alibaba.fastjson.annotation.JSONField;
    import lombok.Data;
    
    import java.util.Date;
    
    /**
     * @author luoxianwei
     * @date 2018/7/30
     */
    @Data
    public class AddressQuery {
        /**
         * 地址
         */
        private String addressDetail;
    
        /**
         * 姓名.
         */
        private String name;
        /**
         * 编号.
         */
        private String studentNo;
    
        @JSONField(format = "yyyy-MM-dd HH:mm:ss")
        private Date startTime;
    
        @JSONField(format = "yyyy-MM-dd HH:mm:ss")
        private Date EndTime;
    
    }

    1.7 service

    1.7.1 StudentService.class

    package com.springdatajpa.service;
    
    import com.springdatajpa.dto.StudentQuery;
    import com.springdatajpa.model.Student;
    import com.springdatajpa.repository.StudentRepo;
    import com.springdatajpa.specification.StudentSpecification;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.domain.Page;
    import org.springframework.data.domain.Pageable;
    import org.springframework.stereotype.Service;
    
    import java.util.List;
    
    /**
     * @author luoxianwei
     * @date 2018/7/30
     */
    @Service
    public class StudentService {
    
        @Autowired
        StudentRepo studentRepo;
    
        public Student add(Student student) {
            return studentRepo.save(student);
        }
    
        public Student update(Student student) {
            Student student1 = studentRepo.findById(student.getId());
            student1.setName(student.getName());
            return studentRepo.save(student1);
        }
    
        public void delete(Student student) {
            studentRepo.delete(student.getId());
        }
    
        public List<Student> adds(List<Student> students) {
            return studentRepo.save(students);
        }
        public Student findStudent(Student student) {
            return studentRepo.findById(student.getId());
        }
    
        public List<Student> findStudentList() {
            return studentRepo.findAll();
        }
    
        public Page<Student> findByPage(Pageable pageable) {
            return studentRepo.findAll(pageable);
        }
    
        public Page<Student> findPageByQuery(StudentQuery studentQuery,Pageable pageable) {
            StudentSpecification studentSpecification = new StudentSpecification(studentQuery);
            return studentRepo.findAll(studentSpecification,pageable);
        }
    }

    1.7.2 AddressService.class

    package com.springdatajpa.service;
    
    import com.springdatajpa.dto.AddressQuery;
    import com.springdatajpa.dto.StudentQuery;
    import com.springdatajpa.model.Address;
    import com.springdatajpa.model.Student;
    import com.springdatajpa.repository.AddressRepo;
    import com.springdatajpa.repository.StudentRepo;
    import com.springdatajpa.specification.AddressSpecification;
    import com.springdatajpa.specification.StudentSpecification;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.domain.Page;
    import org.springframework.data.domain.Pageable;
    import org.springframework.stereotype.Service;
    
    import java.util.List;
    
    /**
     * @author luoxianwei
     * @date 2018/7/30
     */
    @Service
    public class AddressService {
    
        @Autowired
        AddressRepo addressRepo;
    
        public Address add(Address address) {
            return addressRepo.save(address);
        }
    
        public Address update(Address address) {
            Address address1 = addressRepo.findById(address.getId());
            address1.setAddressDetail(address.getAddressDetail());
            return addressRepo.save(address1);
        }
    
        public void delete(Address address) {
            addressRepo.delete(address.getId());
        }
    
        public Address findAddress(Address address) {
            return addressRepo.findById(address.getId());
        }
    
        public List<Address> findAddressList() {
            return addressRepo.findAll();
        }
    
        public Page<Address> findByPage(Pageable pageable) {
            return addressRepo.findAll(pageable);
        }
    
        public Page<Address> findPageByQuery(AddressQuery addressQuery, Pageable pageable) {
            AddressSpecification addressSpecification = new AddressSpecification(addressQuery);
            return addressRepo.findAll(addressSpecification,pageable);
        }
    }

    1.8 test

    1.8.1 StudentServiceTest.class

    package com.springdatajpa.test;
    
    import com.springdatajpa.JpaApplication;
    import com.springdatajpa.dto.StudentQuery;
    import com.springdatajpa.model.Address;
    import com.springdatajpa.model.Student;
    import com.springdatajpa.service.StudentService;
    import javafx.scene.control.Pagination;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.data.domain.Page;
    import org.springframework.data.domain.PageRequest;
    import org.springframework.data.domain.Pageable;
    import org.springframework.test.context.junit4.SpringRunner;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.UUID;
    
    /**
     * @author luoxianwei
     * @date 2018/6/26
     */
    @SpringBootTest(classes = JpaApplication.class)
    @RunWith(SpringRunner.class)
    public class StudentServiceTest {
    
        @Autowired
        StudentService studentService;
    
        @Test
        public void addStudent() {
            Student student = new Student();
            student.setName("张三");
            student.setAge(20);
            student.setStudentNo("001");
            List<Address> addressList = new ArrayList<>();
            Address address1 = new Address();
            address1.setAddressDetail("上海");
            address1.setStudent(student);
            Address address2 = new Address();
            address2.setAddressDetail("北京");
            address2.setStudent(student);
            addressList.add(address1);
            addressList.add(address2);
            student.setAddresses(addressList);
            Student student1 = studentService.add(student);
            System.out.println("成功插入:" + student1.getStudentNo());
        }
    
        @Test
        public void updateStudent() {
            Student student = new Student();
            student.setId("43a24b05-fe69-4bb8-8fc3-69fea4ae82cd");
            student.setName("李四");
            Student student1 = studentService.update(student);
            System.out.println("成功修改:" + student1.getName());
        }
    
        @Test
        public void deleteStudent() {
            Student student = new Student();
            student.setId("43a24b05-fe69-4bb8-8fc3-69fea4ae82cd");
            studentService.delete(student);
            System.out.println("成功删除:");
        }
    
        @Test
        public void addStudents() {
            List<Student> students = new ArrayList<>();
            for (int i = 0; i < 1000; i++) {
                Student student = new Student();
                student.setName("张三");
                student.setAge(20);
                student.setStudentNo(String.valueOf(i));
                List<Address> addressList = new ArrayList<>();
                Address address1 = new Address();
                address1.setAddressDetail("上海");
                address1.setStudent(student);
                Address address2 = new Address();
                address2.setAddressDetail("北京");
                address2.setStudent(student);
                addressList.add(address1);
                addressList.add(address2);
                student.setAddresses(addressList);
                students.add(student);
            }
            List<Student> adds = studentService.adds(students);
            System.out.println("批量添加:" + adds.size());
        }
    
        @Test
        public void findStudent() {
            Student student = new Student();
            student.setId("0010161b-651e-417d-90be-ec9b03d8ece6");
            Student student1 = studentService.findStudent(student);
            System.out.println(student1.getName());
        }
    
        @Test
        public void findStudentList() {
            List<Student> studentList = studentService.findStudentList();
            System.out.println("查询:" + studentList.size());
        }
    
        @Test
        public void findByPage() {
            Pageable pageable = new PageRequest(0, 10);
            Page<Student> page = studentService.findByPage(pageable);
            System.out.println("查询:" + page.getContent().size());
        }
    
        @Test
        public void findPageByQuery() {
            StudentQuery studentQuery = new StudentQuery();
            studentQuery.setStudentNo("8");
            Pageable pageable = new PageRequest(0, 10);
            Page<Student> page = studentService.findPageByQuery(studentQuery,pageable);
            System.out.println("查询:" + page.getContent().size());
        }
    }

    1.8.2 AddressServiceTest.class

    package com.springdatajpa.test;
    
    import com.springdatajpa.JpaApplication;
    import com.springdatajpa.dto.AddressQuery;
    import com.springdatajpa.dto.StudentQuery;
    import com.springdatajpa.model.Address;
    import com.springdatajpa.model.Student;
    import com.springdatajpa.service.AddressService;
    import com.springdatajpa.service.StudentService;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.data.domain.Page;
    import org.springframework.data.domain.PageRequest;
    import org.springframework.data.domain.Pageable;
    import org.springframework.test.context.junit4.SpringRunner;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * @author luoxianwei
     * @date 2018/6/26
     */
    @SpringBootTest(classes = JpaApplication.class)
    @RunWith(SpringRunner.class)
    public class AddressServiceTest {
    
        @Autowired
        AddressService addressService;
    
        @Test
        public void findAddress() {
            Address address = new Address();
            address.setId("0024092e-771b-4f78-97ae-f810049a10b0");
            Address address1 = addressService.findAddress(address);
            System.out.println(address1.getStudent().getStudentNo());
        }
    
        @Test
        public void findAddressList() {
            List<Address> addressList = addressService.findAddressList();
            System.out.println("查询:" + addressList.size());
        }
    
    
        @Test
        public void findByPage() {
            Pageable pageable = new PageRequest(0, 10);
            Page<Address> page = addressService.findByPage(pageable);
            System.out.println("查询:" + page.getContent().size());
        }
    
        @Test
        public void findPageByQuery() {
            AddressQuery addressQuery = new AddressQuery();
            addressQuery.setStudentNo("8");
            Pageable pageable = new PageRequest(0, 10);
            Page<Address> page = addressService.findPageByQuery(addressQuery,pageable);
            System.out.println("查询:" + page.getContent().size());
        }
    }

    2.  jdbcTemplate

    2.1 oracleDatabase

    2.1.1 pom.xml

     <dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ojdbc14</artifactId>
        <version>10.2.0.4.0</version>
     </dependency>

    2.1.2 application.properties

    server.port=8090
    server.servlet-path=/
    spring.resources.static-locations=classpath:/static/,classpath:/templates/
    spring.mvc.view.suffix=.html
    
    #配置数据源
    spring.datasource.driver-class-name:oracle.jdbc.driver.OracleDriver
    spring.datasource.url: jdbc:oracle:thin:@localhost:1521:orcl
    spring.datasource.username:scott
    spring.datasource.password:scott
    
    spring.jpa.hibernate.ddl-auto=update
    spring.jpa.show-sql=true
    
    #在控制台输出彩色日志
    spring.output.ansi.enabled=always

    2.1.3 model

    2.1.3.1 BaseDomain.class

    package com.springdataJpa.oracle.model.base;
    
    import com.alibaba.fastjson.annotation.JSONField;
    import lombok.Data;
    
    import javax.persistence.Column;
    import javax.persistence.MappedSuperclass;
    import javax.persistence.PrePersist;
    import javax.persistence.PreUpdate;
    import java.io.Serializable;
    import java.util.Date;
    
    /**
    * @date 2018/7/30
    */
    @MappedSuperclass
    @Data
    abstract public class BaseDomain implements Serializable {
    
        /**
         * 创建日期
         */
        private Date dateCreated = new Date();
    
        /**
         * 最后更新日期
         */
        private Date lastUpdated;
    
        /**
         * 删除日期
         */
        private Date deleteDate;
        /**
         * 删除标记
         */
        private Boolean isDelete = false;
    
    }

    2.1.3.1 Users.class

    package com.springdataJpa.oracle.model;
    
    import com.springdataJpa.oracle.model.base.BaseDomain;
    import lombok.Data;
    import org.hibernate.annotations.GenericGenerator;
    
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import java.io.Serializable;
    
    /**
     * @author luoxianwei
     * @date 2018/5/11
     */
    @Entity
    @Data
    public class Users extends BaseDomain implements Serializable {
    
        @Id
        @GenericGenerator(name = "PKUUID", strategy = "uuid2")
        @GeneratedValue(generator = "PKUUID")
        private String id;
    
        /**
         * 姓名
         */
        private String userName;
    
        /**
         * 年龄
         */
        private Integer age;
    
        /**
         * 性别
         */
        private String sex;
    
        /**
         * 用户状态:1.在线;2.隐身;3.离线;4.忙碌
         */
        private String status;
    
    }

    2.1.4 dto

    2.1.4.1 UsersQuery.class

    package com.springdataJpa.oracle.dto;
    
    import lombok.Data;
    
    @Data
    public class UsersQuery {
        private String id;
    
        private String userName;
    
        private Integer age;
    
        private String sex;
    
        private String status;
    }

    2.1.5 vo

    2.1.5.1 PageVo.class

    package com.springdataJpa.oracle.vo;
    
    import lombok.Data;
    
    import java.io.Serializable;
    import java.util.List;
    
    @Data
    public class PageVo<T> implements Serializable {
        //分页查询结果
        List<T> Result;
        //页总数
        Integer pageNum;
        //一页记录数
        Integer pageSize;
        //总记录数
        Integer totalCount;
        //当前页
        Integer currentPage;
    
    
        public PageVo() {
    
        }
    
        public PageVo(Integer pageNum, Integer pageSize) {
            this.pageNum = pageNum;
            this.pageSize = pageSize;
        }
    
    }

    2.1.6 util

    2.1.6.1 Lang.class

    package com.springdataJpa.oracle.util;
    
    
    import lombok.extern.slf4j.Slf4j;
    
    import java.beans.BeanInfo;
    import java.beans.IntrospectionException;
    import java.beans.Introspector;
    import java.beans.PropertyDescriptor;
    import java.io.PrintWriter;
    import java.io.StringWriter;
    import java.lang.reflect.Array;
    import java.lang.reflect.InvocationTargetException;
    import java.math.BigDecimal;
    import java.text.DecimalFormat;
    import java.text.SimpleDateFormat;
    import java.util.*;
    
    /**
     * Java通用工具类
     */
    @Slf4j
    public class Lang {
    
        private static final String DATE_FORMAT_YYYYMMDDHHMMSS_SSS = "yyyyMMddHHmmssSSS";
    
        private Lang() {
        }
    
        /**
         * 空对象
         */
        public final static Object EMPTY = new Object();
        /**
         * 空数组
         */
        public final static Object[] EMPTY_ARRAY = new Object[]{};
    
        /**
         * 获取对象系统引用哈希值(不为负数)
         *
         * @param x
         * @return
         */
        public static long identityHashCode(Object x) {
            return (long) System.identityHashCode(x) + (long) Integer.MAX_VALUE;
        }
    
        /**
         * 将CheckedException转换为RuntimeException.
         */
        public static RuntimeException unchecked(Throwable e) {
            if (e instanceof RuntimeException) {
                return (RuntimeException) e;
            } else {
                return new RuntimeException(e);
            }
        }
    
        /**
         * 将CheckedException转换为RuntimeException.
         */
        public static RuntimeException unchecked(Throwable e, String message,
                                                 Object... args) {
            return new RuntimeException(String.format(message, args), e);
        }
    
        /**
         * 判断一个对象是否是空对象
         *
         * @param obj
         * @return
         */
        @SuppressWarnings("rawtypes")
        public static boolean isEmpty(Object obj) {
            if (obj == null) {
                return true;
            }
            if (obj instanceof CharSequence) {
                return obj.toString().trim().length() == 0;
            }
            if (obj.getClass().equals(Object.class)) {
                return true;
            }
            if (isBaseType(obj.getClass())) {
                return false;
            }
            if (obj instanceof Map) {
                return ((Map) obj).isEmpty();
            }
            if (obj instanceof Collection) {
                return ((Collection) obj).isEmpty();
            }
            if (obj.getClass().isArray()) {
                return Array.getLength(obj) == 0;
            }
            return Object.class.equals(obj.getClass());
        }
    
        /**
         * 判断一个类型是否是基本类型
         *
         * @param type
         * @return
         */
        public static boolean isBaseType(Class<?> type) {
            if (type.isPrimitive()) {
                return true;
            }
            if (CharSequence.class.isAssignableFrom(type)) {
                return true;
            }
            if (Number.class.isAssignableFrom(type)) {
                return true;
            }
            if (Date.class.isAssignableFrom(type)) {
                return true;
            }
            if (Boolean.class.equals(type)) {
                return true;
            }
            if (Character.class.equals(type)) {
                return true;
            }
            if (Class.class.equals(type)) {
                return true;
            }
            if (StringBuilder.class.equals(type)) {
                return true;
            }
            if (StringBuffer.class.equals(type)) {
                return true;
            }
            if (Object.class.equals(type)) {
                return true;
            }
            if (Void.class.equals(type)) {
                return true;
            }
            return false;
        }
    
        /**
         * 判断是否是数字类型
         *
         * @param type
         * @return
         */
        public static boolean isNumber(Class<?> type) {
            if (Number.class.isAssignableFrom(type)) {
                return true;
            }
            if (type.equals(int.class)) {
                return true;
            }
            if (type.equals(short.class)) {
                return true;
            }
            if (type.equals(long.class)) {
                return true;
            }
            if (type.equals(float.class)) {
                return true;
            }
            if (type.equals(double.class)) {
                return true;
            }
            if (type.equals(byte.class)) {
                return true;
            }
            return false;
        }
    
        /**
         * 获得本源异常信息
         *
         * @param e
         * @return
         */
        public static Throwable getCause(Throwable e) {
            return e.getCause() == null ? e : getCause(e.getCause());
        }
    
        /**
         * 输出对象字符串格式
         *
         * @param obj
         * @return
         */
        public static String toString(Object obj) {
            return toString(obj, null);
        }
    
        /**
         * 输出对象字符串格式
         *
         * @param obj
         * @return
         */
        public static String toString(Object obj, String format) {
            if (obj == null) {
                return "null";
            }
            if (obj instanceof Throwable) {
                Throwable throwable = (Throwable) obj;
                StringWriter sw = new StringWriter();
                PrintWriter pw = new PrintWriter(sw);
                throwable.printStackTrace(pw);
                pw.flush();
                pw.close();
                sw.flush();
                return sw.toString();
            }
            if (obj instanceof Date) {
                return new SimpleDateFormat(
                        format == null || format.trim().length() == 0 ? DATE_FORMAT_YYYYMMDDHHMMSS_SSS
                                : format).format((Date) obj);
            }
            if (isNumber(obj.getClass())) {
                if (format != null && format.trim().length() != 0) {
                    return new DecimalFormat(format).format(obj);
                }
            }
            return String.valueOf(obj);
        }
    
        /**
         * 新建一个Set
         *
         * @param args
         * @return
         */
        @SuppressWarnings("unchecked")
        public static <T> Set<T> newSet(T... args) {
            int length = args == null ? 1 : args.length;
            Set<T> set = new HashSet<T>(length);
            if (args == null) {
                set.add(null);
            } else {
                for (int i = 0; i < args.length; i++) {
                    set.add(args[i]);
                }
            }
            return set;
        }
    
        /**
         * 新建一个List
         *
         * @param args
         * @return
         */
        @SuppressWarnings("unchecked")
        public static <T> List<T> newList(T... args) {
            int length = args == null ? 1 : args.length;
            List<T> list = new ArrayList<T>(length);
            if (args == null) {
                list.add(null);
            } else {
                for (int i = 0; i < args.length; i++) {
                    list.add(args[i]);
                }
            }
            return list;
        }
    
        /**
         * 抛出一个带消息的异常
         *
         * @param type
         * @param message
         * @param args
         * @return
         */
        public static <T extends Throwable> T newThrowable(Class<T> type,
                                                           String message, Object... args) {
            try {
                return type.getConstructor(String.class).newInstance(
                        String.format(message, args));
            } catch (InstantiationException e) {
                throw Lang.unchecked(e, message, args);
            } catch (IllegalAccessException e) {
                throw Lang.unchecked(e, message, args);
            } catch (IllegalArgumentException e) {
                throw Lang.unchecked(e, message, args);
            } catch (InvocationTargetException e) {
                throw Lang.unchecked(e, message, args);
            } catch (NoSuchMethodException e) {
                throw Lang.unchecked(e, message, args);
            } catch (SecurityException e) {
                throw Lang.unchecked(e, message, args);
            }
        }
    
        /**
         * 抛出一个带消息的运行时异常
         *
         * @param message
         * @param args
         * @return
         */
        public static IllegalStateException newThrowable(String message,
                                                         Object... args) {
            return newThrowable(IllegalStateException.class, message, args);
        }
    
        /**
         * 新建一个Map,必须是偶数个参数
         *
         * @param args
         * @return
         */
        @SuppressWarnings("unchecked")
        public static <K, V> Map<K, V> newMap(Object... args) {
            Map<K, V> map = new HashMap<K, V>();
            if (args != null) {
                if (args.length % 2 != 0) {
                    throw new IllegalArgumentException(
                            "The number of arguments must be an even number");
                }
                for (int i = 0; i < args.length; i += 2) {
                    map.put((K) args[i], (V) args[i + 1]);
                }
            }
            return map;
        }
    
        /**
         * 生成一个固定容量的LRU策略的Map
         *
         * @param capacity 容量
         * @param args     参数列表,通newMap
         * @return
         */
    
        public static <K, V> Map<K, V> newLRUMap(final int capacity, Object... args) {
            Map<K, V> map = newMap(args);
            return new LinkedHashMap<K, V>(map) {
                /**
                 *
                 */
                private static final long serialVersionUID = -5820354698308020916L;
    
                /**
                 * Returns <tt>true</tt> if this map should remove its eldest entry.
                 * This method is invoked by <tt>put</tt> and <tt>putAll</tt> after
                 * inserting a new entry into the map.  It provides the implementor
                 * with the opportunity to remove the eldest entry each time a new one
                 * is added.  This is useful if the map represents a cache: it allows
                 * the map to reduce memory consumption by deleting stale entries.
                 *
                 * <p>Sample use: this override will allow the map to grow up to 100
                 * entries and then delete the eldest entry each time a new entry is
                 * added, maintaining a steady state of 100 entries.
                 * <pre>
                 *     private static final int MAX_ENTRIES = 100;
                 *
                 *     protected boolean removeEldestEntry(Map.Entry eldest) {
                 *        return size() > MAX_ENTRIES;
                 *     }
                 * </pre>
                 *
                 * <p>This method typically does not modify the map in any way,
                 * instead allowing the map to modify itself as directed by its
                 * return value.  It <i>is</i> permitted for this method to modify
                 * the map directly, but if it does so, it <i>must</i> return
                 * <tt>false</tt> (indicating that the map should not attempt any
                 * further modification).  The effects of returning <tt>true</tt>
                 * after modifying the map from within this method are unspecified.
                 *
                 * <p>This implementation merely returns <tt>false</tt> (so that this
                 * map acts like a normal map - the eldest element is never removed).
                 *
                 * @param    eldest The least recently inserted entry in the map, or if
                 *           this is an access-ordered map, the least recently accessed
                 *           entry.  This is the entry that will be removed it this
                 *           method returns <tt>true</tt>.  If the map was empty prior
                 *           to the <tt>put</tt> or <tt>putAll</tt> invocation resulting
                 *           in this invocation, this will be the entry that was just
                 *           inserted; in other words, if the map contains a single
                 *           entry, the eldest entry is also the newest.
                 * @return   <tt>true</tt> if the eldest entry should be removed
                 *           from the map; <tt>false</tt> if it should be retained.
                 */
                protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
                    return size() > capacity;
                }
            };
        }
    
        /**
         * 比较两个对象是否相同,对于数字、日期等按照大小进行比较,自动兼容包装器实例
         *
         * @param a
         * @param b
         * @return
         */
        public static boolean equals(Object a, Object b) {
            if (a == b) {
                return true;
            }
            if (a == null || b == null) {
                return false;
            }
            if (a.equals(b)) {
                return true;
            }
            // 比较大数字
            if (isNumber(a.getClass()) && isNumber(b.getClass())) {
                return new BigDecimal(a.toString()).compareTo(new BigDecimal(b
                        .toString())) == 0;
            }
            // 比较日期
            if (a instanceof Date && b instanceof Date) {
                return ((Date) a).compareTo((Date) b) == 0;
            }
            return false;
        }
    
        /**
         * 计时执行
         *
         * @return 返回runnable的执行时间
         */
        public static long timing(Runnable runnable) {
            long begin = System.currentTimeMillis();
            try {
                runnable.run();
                return System.currentTimeMillis() - begin;
            } catch (Throwable e) {
                throw unchecked(e);
            }
        }
    
        /**
         * 判断是否为真,不为真则抛出异常
         *
         * @param flag    真假标志位
         * @param message 消息体,可带格式,将使用String.format进行格式化
         * @param args    格式化参数,可为空
         */
        public static void isTrue(boolean flag, String message, Object... args) {
            if (!flag) {
                throw new IllegalArgumentException(String.format(message, args));
            }
        }
    
        /**
         * 判断是否非null,为null则抛出异常
         *
         * @param object  要判断的对象
         * @param message 消息体,可带格式,将使用String.format进行格式化
         * @param args    格式化参数,可为空
         */
        public static void notNull(Object object, String message, Object... args) {
            isTrue(object != null, message, args);
        }
    
        /**
         * 判断是否非空,为空则抛出异常
         *
         * @param object  要判断的对象
         * @param message 消息体,可带格式,将使用String.format进行格式化
         * @param args    格式化参数,可为空
         */
        public static void notEmpty(Object object, String message, Object... args) {
            isTrue(!Lang.isEmpty(object), message, args);
        }
    
        public static void main(String[] args) {
            System.out.println(BigDecimal.valueOf(0).equals(0));
        }
    
        /**
         * 获取最初的消息异常
         *
         * @param e
         * @return
         */
        public static Throwable getMessageCause(Throwable e) {
            while (e != null && e.getMessage() == null && e.getCause() != null) {
                e = e.getCause();
            }
            return e;
        }
    
    
        public static String generateDynamic(int len) {
            boolean isDigit = false;
            boolean isLetter = false;
            final int maxNum = 36;
            int m = 0;
            StringBuffer pwd = null;
            while (!isDigit || !isLetter) {
                isDigit = false;
                isLetter = false;
                pwd = new StringBuffer("");
                int i; // 生成的随机数
                int count = 0;
                char[] str = {'4', 'b', 'c', '8', 'e', 'f', 'g', 'h', 'i', 'j', 'k',
                        'l', '6', 'n', 'o', 'p', 'q', 'r', 's', '0', 'u', 'v', 'w',
                        '1', 'y', 'z', 't', 'x', '2', '3', 'a', '5', 'm', '7', 'd', '9'};
    
                Random r = new Random();
                while (count < len) {
                    // 生成随机数,取绝对值,防止生成负数,
                    // 生成的数最大为36-1
    
                    i = Math.abs(r.nextInt(maxNum));
                    if (i >= 0 && i < str.length) {
                        pwd.append(str[i]);
                        count++;
                    }
                }
    
                for (int j = 0; j < pwd.toString().length(); j++) { //循环遍历字符串
                    if (Character.isDigit(pwd.toString().charAt(j))) {     //用char包装类中的判断数字的方法判断每一个字符
                        isDigit = true;
                    }
                    if (Character.isLetter(pwd.toString().charAt(j))) {   //用char包装类中的判断字母的方法判断每一个字符
                        isLetter = true;
                    }
                }
                m++;
                log.info("--------------" + "第" + m + "次生成密码:" + pwd.toString() + "--------------------");
            }
    
            return pwd.toString();
        }
    
        public static BigDecimal fourCutFiveIn(double d, int decimalPlace) {
            BigDecimal bigDecimal = new BigDecimal(d);
            return bigDecimal.setScale(decimalPlace, BigDecimal.ROUND_HALF_UP);
        }
    
        public static BigDecimal fourCutFiveIn(BigDecimal bigDecimal, int decimalPlace) {
            return bigDecimal.setScale(decimalPlace, BigDecimal.ROUND_HALF_UP);
        }
    
        /**
         * 从列表中提取属性集合,支持Map列表及JavaBean列表
         *
         * @param list   支持Map列表(List<Map>)及JavaBean列表(List<Bean>)
         * @param key:   String 查找属性名
         * @param value: T 返回集合中的类型
         * @param <T>
         * @return
         */
        public static <T> List<T> grepList(List list, String key, T value) {
            List<T> grepedList = null;
            Object v;
            if (!isEmpty(list)) {
                grepedList = new ArrayList<>();
                Object obj = list.get(0);
                if (obj != null) {
                    /** 判断成员类型 */
                    if (obj instanceof Map) {
                        for (Object o : list) {
                            v = ((Map) o).get(key);
                            if (v != null) {
                                grepedList.add((T) v);
                            }
                        }
                    } else {
                        /** 处理Bean */
                        Class clz = obj.getClass();
                        try {
                            BeanInfo beanInfo = Introspector.getBeanInfo(clz);
                            PropertyDescriptor[] propDescs = beanInfo.getPropertyDescriptors();
                            for (Object o : list) {
                                for (int i = 0; i < propDescs.length; i++) {
                                    if (propDescs[i].getName().equals(key)) {
                                        v = propDescs[i].getReadMethod().invoke(o);
                                        if (v != null) {
                                            grepedList.add((T) v);
                                        }
                                    }
                                }
                            }
    
                        } catch (InvocationTargetException e) {
                            throw new RuntimeException("Not getter for key [" + key + "] in bean list !", e);
                        } catch (IllegalAccessException e) {
                            throw new RuntimeException("Not getter for key [" + key + "] in bean list !", e);
                        } catch (IntrospectionException e) {
                            throw new RuntimeException("Not getter for key [" + key + "] in bean list !", e);
                        }
    
                    }
                }
            }
    
            return grepedList;
        }
    
        /**
         * 从列表中查找,支持Map列表及JavaBean列表
         * 使用:
         * 1. 从List<Map>查找
         * List<Map> list = new ArrayList() {{
         * add(new HashMap(){{
         * put("key1", "key1_v1");
         * put("key2", "key2_v1");
         * }});
         * <p>
         * add(new HashMap(){{
         * put("key1", "key1_v2");
         * put("key2", "key2_v2");
         * }});
         * }}
         *
         * <b>Lang.findInBeanList(list, "key1", "key2_v2");</b>
         * <p>
         * 2. 从List<JavaBean>查找
         * List<TestBean> list = new ArrayList() {{
         * add(new TestBean(){{
         * setId("id1");
         * setName("bean1");
         * }});
         * <p>
         * add(new TestBean(){{
         * setId("id2");
         * setName("bean2");
         * }});
         * }}
         * <b>Lang.findInBeanList(list, "id", "id2");</b>
         *
         * @param list   支持Map列表(List<Map>)及JavaBean列表(List<Bean>)
         * @param key:   String 查找属性名,即Map的key或JavaBean的属性名
         * @param value: Object 需匹配的属性值
         * @return
         */
        public static <T> T findInBeanList(List<T> list, String key, Object value) {
            T result = null;
            Object v;
            if (!isEmpty(list)) {
                Object obj = list.get(0);
                /** 判断成员类型 */
                if (obj instanceof Map) {
                    for (Object o : list) {
                        v = ((Map) o).get(key);
                        if (v != null) {
                            if (v.equals(value)) {
                                result = (T) o;
                                break;
                            }
                        }
                    }
                } else {
                    /** 处理Bean */
                    try {
                        BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
                        PropertyDescriptor[] propDescs = beanInfo.getPropertyDescriptors();
                        for (Object o : list) {
                            for (int i = 0; i < propDescs.length; i++) {
                                if (propDescs[i].getName().equals(key)) {
                                    v = propDescs[i].getReadMethod().invoke(o);
                                    if (v != null && v.equals(value)) {
                                        result = (T) o;
                                        break;
                                    }
                                }
                            }
                        }
                    } catch (IntrospectionException e) {
                        throw new RuntimeException("Not getter for key [" + key + "] in bean list !", e);
                    } catch (InvocationTargetException e) {
                        throw new RuntimeException("Not getter for key [" + key + "] in bean list !", e);
                    } catch (IllegalAccessException e) {
                        throw new RuntimeException("Not getter for key [" + key + "] in bean list !", e);
                    } catch (ClassCastException e) {
                        throw new RuntimeException("ClassCastException !", e);
                    } catch (Exception e) {
                        throw new RuntimeException("findInBeanList !", e);
                    }
    
                }
            }
    
            return result;
        }
    
        public static <T> T findInBeanList(T[] beans, String key, Object value) {
            if (beans == null) {
                return null;
            }
            return findInBeanList(Arrays.asList(beans), key, value);
        }
    
        /**
         * 从列表中查找,支持Map列表及JavaBean列表
         * 使用:
         * 1. 从List<Map>查找
         * List<Map> list = new ArrayList() {{
         * add(new HashMap(){{
         * put("key1", "key1_v1");
         * put("key2", "key2_v1");
         * }});
         * <p>
         * add(new HashMap(){{
         * put("key1", "key1_v2");
         * put("key2", "key2_v2");
         * }});
         * }}
         *
         * <b>Lang.findInBeanList(list, "key1", "key2_v2");</b>
         * <p>
         * 2. 从List<JavaBean>查找
         * List<TestBean> list = new ArrayList() {{
         * add(new TestBean(){{
         * setId("id1");
         * setName("bean1");
         * }});
         * <p>
         * add(new TestBean(){{
         * setId("id2");
         * setName("bean2");
         * }});
         * }}
         * <b>Lang.findInBeanList(list, "id", "id2");</b>
         *
         * @param list   支持Map列表(List<Map>)及JavaBean列表(List<Bean>)
         * @param key:   String 查找属性名,即Map的key或JavaBean的属性名
         * @param value: Object 需匹配的属性值
         * @return
         */
        public static <T> List<T> findAllInBeanList(List<T> list, String key, Object value) {
            List<T> result = new ArrayList<>();
            Object v;
            if (!isEmpty(list)) {
                Object obj = list.get(0);
                /** 判断成员类型 */
                if (obj instanceof Map) {
                    for (Object o : list) {
                        v = ((Map) o).get(key);
                        if (v != null) {
                            if (v.equals(value)) {
                                result.add((T) o);
                                break;
                            }
                        }
                    }
                } else {
                    /** 处理Bean */
                    try {
                        BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
                        PropertyDescriptor[] propDescs = beanInfo.getPropertyDescriptors();
                        for (Object o : list) {
                            for (int i = 0; i < propDescs.length; i++) {
                                if (propDescs[i].getName().equals(key)) {
                                    v = propDescs[i].getReadMethod().invoke(o);
                                    if (v.equals(value)) {
                                        result.add((T) o);
                                        break;
                                    }
                                }
                            }
                        }
                    } catch (IntrospectionException e) {
                        throw new RuntimeException("Not getter for key [" + key + "] in bean list !", e);
                    } catch (InvocationTargetException e) {
                        throw new RuntimeException("Not getter for key [" + key + "] in bean list !", e);
                    } catch (IllegalAccessException e) {
                        throw new RuntimeException("Not getter for key [" + key + "] in bean list !", e);
                    }
    
                }
            }
    
            return result;
        }
    
        public static <T> List<T> findAllInBeanList(T[] beans, String key, Object value) {
            if (beans == null) {
                return null;
            }
            return findAllInBeanList(Arrays.asList(beans), key, value);
        }
    
        /**
         * 在JavaBean集合中,提取指定key值相同的记录,放到Map中,以key值作为索引
         *
         * @param list
         * @param key
         * @param <T>
         * @return Map<String               ,                               List               <               T>>
         */
        public static <T> Map<Object, List<T>> beanListGroupBy(List<T> list, Object key) {
            Map<Object, List<T>> result = null;
            Object v;
            List<T> groupedBeanList;
            if (!isEmpty(list)) {
                result = new HashMap<>();
                Object obj = list.get(0);
                /** 判断成员类型 */
                if (obj instanceof Map) {
                    for (Object o : list) {
                        v = ((Map) o).get(key);
                        if (v != null) {
                            groupedBeanList = result.get(v);
                            if (groupedBeanList == null) {
                                groupedBeanList = new ArrayList<>();
                            }
                            groupedBeanList.add((T) o);
                            result.put(v, groupedBeanList);
                        }
                    }
                } else {
                    /** 处理Bean */
                    try {
                        BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
                        PropertyDescriptor[] propDescs = beanInfo.getPropertyDescriptors();
                        for (Object o : list) {
                            for (int i = 0; i < propDescs.length; i++) {
                                if (propDescs[i].getName().equals(key)) {
                                    v = propDescs[i].getReadMethod().invoke(o);
                                    if (v != null) {
                                        groupedBeanList = result.get(v);
                                        if (groupedBeanList == null) {
                                            groupedBeanList = new ArrayList<>();
                                        }
                                        groupedBeanList.add((T) o);
                                        result.put(v, groupedBeanList);
                                    }
                                }
                            }
                        }
                    } catch (IntrospectionException e) {
                        throw new RuntimeException("Not getter for key [" + key + "] in bean list !", e);
                    } catch (InvocationTargetException e) {
                        throw new RuntimeException("Not getter for key [" + key + "] in bean list !", e);
                    } catch (IllegalAccessException e) {
                        throw new RuntimeException("Not getter for key [" + key + "] in bean list !", e);
                    }
    
                }
            }
    
            return result;
        }
    
        /**
         * 在List中查找指定值
         *
         * @param list
         * @param value
         * @param <T>
         * @return
         */
        public static <T> T findInList(Iterable<T> list, T value) {
            Iterator<T> it = list.iterator();
            T tmp;
            while (it.hasNext()) {
                tmp = it.next();
                if (tmp.equals(value)) {
                    return tmp;
                }
            }
    
            return null;
        }
    
        /**
         * 去除Map中的空值
         *
         * @param source
         * @param casde  是否级联
         * @return
         */
        public static <K, V> Map<K, V> filterNullMap(Map<K, V> source, Boolean casde) {
            Iterator<Map.Entry<K, V>> it = source.entrySet().iterator();
            V val;
            while (it.hasNext()) {
                Map.Entry<K, V> entry = it.next();
                val = entry.getValue();
                if (val == null) {
                    it.remove();
                } else {
                    if (casde) {
                        if (val instanceof Iterable) {
                            Iterator<Object> cit = ((Iterable) val).iterator();
                            Object tmp;
                            while (cit.hasNext()) {
                                tmp = cit.next();
                                if (tmp instanceof Map) {
                                    filterNullMap((Map<Object, Object>) tmp, casde);
                                }
                            }
                        } else if (val instanceof Map) {
                            filterNullMap((Map<Object, Object>) val, casde);
                        }
                    }
                }
            }
    
            return source;
        }
    
        /**
         * 将集合按指定数量分组
         *
         * @param list
         * @param quantity
         * @return 返回分组后的List -> List<List<T>>
         */
        public static List groupListByQuantity(List list, int quantity) {
            if (list == null || list.size() == 0) {
                return list;
            }
    
            if (quantity <= 0) {
                new IllegalArgumentException("Wrong quantity.");
            }
    
            List wrapList = new ArrayList();
            int count = 0;
            while (count < list.size()) {
                wrapList.add(new ArrayList(list.subList(count, (count + quantity) > list.size() ? list.size() : count + quantity)));
                count += quantity;
            }
    
            return wrapList;
        }
    }

    2.1.6.2 QueryByPage.class

    package com.springdataJpa.oracle.util;
    
    import com.springdataJpa.oracle.vo.PageVo;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.jdbc.core.BeanPropertyRowMapper;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.stereotype.Component;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    
    /**
     * 分页查询封装类(不适合sql带In的查询)
     */
    @Component
    @Slf4j
    public class QueryByPage {
    
        @Autowired
        JdbcTemplate jdbcTemplate;
    
        /**
         * @param sql
         * @param elementType 返回需要封装的javaVo
         * @param page
         * @param pageSize
         * @param args        sql参数
         * @return PageVo
         */
        public <T> PageVo<T> query(String sql, Class<T> elementType, Integer page, Integer pageSize, Object... args) throws Exception {
            sql = sql.toLowerCase();
            log.info("query sql:" + sql);
            SqlReCreateFactory sqlReCreateFactory = new SqlReCreateFactory<Object>(sql, page, pageSize, args).invoke();
            sql = sqlReCreateFactory.getSql();
            List<Object> argsList = sqlReCreateFactory.getArgsList();
            PageVo<T> pageVo = sqlReCreateFactory.getPageVo();
            List<T> result = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(elementType), argsList.toArray());
            pageVo.setResult(result);
            return pageVo;
        }
    
        /**
         * @param sql      默认封装成List<Map<String,Object>>
         * @param page
         * @param pageSize
         * @param args     sql参数
         * @return PageVo
         */
        public PageVo query(String sql, Integer page, Integer pageSize, Object... args) throws Exception {
            sql = sql.toLowerCase();
            log.info("query sql:" + sql);
            SqlReCreateFactory sqlReCreateFactory = new SqlReCreateFactory<Object>(sql, page, pageSize, args).invoke();
            sql = sqlReCreateFactory.getSql();
            List<Object> argsList = sqlReCreateFactory.getArgsList();
            PageVo<Map<String, Object>> pageVo = sqlReCreateFactory.getPageVo();
            List<Map<String, Object>> result = jdbcTemplate.queryForList(sql, argsList.toArray());
            pageVo.setResult(result);
            return pageVo;
        }
    
        public PageVo querySqlCaseNoConvert(String sql, Integer page, Integer pageSize, Object... args) throws Exception {
            log.info("SQL IS {}", sql);
            SqlReCreateFactory sqlReCreateFactory = new SqlReCreateFactory<>(sql, page, pageSize, args).invoke();
            sql = sqlReCreateFactory.getSql();
            List<Object> argsList = sqlReCreateFactory.getArgsList();
            PageVo<Map<String, Object>> pageVo = sqlReCreateFactory.getPageVo();
            List<Map<String, Object>> result = jdbcTemplate.queryForList(sql, argsList.toArray());
            pageVo.setResult(result);
            return pageVo;
        }
    
        private class SqlReCreateFactory<T> {   //
            private String sql;
            private Integer page;
            private Integer pageSize;
            private Object[] args;
            private PageVo<T> pageVo;
            private List<Object> argsList;
    
            public SqlReCreateFactory(String sql, Integer page, Integer pageSize, Object... args) {
                this.sql = sql;
                this.page = page;
                this.pageSize = pageSize;
                this.args = args;
            }
    
            public String getSql() {
                return sql;
            }
    
            public PageVo<T> getPageVo() {
                return pageVo;
            }
    
            public List<Object> getArgsList() {
                return argsList;
            }
    
            public SqlReCreateFactory invoke() {
                pageVo = new PageVo<>(0, pageSize);
                String sqlCount = "select count(*) from (" + sql + ")  ";       //oracle数据库不需要别名
                //String sqlCount = "select count(*) from (" + sql + ") cal ";   //mysql数据库需要别名,不然会报 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Every derived table must have its own alias这个错误
                Integer count = jdbcTemplate.queryForObject(sqlCount, args, Integer.class);   //查询页数
                pageVo.setTotalCount(count);
                pageVo.setCurrentPage(page);
                int pageNum = 0;
                if (count != null && count > 0) {
                    if (count % pageSize == 0) {
                        pageNum = count / pageSize;
                    } else {
                        pageNum = count / pageSize + 1;
                    }
                    pageVo.setPageNum(pageNum);
                }
        /*        String sqlPrefix = sql.substring(0, sql.indexOf("from"));
                String sqlSuffix = sql.substring(sql.indexOf("from"));*/
                int pageMin = (page - 1) * pageSize;
                int pageMax = pageMin + pageSize;
                argsList = new ArrayList<>();
                for (Object arg : args) {
                    argsList.add(arg);
                }
                argsList.add(pageMin);
                argsList.add(pageMax);
                sql = "select p.* from (select t.* ,rownum rownumber from  (" + sql + ") t) p where p.rownumber>? and p.rownumber<=? ";
                return this;
            }
        }
    }

    2.1.6.3 JdbcTemplatePage.class

    package com.springdataJpa.oracle.util;
    
    import com.springdataJpa.oracle.vo.PageVo;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.jdbc.core.BeanPropertyRowMapper;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
    import org.springframework.stereotype.Component;
    
    import java.util.List;
    import java.util.Map;
    
    /**
     * parent
     *
     * @date 2018/7/25
     * 分页查询(拥有QueryByPage的功能,并且适合sql语句带In的查询)
     */
    @Component
    @Slf4j
    public class JdbcTemplatePage {
    
        @Autowired
        JdbcTemplate jdbcTemplate;
    
        /**
         * @param sql
         * @param elementType 返回需要封装的pageVo
         * @param page
         * @param pageSize
         * @param args
         * @return PageVo
         */
        public <T> PageVo<T> query(String sql, Class<T> elementType, Integer page, Integer pageSize, Map<String,Object> args) throws Exception {
            NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate.getDataSource());
            sql = sql.toLowerCase();
            log.info("query sql:"+sql);
            SqlReCreateFactory sqlReCreateFactory = new SqlReCreateFactory<Object>(sql, page, pageSize, args).invoke();
            sql = sqlReCreateFactory.getSql();
            PageVo<T> pageVo = sqlReCreateFactory.getPageVo();
            List<T> result = namedParameterJdbcTemplate.query(sql, args, new BeanPropertyRowMapper<>(elementType));
            pageVo.setResult(result);
            return pageVo;
        }
    
        private class SqlReCreateFactory<T> {   //
            private String sql;
            private Integer page;
            private Integer pageSize;
            private Map<String,Object> args;
            private PageVo<T> pageVo;
    
            public SqlReCreateFactory(String sql, Integer page, Integer pageSize, Map<String, Object> args) {
                this.sql = sql;
                this.page = page;
                this.pageSize = pageSize;
                this.args = args;
            }
    
            public String getSql() {
                return sql;
            }
    
            public PageVo<T> getPageVo() {
                return pageVo;
            }
    
            public SqlReCreateFactory invoke() {
                NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate.getDataSource());
                pageVo = new PageVo<>(0, pageSize);
                String sqlCount = "select count(*) from (" + sql + ")  ";  // oracle数据库不需要别名
                //String sqlCount = "select count(*) from (" + sql + ") c ";   //mysql数据库需要别名,不然会报 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Every derived table must have its own alias这个错误
                //String sqlCount = getSQLCount(sql); 也可以用这种方式计算总数
                Integer count = namedParameterJdbcTemplate.queryForObject(sqlCount, args, Integer.class); //查询页数
                pageVo.setTotalCount(count);
                pageVo.setCurrentPage(page);
                int pageNum = 0;
                if (count != null && count > 0) {
                    if (count % pageSize == 0) {
                        pageNum = count / pageSize;
                    } else {
                        pageNum = count / pageSize + 1;
                    }
                    pageVo.setPageNum(pageNum);
                }
                //这种方法也可以
                /*Integer pageNum = calTotalPages(pageSize, count);
                pageVo.setPageNum(pageNum);*/
                int pageMin = (page - 1) * pageSize;
                int pageMax = pageMin + pageSize;  //oracle是这样的
                //int pageMax = pageSize;  //mysql分页是:第一页是select * from users  limit 0,10;第二页是select * from users  limit 10,10;
                args.put("pagemin",pageMin);
                args.put("pagemax",pageMax);
                sql = "select p.* from (select t.* ,rownum rownumber from  (" +sql+ ") t) p where p.rownumber>:pagemin and p.rownumber<=:pagemax ";
                return this;
            }
        }
    
        /**
         * 获得计算总数的sql
         * @param sql
         * @return
         */
        public String getSQLCount(String sql) {
            String sqlBak = sql.toLowerCase();
            String searchValue = " from ";
            String sqlCount = "select count(*) from " + sql.substring(sqlBak.indexOf(searchValue) + searchValue.length(), sqlBak.length());
            return sqlCount;
        }
    
        // 计算总页数
        public Integer calTotalPages(int numPerPage, int totalRows) {
            if (totalRows % numPerPage == 0) {
                return totalRows / numPerPage;
            } else {
                return (totalRows / numPerPage) + 1;
            }
        }
    
        // 计算总页数
       /* public void setTotalPages(int numPerPage, int totalRows) {
            if (totalRows % numPerPage == 0) {
                this.totalPages = totalRows / numPerPage;
            } else {
                this.totalPages = (totalRows / numPerPage) + 1;
            }
        }*/
    }

    2.1.7 service

    2.1.7.1 JdbcTemplateService.class

    package com.springdataJpa.oracle.service;
    
    import com.springdataJpa.oracle.model.Users;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.jdbc.core.BatchPreparedStatementSetter;
    import org.springframework.jdbc.core.BeanPropertyRowMapper;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.stereotype.Service;
    
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * @date 2018/6/26
     */
    @Service
    public class JdbcTemplateService {
    
        @Autowired
        JdbcTemplate jdbcTemplate;
    
        /**
         * 添加用户
         *
         * @param users
         * @return
         */
        public Integer add(Users users) {
            String insertSql = "insert into users(id,user_name,age,sex,status,date_created) values (?,?,?,?,?,?)";
            List<Object> list = new ArrayList<>();
            list.add(users.getId());
            list.add(users.getUserName());
            list.add(users.getAge());
            list.add(users.getSex());
            list.add(users.getStatus());
            list.add(users.getDateCreated());
            //int count = jdbcTemplate.update(insertSql, new Object[]{users.getId(), users.getUserName(), users.getAge(), users.getSex(),users.getStatus(),users.getDateCreated()});
            int count = jdbcTemplate.update(insertSql,list.toArray());
            return count;
        }
    
        /**
         * 更新用户
         *
         * @param users
         * @return
         */
        public Integer update(Users users) {
            String updateSql = "update users u set u.user_name = ? where u.id = ? ";
            int count = jdbcTemplate.update(updateSql, new Object[]{users.getUserName(), users.getId()});
            return count;
        }
    
        /**
         * 删除用户
         *
         * @param users
         * @return
         */
        public Integer delete(Users users) {
            String deleteSql = "delete from users where id = ? ";
            int count = jdbcTemplate.update(deleteSql, new Object[]{users.getId()});
            return count;
        }
    
        /**
         * 批量添加用户
         *
         * @param users
         * @return
         */
        public int[] adds(List<Users> users) {
            final List<Users> tempUsers = users;
            String insertsSql = "insert into users(id,user_name,age,sex,status) values (?,?,?,?,?)";
            int[] ints = jdbcTemplate.batchUpdate(insertsSql, new BatchPreparedStatementSetter() {
                @Override
                public void setValues(PreparedStatement ps, int i) throws SQLException {
                    String id = tempUsers.get(i).getId();
                    String userName = tempUsers.get(i).getUserName();
                    Integer age = tempUsers.get(i).getAge();
                    String sex = tempUsers.get(i).getSex();
                    String status = tempUsers.get(i).getStatus();
                    ps.setString(1, id);
                    ps.setString(2, userName);
                    ps.setInt(3, age);
                    ps.setString(4, sex);
                    ps.setString(5, status);
                }
    
                @Override
                public int getBatchSize() {
                    return tempUsers.size();
                }
            });
            return ints;
        }
    
        /**
         * 查询列表
         *
         * @return
         */
        public List<Users> usersQuery() {
            List<Users> users = null;
            String querySql = "select * from users";
            try {
                users = jdbcTemplate.query(querySql, new BeanPropertyRowMapper<Users>(Users.class));
            } catch (Exception e) {
                e.printStackTrace();
            }
            return users;
        }
    
    }

    2.1.7.2 QueryPageService.class

    package com.springdataJpa.oracle.service;
    
    import com.springdataJpa.oracle.dto.UsersQuery;
    import com.springdataJpa.oracle.model.Users;
    import com.springdataJpa.oracle.util.Lang;
    import com.springdataJpa.oracle.util.QueryByPage;
    import com.springdataJpa.oracle.vo.PageVo;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    /**
     * @author luoxianwei
     * @date 2018/6/26
     */
    @Service
    @Slf4j
    public class QueryPageService {
    
        @Autowired
        private QueryByPage queryByPage;
    
        /**
         * 分页查询(不带条件)
         *
         * @param pageSize
         * @param pageNumber
         * @return
         */
        public PageVo<Users> usersList(int pageSize, int pageNumber) {
            PageVo<Users> usersPageVo = null;
            Map<String, Object> sqlList = usersListSql();
            try {
                usersPageVo = queryByPage.query(String.valueOf(sqlList.get("sql")), Users.class, pageNumber, pageSize, ((List) sqlList.get("list")).toArray());
            } catch (Exception e) {
                e.printStackTrace();
            }
            return usersPageVo;
        }
    
        /**
         * 列表查询Sql
         *
         * @return
         */
        public Map<String, Object> usersListSql() {
            StringBuffer sql = new StringBuffer();
            sql.append(" select * from users u ");
    
            List<Object> list = new ArrayList<Object>();
            log.info("列表查询Sql===》:{}", sql.toString());
            Map<String, Object> map = new HashMap<>();
            map.put("sql", sql.toString());
            map.put("list", list);
            return map;
        }
    
        /**
         * 分页查询(带条件不带In)
         *
         * @param pageSize
         * @param pageNumber
         * @return
         */
        public PageVo<Users> usersQueryList(int pageSize, int pageNumber, UsersQuery usersQuery) {
            PageVo<Users> usersPageVo = null;
            Map<String, Object> sqlList = usersQueryListSql(usersQuery);
            try {
                usersPageVo = queryByPage.query(String.valueOf(sqlList.get("sql")), Users.class, pageNumber, pageSize, ((List) sqlList.get("list")).toArray());
            } catch (Exception e) {
                e.printStackTrace();
            }
            return usersPageVo;
        }
    
        /**
         * 列表查询Sql
         *
         * @return
         */
        public Map<String, Object> usersQueryListSql(UsersQuery usersQuery) {
            StringBuffer sql = new StringBuffer();
            sql.append(" select * from users u where 1 = 1 ");
            List<Object> list = new ArrayList<>();
            if (!Lang.isEmpty(usersQuery.getUserName())) {
                sql.append(" and u.user_name = ? ");
                list.add(usersQuery.getUserName());
            }
            if (!Lang.isEmpty(usersQuery.getAge())) {
                sql.append(" and u.age = ? ");
                list.add(usersQuery.getAge());
            }
            if (!Lang.isEmpty(usersQuery.getSex())) {
                sql.append(" and u.sex = ? ");
                list.add(usersQuery.getSex());
            }
    
            log.info("列表查询Sql===》:{}", sql.toString());
            Map<String, Object> map = new HashMap<>();
            map.put("sql", sql.toString());
            map.put("list", list);
            return map;
        }
    }

    2.1.7.3 JdbcTemplatePageService.class

    package com.springdataJpa.oracle.service;
    
    import com.springdataJpa.oracle.dto.UsersQuery;
    import com.springdataJpa.oracle.model.Users;
    import com.springdataJpa.oracle.util.JdbcTemplatePage;
    import com.springdataJpa.oracle.util.Lang;
    import com.springdataJpa.oracle.vo.PageVo;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    /**
     * @author luoxianwei
     * @date 2018/6/26
     */
    @Service
    @Slf4j
    public class JdbcTemplatePageService {
    
        @Autowired
        private JdbcTemplatePage jdbcTemplatePage;
    
        /**
         * 分页查询(带条件带In)
         *
         * @param pageSize
         * @param pageNumber
         * @return
         */
        public PageVo<Users> usersQueryInList(int pageSize, int pageNumber, UsersQuery usersQuery) {
            PageVo<Users> usersPageVo = null;
            Map<String, Object> sqlList = usersQueryInListSql(usersQuery);
            try {
                usersPageVo = jdbcTemplatePage.query(String.valueOf(sqlList.get("sql")), Users.class, pageNumber, pageSize, (Map<String, Object>) sqlList.get("params"));
            } catch (Exception e) {
                e.printStackTrace();
            }
            return usersPageVo;
        }
    
        /**
         * 列表查询Sql
         *
         * @return
         */
        public Map<String, Object> usersQueryInListSql(UsersQuery usersQuery) {
            StringBuffer sql = new StringBuffer();
            sql.append(" select * from users u where 1 = 1 ");
    
            Map<String, Object> params = new HashMap<String, Object>();
            if (!Lang.isEmpty(usersQuery.getUserName())) {
                sql.append(" and u.user_name = :username "); //别名要小些,因为后面sql都转换为小写
                params.put("username", usersQuery.getUserName());
            }
            if (!Lang.isEmpty(usersQuery.getAge())) {
                sql.append(" and u.age = :age ");
                params.put("age", usersQuery.getAge());
            }
            if (!Lang.isEmpty(usersQuery.getSex())) {
                sql.append(" and u.sex = :sex ");
                params.put("sex", usersQuery.getSex());
            }
            List<Object> list = new ArrayList<>();
            if (!Lang.isEmpty(usersQuery.getStatus())) {
                String[] status = usersQuery.getStatus().split(",");
                for (String statu : status) {
                    list.add(statu);
                }
                sql.append(" and u.status in (:status) ");
                params.put("status", list);
            }
    
            log.info("列表查询Sql===》:{}", sql.toString());
            Map<String, Object> map = new HashMap<>();
            map.put("sql", sql.toString());
            map.put("params", params);
            return map;
        }
    }

    2.1.8 test

    package com.springdataJpa.oracle.test;
    
    import com.springdataJpa.oracle.OracleJdbcTemplateApplication;
    import com.springdataJpa.oracle.dto.UsersQuery;
    import com.springdataJpa.oracle.model.Users;
    import com.springdataJpa.oracle.service.JdbcTemplatePageService;
    import com.springdataJpa.oracle.service.JdbcTemplateService;
    import com.springdataJpa.oracle.service.QueryPageService;
    import com.springdataJpa.oracle.vo.PageVo;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.UUID;
    
    /**
     * @author luoxianwei
     * @date 2018/6/26
     */
    @SpringBootTest(classes = OracleJdbcTemplateApplication.class)
    @RunWith(SpringRunner.class)
    public class UsersTest {
    
        @Autowired
        JdbcTemplateService jdbcTemplateService;
        @Autowired
        QueryPageService queryPageService;
        @Autowired
        JdbcTemplatePageService jdbcTemplatePageService;
    
        /**
         * 添加用户
         */
        @Test
        public void addUsers() {
            Users users = new Users();
            String id = UUID.randomUUID().toString();
            users.setId(id);
            users.setUserName("张三");
            users.setAge(20);
            users.setSex("男");
            users.setStatus("1");
            Integer count = jdbcTemplateService.add(users);
            System.out.println("成功插入:" + count);
        }
    
        /**
         * 更新用户
         */
        @Test
        public void updateUsers() {
            Users users = new Users();
            users.setId("1ef1f637-87da-40e9-935e-328928a78884");
            users.setUserName("李四");
            Integer count = jdbcTemplateService.update(users);
            System.out.println("成功修改:" + count);
        }
    
        /**
         * 删除用户
         */
        @Test
        public void deleteUsers() {
            Users users = new Users();
            users.setId("f5c05e22-6c5c-4f8c-97e0-2fe9fa919714");
            Integer count = jdbcTemplateService.delete(users);
            System.out.println("成功删除:" + count);
        }
    
        /**
         * 批量添加用户
         */
        @Test
        public void addsUsers() {
            List<Users> users = new ArrayList<Users>();
            for (int i = 0; i < 1000; i++) {
                Users users1 = new Users();
                String uuid = UUID.randomUUID().toString();
                users1.setId(uuid);
                users1.setUserName(uuid.substring(2, 5));
                if (i < 200) {
                    users1.setStatus("1");
                    users1.setSex("男");
                    users1.setAge(20);
                } else if (i < 500) {
                    users1.setStatus("2");
                    users1.setSex("男");
                    users1.setAge(20);
                } else if (i < 700) {
                    users1.setStatus("3");
                    users1.setSex("女");
                    users1.setAge(18);
                } else {
                    users1.setStatus("4");
                    users1.setSex("女");
                    users1.setAge(18);
                }
                users.add(users1);
            }
            int[] adds = jdbcTemplateService.adds(users);
            System.out.println("批量添加:" + adds.length);
        }
    
        /**
         * 查询列表
         */
        @Test
        public void usersQuery() {
            List<Users> users = jdbcTemplateService.usersQuery();
            System.out.println("成功查询:" + users.size() + "条");
        }
    
        /**
         * 分页查询(不带条件)
         */
        @Test
        public void usersList() {
            PageVo<Users> usersPageVo = queryPageService.usersList(10, 1);
            System.out.println("成功分页查询:" + usersPageVo.getResult().size() + "条");
        }
    
        /**
         * 分页查询(带条件不带In)
         */
        @Test
        public void usersQueryList() {
            UsersQuery usersQuery = new UsersQuery();
            usersQuery.setSex("男");
            usersQuery.setAge(20);
            PageVo<Users> pageVo = queryPageService.usersQueryList(10, 1, usersQuery);
            System.out.println("成功分页查询:" + pageVo.getResult().size() + "条");
        }
    
        /**
         * 分页查询(带条件带In)
         */
        @Test
        public void usersQueryInList() {
            UsersQuery usersQuery = new UsersQuery();
            usersQuery.setSex("男");
            usersQuery.setAge(20);
            usersQuery.setStatus("1,2");
            PageVo<Users> pageVo = jdbcTemplatePageService.usersQueryInList(10, 1, usersQuery);
            System.out.println("成功分页查询:" + pageVo.getTotalCount() + "条");
        }
    
    }

    2.2 mysqlDatabase

    2.2.1 pom.xml

    <dependency>
       <groupId>mysql</groupId>
       <artifactId>mysql-connector-java</artifactId>
    </dependency>

    2.2.2 application.properties

    server.port=8089
    server.servlet-path=/
    spring.resources.static-locations=classpath:/static/,classpath:/templates/
    spring.mvc.view.suffix=.html
    
    #配置数据源
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    spring.datasource.url=jdbc:mysql://localhost:3306/jdbcTemplate
    spring.datasource.username=root
    spring.datasource.password=root
    spring.jpa.hibernate.ddl-auto=none
    spring.jpa.show-sql=true
    
    #在控制台输出彩色日志
    spring.output.ansi.enabled=always

    2.2.3 model

    2.2.3.1 BaseDomain.class

    package com.springdataJpa.mysql.model.base;
    
    import lombok.Data;
    
    import javax.persistence.Column;
    import javax.persistence.MappedSuperclass;
    import java.io.Serializable;
    import java.util.Date;
    
    /**
     * @author luoxianwei
     * @date 2018/5/14
     */
    @MappedSuperclass
    @Data
    public class BaseDomain implements Serializable {
    
        /**
         * 创建日期
         */
        @Column(columnDefinition ="timestamp comment '创建日期'")
        private Date dateCreated;
    
        /**
         * 最后更新日期
         */
        @Column(columnDefinition ="timestamp comment '最后更新日期'")
        private Date lastUpdated;
    
        /**
         * 删除日期
         */
        @Column(columnDefinition ="timestamp comment '删除日期'")
        private Date deleteDate;
        /**
         * 删除标记
         */
        @Column(columnDefinition ="int(1) default 0 comment '删除标记'")
        private int isDelete  ;
    
        public void setLastUpdated(Date lastUpdated) {
            this.lastUpdated = lastUpdated == null? null : lastUpdated;
        }
    
        public void setDeleteDate(Date deleteDate) {
            this.deleteDate = deleteDate == null? null : deleteDate;
        }
    }

    2.2.3.2 Users.class

    package com.springdataJpa.mysql.model;
    
    import com.springdataJpa.mysql.model.base.BaseDomain;
    import lombok.Data;
    import org.hibernate.annotations.GenericGenerator;
    
    import javax.persistence.*;
    import java.io.Serializable;
    
    /**
     * @author luoxianwei
     * @date 2018/5/11
     */
    @Entity
    @Table
    @Data
    public class Users extends BaseDomain implements Serializable {
    
        //用户状态:1.在线;2.隐身;3.离线;4.忙碌
        private static final String USER_STATUS_ONLINE = "1";
        //用户状态:2.隐身;
        private static final String USER_STATUS_INVISIBLE = "2";
        //用户状态:3.离线;
        private static final String USER_STATUS_OFFLINE = "3";
        //用户状态:4.忙碌
        private static final String USER_STATUS_BEBUSY = "4";
    
        @Id
        @GenericGenerator(name = "PKUUID", strategy = "uuid2")
        @GeneratedValue(generator = "PKUUID")
        @Column(columnDefinition = "varchar(255) comment '用户Id'")
        private String id;
    
        @Column(columnDefinition = "varchar(255) comment '姓名'")
        private String userName;
    
        @Column(columnDefinition = "int comment '年龄'")
        private Integer age;
    
        @Column(columnDefinition = "varchar(255) comment '性别'")
        private String sex;
    
        /**
         * 用户状态:1.在线;2.隐身;3.离线;4.忙碌
         */
        @Column(columnDefinition = "varchar(255) comment '状态'")
        private String status;
    }

    2.2.4 dto

    2.2.4.1 UsersQuery.class

    package com.springdataJpa.mysql.dto;
    
    import lombok.Data;
    
    @Data
    public class UsersQuery {
        private String id;
    
        private String userName;
    
        private Integer age;
    
        private String sex;
    
        private String status;
    }

    2.2.5 vo

    2.2.5.1 PageVo.class

    package com.springdataJpa.mysql.vo;
    
    import lombok.Data;
    
    import java.io.Serializable;
    import java.util.List;
    
    @Data
    public class PageVo<T> implements Serializable {
        //分页查询结果
        List<T> Result;
        //页总数
        Integer pageNum;
        //一页记录数
        Integer pageSize;
        //总记录数
        Integer totalCount;
        //当前页
        Integer currentPage;
    
    
        public PageVo() {
    
        }
    
        public PageVo(Integer pageNum, Integer pageSize) {
            this.pageNum = pageNum;
            this.pageSize = pageSize;
        }
    
    }

    2.2.6 util

    2.2.6.1 Lang.class

    同上面的一样

    2.2.6.2 Pagination.class

    package com.springdataJpa.mysql.util;
    
    import com.springdataJpa.mysql.vo.PageVo;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.jdbc.core.BeanPropertyRowMapper;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.stereotype.Component;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    
    /**
     * 分页查询封装类(类似于使用oracle数据库util中的QueryByPage,不适合sql带In的查询)
     */
    @Component
    @Slf4j
    public class Pagination {
    
        @Autowired
        JdbcTemplate jdbcTemplate;
    
        /**
         * @param sql
         * @param elementType 返回需要封装的javaVo
         * @param page
         * @param pageSize
         * @param args        sql参数
         * @return PageVo
         */
        public <T> PageVo<T> query(String sql, Class<T> elementType, Integer page, Integer pageSize, Object... args) throws Exception {
            sql = sql.toLowerCase();
            log.info("query sql:" + sql);
            SqlReCreateFactory sqlReCreateFactory = new SqlReCreateFactory<Object>(sql, page, pageSize, args).invoke();
            sql = sqlReCreateFactory.getSql();
            List<Object> argsList = sqlReCreateFactory.getArgsList();
            PageVo<T> pageVo = sqlReCreateFactory.getPageVo();
            List<T> result = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(elementType), argsList.toArray());
            pageVo.setResult(result);
            return pageVo;
        }
    
        /**
         * @param sql      默认封装成List<Map<String,Object>>
         * @param page
         * @param pageSize
         * @param args     sql参数
         * @return PageVo
         */
        public PageVo query(String sql, Integer page, Integer pageSize, Object... args) throws Exception {
            sql = sql.toLowerCase();
            log.info("query sql:" + sql);
            SqlReCreateFactory sqlReCreateFactory = new SqlReCreateFactory<Object>(sql, page, pageSize, args).invoke();
            sql = sqlReCreateFactory.getSql();
            List<Object> argsList = sqlReCreateFactory.getArgsList();
            PageVo<Map<String, Object>> pageVo = sqlReCreateFactory.getPageVo();
            List<Map<String, Object>> result = jdbcTemplate.queryForList(sql, argsList.toArray());
            pageVo.setResult(result);
            return pageVo;
        }
    
        public PageVo querySqlCaseNoConvert(String sql, Integer page, Integer pageSize, Object... args) throws Exception {
            log.info("SQL IS {}", sql);
            SqlReCreateFactory sqlReCreateFactory = new SqlReCreateFactory<>(sql, page, pageSize, args).invoke();
            sql = sqlReCreateFactory.getSql();
            List<Object> argsList = sqlReCreateFactory.getArgsList();
            PageVo<Map<String, Object>> pageVo = sqlReCreateFactory.getPageVo();
            List<Map<String, Object>> result = jdbcTemplate.queryForList(sql, argsList.toArray());
            pageVo.setResult(result);
            return pageVo;
        }
    
        private class SqlReCreateFactory<T> {   //
            private String sql;
            private Integer page;
            private Integer pageSize;
            private Object[] args;
            private PageVo<T> pageVo;
            private List<Object> argsList;
    
            public SqlReCreateFactory(String sql, Integer page, Integer pageSize, Object... args) {
                this.sql = sql;
                this.page = page;
                this.pageSize = pageSize;
                this.args = args;
            }
    
            public String getSql() {
                return sql;
            }
    
            public PageVo<T> getPageVo() {
                return pageVo;
            }
    
            public List<Object> getArgsList() {
                return argsList;
            }
    
            public SqlReCreateFactory invoke() {
                pageVo = new PageVo<>(0, pageSize);
                //String sqlCount = "select count(*) from (" + sql + ")  ";     oracle数据库不需要别名
                String sqlCount = "select count(*) from (" + sql + ") c ";   //mysql数据库需要别名,不然会报 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Every derived table must have its own alias这个错误
                //String sqlCount = getSQLCount(sql); 也可以用这种方式计算总数
                Integer count = jdbcTemplate.queryForObject(sqlCount, args, Integer.class);   //查询页数
                pageVo.setTotalCount(count);
                pageVo.setCurrentPage(page);
                int pageNum = 0;
                if (count != null && count > 0) {
                    if (count % pageSize == 0) {
                        pageNum = count / pageSize;
                    } else {
                        pageNum = count / pageSize + 1;
                    }
                    pageVo.setPageNum(pageNum);
                }
                //这种方法也可以
                /*Integer pageNum = calTotalPages(pageSize, count);
                pageVo.setPageNum(pageNum);*/
                int pageMin = (page - 1) * pageSize;
                //int pageMax = pageMin + pageSize; oracle是这样的
                int pageMax = pageSize;  //mysql分页是:第一页是select * from users  limit 0,10;第二页是select * from users  limit 10,10;
                argsList = new ArrayList<>();
                for (Object arg : args) {
                    argsList.add(arg);
                }
                argsList.add(pageMin);
                argsList.add(pageMax);
                //sql = "select p.* from (select t.* ,rownum rownumber from  (" + sql + ") t) p where p.rownumber>? and p.rownumber<=? "; oracle数据库是这样的
                sql =  sql + "limit ?,? " ;  //mysql数据库是这样的
                return this;
            }
        }
    
        /**
         * 获得计算总数的sql
         * @param sql
         * @return
         */
        public String getSQLCount(String sql) {
            String sqlBak = sql.toLowerCase();
            String searchValue = " from ";
            String sqlCount = "select count(*) from " + sql.substring(sqlBak.indexOf(searchValue) + searchValue.length(), sqlBak.length());
            return sqlCount;
        }
    
        // 计算总页数
        public Integer calTotalPages(int numPerPage, int totalRows) {
            if (totalRows % numPerPage == 0) {
                return totalRows / numPerPage;
            } else {
                return (totalRows / numPerPage) + 1;
            }
        }
    
        // 计算总页数
       /* public void setTotalPages(int numPerPage, int totalRows) {
            if (totalRows % numPerPage == 0) {
                this.totalPages = totalRows / numPerPage;
            } else {
                this.totalPages = (totalRows / numPerPage) + 1;
            }
        }*/
    }

    2.2.6.3 JdbcTemplatePage.class

    package com.springdataJpa.mysql.util;
    
    import com.springdataJpa.mysql.vo.PageVo;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.jdbc.core.BeanPropertyRowMapper;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
    import org.springframework.stereotype.Component;
    
    import java.util.List;
    import java.util.Map;
    
    /**
     * parent
     *
     * @date 2018/7/25
     * 分页查询(拥有Pagination的功能,并且适合sql语句带In的查询)
     */
    @Component
    @Slf4j
    public class JdbcTemplatePage {
    
        @Autowired
        JdbcTemplate jdbcTemplate;
    
        /**
         * @param sql
         * @param elementType 返回需要封装的pageVo
         * @param page
         * @param pageSize
         * @param args
         * @return PageVo
         */
        public <T> PageVo<T> query(String sql, Class<T> elementType, Integer page, Integer pageSize, Map<String,Object> args) throws Exception {
            NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate.getDataSource());
            sql = sql.toLowerCase();
            log.info("query sql:"+sql);
            SqlReCreateFactory sqlReCreateFactory = new SqlReCreateFactory<Object>(sql, page, pageSize, args).invoke();
            sql = sqlReCreateFactory.getSql();
            PageVo<T> pageVo = sqlReCreateFactory.getPageVo();
            List<T> result = namedParameterJdbcTemplate.query(sql, args, new BeanPropertyRowMapper<>(elementType));
            pageVo.setResult(result);
            return pageVo;
        }
    
        private class SqlReCreateFactory<T> {   //
            private String sql;
            private Integer page;
            private Integer pageSize;
            private Map<String,Object> args;
            private PageVo<T> pageVo;
    
            public SqlReCreateFactory(String sql, Integer page, Integer pageSize, Map<String, Object> args) {
                this.sql = sql;
                this.page = page;
                this.pageSize = pageSize;
                this.args = args;
            }
    
            public String getSql() {
                return sql;
            }
    
            public PageVo<T> getPageVo() {
                return pageVo;
            }
    
            public SqlReCreateFactory invoke() {
                NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate.getDataSource());
                pageVo = new PageVo<>(0, pageSize);
                //String sqlCount = "select count(*) from (" + sql + ")  ";     oracle数据库不需要别名
                String sqlCount = "select count(*) from (" + sql + ") c ";   //mysql数据库需要别名,不然会报 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Every derived table must have its own alias这个错误
                //String sqlCount = getSQLCount(sql); 也可以用这种方式计算总数
                Integer count = namedParameterJdbcTemplate.queryForObject(sqlCount, args, Integer.class); //查询页数
                pageVo.setTotalCount(count);
                pageVo.setCurrentPage(page);
                int pageNum = 0;
                if (count != null && count > 0) {
                    if (count % pageSize == 0) {
                        pageNum = count / pageSize;
                    } else {
                        pageNum = count / pageSize + 1;
                    }
                    pageVo.setPageNum(pageNum);
                }
                //这种方法也可以
                /*Integer pageNum = calTotalPages(pageSize, count);
                pageVo.setPageNum(pageNum);*/
                int pageMin = (page - 1) * pageSize;
                //int pageMax = pageMin + pageSize; oracle是这样的
                int pageMax = pageSize;  //mysql分页是:第一页是select * from users  limit 0,10;第二页是select * from users  limit 10,10;
                args.put("pagemin",pageMin);
                args.put("pagemax",pageMax);
                //sql = "select p.* from (select t.* ,rownum rownumber from  (" +sql+ ") t) p where p.rownumber>:pagemin and p.rownumber<=:pagemax ";oracle数据库是这样的
                sql =  sql + "limit :pagemin,:pagemax " ;  //mysql数据库是这样的
                return this;
            }
        }
    
        /**
         * 获得计算总数的sql
         * @param sql
         * @return
         */
        public String getSQLCount(String sql) {
            String sqlBak = sql.toLowerCase();
            String searchValue = " from ";
            String sqlCount = "select count(*) from " + sql.substring(sqlBak.indexOf(searchValue) + searchValue.length(), sqlBak.length());
            return sqlCount;
        }
    
        // 计算总页数
        public Integer calTotalPages(int numPerPage, int totalRows) {
            if (totalRows % numPerPage == 0) {
                return totalRows / numPerPage;
            } else {
                return (totalRows / numPerPage) + 1;
            }
        }
    
        // 计算总页数
       /* public void setTotalPages(int numPerPage, int totalRows) {
            if (totalRows % numPerPage == 0) {
                this.totalPages = totalRows / numPerPage;
            } else {
                this.totalPages = (totalRows / numPerPage) + 1;
            }
        }*/
    }

    2.2.7 service

    2.2.7.1 JdbcTemplateService.class

    package com.springdataJpa.mysql.service;
    
    import com.springdataJpa.mysql.model.Users;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.jdbc.core.BatchPreparedStatementSetter;
    import org.springframework.jdbc.core.BeanPropertyRowMapper;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.stereotype.Service;
    
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    import java.util.List;
    
    /**
     * @date 2018/6/26
     */
    @Service
    public class JdbcTemplateService {
    
        @Autowired
        JdbcTemplate jdbcTemplate;
    
        /**
         * 添加用户
         *
         * @param users
         * @return
         */
        public Integer add(Users users) {
            String insertSql = "insert into users(id,user_name,age,sex) values (?,?,?,?)";
            int count = jdbcTemplate.update(insertSql, new Object[]{users.getId(), users.getUserName(), users.getAge(), users.getSex()});
            return count;
        }
    
        /**
         * 更新用户
         *
         * @param users
         * @return
         */
        public Integer update(Users users) {
            String updateSql = "update users u set u.user_name = ? where u.id = ? ";
            int count = jdbcTemplate.update(updateSql, new Object[]{users.getUserName(), users.getId()});
            return count;
        }
    
        /**
         * 删除用户
         *
         * @param users
         * @return
         */
        public Integer delete(Users users) {
            String deleteSql = "delete from users where id = ? ";
            int count = jdbcTemplate.update(deleteSql, new Object[]{users.getId()});
            return count;
        }
    
        /**
         * 批量添加用户
         *
         * @param users
         * @return
         */
        public int[] adds(List<Users> users) {
            final List<Users> tempUsers = users;
            String insertsSql = "insert into users(id,user_name,age,sex,status) values (?,?,?,?,?)";
            int[] ints = jdbcTemplate.batchUpdate(insertsSql, new BatchPreparedStatementSetter() {
                @Override
                public void setValues(PreparedStatement ps, int i) throws SQLException {
                    String id = tempUsers.get(i).getId();
                    String userName = tempUsers.get(i).getUserName();
                    Integer age = tempUsers.get(i).getAge();
                    String sex = tempUsers.get(i).getSex();
                    String status = tempUsers.get(i).getStatus();
                    ps.setString(1, id);
                    ps.setString(2, userName);
                    ps.setInt(3, age);
                    ps.setString(4, sex);
                    ps.setString(5, status);
                }
    
                @Override
                public int getBatchSize() {
                    return tempUsers.size();
                }
            });
            return ints;
        }
    
        /**
         * 查询列表
         *
         * @return
         */
        public List<Users> usersQuery() {
            List<Users> users = null;
            String querySql = "select * from users";
            try {
                users = jdbcTemplate.query(querySql, new BeanPropertyRowMapper<Users>(Users.class));
            } catch (Exception e) {
                e.printStackTrace();
            }
            return users;
        }
    
    }

    2.2.7.2 PaginationService.class

    package com.springdataJpa.mysql.service;
    
    import com.springdataJpa.mysql.dto.UsersQuery;
    import com.springdataJpa.mysql.model.Users;
    import com.springdataJpa.mysql.util.Lang;
    import com.springdataJpa.mysql.util.Pagination;
    import com.springdataJpa.mysql.vo.PageVo;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    /**
     * @author luoxianwei
     * @date 2018/6/26
     */
    @Service
    @Slf4j
    public class PaginationService {
        @Autowired
        private Pagination pagination;
    
        /**
         * 分页查询(不带条件)
         *
         * @param pageSize
         * @param pageNumber
         * @return
         */
        public PageVo<Users> usersList(int pageSize, int pageNumber) {
            PageVo<Users> usersPageVo = null;
            Map<String, Object> sqlList = usersListSql();
            try {
                usersPageVo = pagination.query(String.valueOf(sqlList.get("sql")), Users.class, pageNumber, pageSize, ((List) sqlList.get("list")).toArray());
            } catch (Exception e) {
                e.printStackTrace();
            }
            return usersPageVo;
        }
    
        /**
         * 列表查询Sql
         *
         * @return
         */
        public Map<String, Object> usersListSql() {
            StringBuffer sql = new StringBuffer();
            sql.append(" select * from users u ");
    
            List<Object> list = new ArrayList<Object>();
            log.info("列表查询Sql===》:{}", sql.toString());
            Map<String, Object> map = new HashMap<>();
            map.put("sql", sql.toString());
            map.put("list", list);
            return map;
        }
    
        /**
         * 分页查询(带条件不带In)
         *
         * @param pageSize
         * @param pageNumber
         * @return
         */
        public PageVo<Users> usersQueryList(int pageSize, int pageNumber, UsersQuery usersQuery) {
            PageVo<Users> usersPageVo = null;
            Map<String, Object> sqlList = usersQueryListSql(usersQuery);
            try {
                usersPageVo = pagination.query(String.valueOf(sqlList.get("sql")), Users.class, pageNumber, pageSize, ((List) sqlList.get("list")).toArray());
            } catch (Exception e) {
                e.printStackTrace();
            }
            return usersPageVo;
        }
    
        /**
         * 列表查询Sql
         *
         * @return
         */
        public Map<String, Object> usersQueryListSql(UsersQuery usersQuery) {
            StringBuffer sql = new StringBuffer();
            sql.append(" select * from users u where u.is_delete = 0 ");
            List<Object> list = new ArrayList<>();
            if (!Lang.isEmpty(usersQuery.getUserName())) {
                sql.append(" and u.user_name = ? ");
                list.add(usersQuery.getUserName());
            }
            if (!Lang.isEmpty(usersQuery.getAge())) {
                sql.append(" and u.age = ? ");
                list.add(usersQuery.getAge());
            }
            if (!Lang.isEmpty(usersQuery.getSex())) {
                sql.append(" and u.sex = ? ");
                list.add(usersQuery.getSex());
            }
    
            log.info("列表查询Sql===》:{}", sql.toString());
            Map<String, Object> map = new HashMap<>();
            map.put("sql", sql.toString());
            map.put("list", list);
            return map;
        }
    
    }

    2.2.7.3 JdbcTemplatePageService.class

    package com.springdataJpa.mysql.service;
    
    import com.springdataJpa.mysql.dto.UsersQuery;
    import com.springdataJpa.mysql.model.Users;
    import com.springdataJpa.mysql.util.JdbcTemplatePage;
    import com.springdataJpa.mysql.util.Lang;
    import com.springdataJpa.mysql.vo.PageVo;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    /**
     * @author luoxianwei
     * @date 2018/6/26
     */
    @Service
    @Slf4j
    public class JdbcTemplatePageService {
    
        @Autowired
        private JdbcTemplatePage jdbcTemplatePage;
    
        /**
         * 分页查询(带条件带In)
         *
         * @param pageSize
         * @param pageNumber
         * @return
         */
        public PageVo<Users> usersQueryInList(int pageSize, int pageNumber, UsersQuery usersQuery) {
            PageVo<Users> usersPageVo = null;
            Map<String, Object> sqlList = usersQueryInListSql(usersQuery);
            try {
                usersPageVo = jdbcTemplatePage.query(String.valueOf(sqlList.get("sql")), Users.class, pageNumber, pageSize, (Map<String, Object>) sqlList.get("params"));
            } catch (Exception e) {
                e.printStackTrace();
            }
            return usersPageVo;
        }
    
        /**
         * 列表查询Sql
         *
         * @return
         */
        public Map<String, Object> usersQueryInListSql(UsersQuery usersQuery) {
            StringBuffer sql = new StringBuffer();
            sql.append(" select * from users u where u.is_delete = 0 ");
    
            Map<String, Object> params = new HashMap<String, Object>();
            if (!Lang.isEmpty(usersQuery.getUserName())) {
                sql.append(" and u.user_name = :username "); //别名要小些,因为后面sql都转换为小写
                params.put("username", usersQuery.getUserName());
            }
            if (!Lang.isEmpty(usersQuery.getAge())) {
                sql.append(" and u.age = :age ");
                params.put("age", usersQuery.getAge());
            }
            if (!Lang.isEmpty(usersQuery.getSex())) {
                sql.append(" and u.sex = :sex ");
                params.put("sex", usersQuery.getSex());
            }
            List<Object> list = new ArrayList<>();
            if (!Lang.isEmpty(usersQuery.getStatus())) {
                String[] status = usersQuery.getStatus().split(",");
                for (String statu : status) {
                    list.add(statu);
                }
                sql.append(" and u.status in (:status) ");
                params.put("status", list);
            }
    
            log.info("列表查询Sql===》:{}", sql.toString());
            Map<String, Object> map = new HashMap<>();
            map.put("sql", sql.toString());
            map.put("params", params);
            return map;
        }
    }

    2.2.8 test

    package com.springdataJpa.mysql.test;
    
    
    import com.springdataJpa.mysql.MysqlJdbcTemplateApplication;
    import com.springdataJpa.mysql.dto.UsersQuery;
    import com.springdataJpa.mysql.model.Users;
    import com.springdataJpa.mysql.service.JdbcTemplatePageService;
    import com.springdataJpa.mysql.service.JdbcTemplateService;
    import com.springdataJpa.mysql.service.PaginationService;
    import com.springdataJpa.mysql.vo.PageVo;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.UUID;
    
    /**
     * @author luoxianwei
     * @date 2018/6/26
     */
    @SpringBootTest(classes = MysqlJdbcTemplateApplication.class)
    @RunWith(SpringRunner.class)
    public class UsersTest {
    
        @Autowired
        JdbcTemplateService jdbcTemplateService;
        @Autowired
        PaginationService paginationService;
        @Autowired
        JdbcTemplatePageService jdbcTemplatePageService;
    
        /**
         * 添加用户
         */
        @Test
        public void addUsers() {
            Users users = new Users();
            String id = UUID.randomUUID().toString();
            users.setId(id);
            users.setUserName("张三");
            users.setAge(20);
            users.setSex("男");
            Integer count = jdbcTemplateService.add(users);
            System.out.println("成功插入:" + count);
        }
    
        /**
         * 更新用户
         */
        @Test
        public void updateUsers() {
            Users users = new Users();
            users.setId("0458ec1d-789a-4725-b5f6-8a381446fbf0");
            users.setUserName("李四");
            Integer count = jdbcTemplateService.update(users);
            System.out.println("成功修改:" + count);
        }
    
        /**
         * 删除用户
         */
        @Test
        public void deleteUsers() {
            Users users = new Users();
            users.setId("0458ec1d-789a-4725-b5f6-8a381446fbf0");
            Integer count = jdbcTemplateService.delete(users);
            System.out.println("成功删除:" + count);
        }
    
        /**
         * 批量添加用户
         */
        @Test
        public void addsUsers() {
            List<Users> users = new ArrayList<Users>();
            for (int i = 0; i < 1000; i++) {
                Users users1 = new Users();
                String uuid = UUID.randomUUID().toString();
                users1.setId(uuid);
                users1.setUserName(uuid.substring(2, 5));
                users1.setAge(20);
                users1.setSex("男");
                if (i < 200) {
                    users1.setStatus("1");
                    users1.setSex("男");
                    users1.setAge(20);
                } else if (i < 500) {
                    users1.setStatus("2");
                    users1.setSex("男");
                    users1.setAge(20);
                } else if (i < 700) {
                    users1.setStatus("3");
                    users1.setSex("女");
                    users1.setAge(18);
                } else {
                    users1.setStatus("4");
                    users1.setSex("女");
                    users1.setAge(18);
                }
                users.add(users1);
            }
            int[] adds = jdbcTemplateService.adds(users);
            System.out.println("批量添加:" + adds.length);
        }
    
        /**
         * 查询列表
         */
        @Test
        public void usersQuery() {
            List<Users> users = jdbcTemplateService.usersQuery();
            System.out.println("成功查询:" + users.size() + "条");
        }
    
        /**
         * 分页查询(不带条件)
         */
        @Test
        public void usersList() {
            PageVo<Users> usersPageVo = paginationService.usersList(10, 2);
            System.out.println("成功分页查询:" + usersPageVo.getResult().size() + "条");
        }
    
        /**
         * 分页查询(带条件不带In)
         */
        @Test
        public void usersQueryList() {
            UsersQuery usersQuery = new UsersQuery();
            usersQuery.setSex("男");
            usersQuery.setAge(20);
            PageVo<Users> pageVo = paginationService.usersQueryList(10, 1, usersQuery);
            System.out.println("成功分页查询:" + pageVo.getTotalCount() + "条");
        }
    
        /**
         * 分页查询(带条件带In)
         */
        @Test
        public void usersQueryInList() {
            UsersQuery usersQuery = new UsersQuery();
            usersQuery.setSex("男");
            usersQuery.setAge(20);
            usersQuery.setStatus("1,2");
            PageVo<Users> pageVo = jdbcTemplatePageService.usersQueryInList(10, 1, usersQuery);
            System.out.println("成功分页查询:" + pageVo.getTotalCount() + "条");
        }
    }
  • 相关阅读:
    606. Construct String from Binary Tree
    696. Count Binary Substrings
    POJ 3255 Roadblocks (次短路)
    POJ 2823 Sliding Window (单调队列)
    POJ 1704 Georgia and Bob (博弈)
    UVa 1663 Purifying Machine (二分匹配)
    UVa 10801 Lift Hopping (Dijkstra)
    POJ 3281 Dining (网络流之最大流)
    UVa 11100 The Trip, 2007 (题意+贪心)
    UVaLive 4254 Processor (二分+优先队列)
  • 原文地址:https://www.cnblogs.com/jcjssl/p/9436622.html
Copyright © 2011-2022 走看看