• 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() + "条");
        }
    }
  • 相关阅读:
    paip.关于动画特效原理 html js 框架总结
    paip.utf-8,unicode编码的本质输出unicode文件原理 python
    paip.多维理念 输入法的外码输入理论跟文字输出类型精髓
    paip.前端加载时间分析之道优化最佳实践
    paip.输入法编程--英文ati化By音标原理与中文atiEn处理流程 python 代码为例
    paip.导入数据英文音标到数据库mysql为空的问题之道解决原理
    paip.元数据驱动的转换-读取文件行到个list理念 uapi java php python总结
    paip.python3 的类使用跟python2 的不同之处
    paip.日志中文编码原理问题本质解决python
    paip.性能跟踪profile原理与架构与本质-- python扫带java php
  • 原文地址:https://www.cnblogs.com/jcjssl/p/9436622.html
Copyright © 2020-2023  润新知