springboot2.1.0、JPA简单使用

该篇章主要讲解jpa的一些简单使用

一)在pom.xml引入jpa对应的jar

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.oysept.springboot</groupId>
    <artifactId>oysept-springboot-jpa</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>oysept-springboot-jpa</name>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.0.RELEASE</version>
        <relativePath/>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
		
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
		
        <!-- jpa start -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <!-- jpa end -->
        
        <!-- oracle start -->
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc6</artifactId>
            <version>11.2.0.3</version>
        </dependency>
        <!-- oracle end -->
        
        <!-- json处理jar -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.49</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

 

二)在resources下application.properties中添加oracle支持

server.port=8080

spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@localhost:1521/oysept
spring.datasource.username=oysept
spring.datasource.password=oysept

spring.jpa.database=oracle
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.hibernate.ddl-auto=none

 

三)创建一个Entity类,对应的表创建就不贴出来了,直接在oracle创建一个简单的表即可

package com.oysept.springboot.entity;

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

/**
 * 员工基本信息entity
 * 注意: table的name和column的name都小写,不然在解析对应表关系的时候会出错,比如Oysept_Employee会解析成oysept_employee
 * @author ouyangjun
 */
@Entity
@Table(name = "oysept_employee")
public class EmployeeEntity {
	
    @Id
    @Column(name = "emp_id")
    private String empID;

    @Column(name = "emp_no")
    private String empNO;
	
    @Column(name = "emp_name")
    private String empName;
	
    @Column(name = "status")
    private String status;

    @Column(name = "create_date")
    private String createDate;

    public String getEmpID() {return empID;}
    public void setEmpID(String empID) {this.empID = empID;}

    public String getEmpNO() {return empNO;}
    public void setEmpNO(String empNO) {this.empNO = empNO;}

    public String getEmpName() {return empName;}
    public void setEmpName(String empName) {this.empName = empName;}

    public String getStatus() {return status;}
    public void setStatus(String status) {this.status = status;}

    public String getCreateDate() {return createDate;}
    public void setCreateDate(String createDate) {this.createDate = createDate;}
}

 

四)创建一个Repository操作类

package com.oysept.springboot.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository;

import com.oysept.springboot.entity.EmployeeEntity;

@Repository
public interface EmployeeRepository extends JpaRepository<EmployeeEntity, String>, JpaSpecificationExecutor<EmployeeEntity>{
	
    // 根据empID查询员工信息,empID和entity的属性要一样
    public EmployeeEntity findByEmpID(String empID);
}

 

五)创建一个DTO,该DTO和Entity属性一致,主要是做数据转换,返回给前端使用

package com.oysept.springboot.dto;

import java.io.Serializable;

/**
 * 员工DTO,注意用于参数传递,数据转换,把entity隐藏不暴露,和entity查不多
 * @author ouyangjun
 */
public class EmployeeDTO implements Serializable {
    
	private static final long serialVersionUID = 1L;

    private String empID;
    private String empNO;
    private String empName;
    private String status;
    private String createDate;

    public String getEmpID() {return empID;}
    public void setEmpID(String empID) {this.empID = empID;}

    public String getEmpNO() {return empNO;}
    public void setEmpNO(String empNO) {this.empNO = empNO;}

    public String getEmpName() {return empName;}
    public void setEmpName(String empName) {this.empName = empName;}

    public String getStatus() {return status;}
    public void setStatus(String status) {this.status = status;}

    public String getCreateDate() {return createDate;}
    public void setCreateDate(String createDate) {this.createDate = createDate;}
}

 

六)创建一个数据转换工具类,主要是把数据转换成对应的DTO

package com.oysept.springboot.utils;

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

import com.alibaba.fastjson.JSONObject;

public class ObjectConvertUtils {

    /**
     * List<Map<Object,Object>>转换List<T>
     * @param map
     * @param beanClass
     * @return
     * @throws Exception
     */
    public static <T> List<T> castMapToBean(List<Map<Object, Object>> list, Class<T> beanClass) {
        List<T> returnList = new ArrayList<T>();
        if (list == null || list.size()==0) {
            return returnList;
        }
        
        String json = "";
        for (Map<Object, Object> map : list) {
            json = JSONObject.toJSONString(map);
        	
            // 添加到集合中
            returnList.add(JSONObject.parseObject(json, beanClass));
        }
        // 返回
        return returnList;
    }
}

 

七)创建一个Controller类,该类主要测试使用

package com.oysept.springboot.controller;

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

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

import org.hibernate.query.internal.NativeQueryImpl;
import org.hibernate.transform.Transformers;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.ExampleMatcher;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.oysept.springboot.dto.EmployeeDTO;
import com.oysept.springboot.entity.EmployeeEntity;
import com.oysept.springboot.repository.EmployeeRepository;
import com.oysept.springboot.utils.ObjectConvertUtils;

/**
 * 员工controller
 * @author ouyangjun
 */
@RestController
@RequestMapping(value="/employee")
public class EmployeeController {
	
    @Autowired
    private EmployeeRepository employeeRepository;
	
    // 自定义原生sql工具类
    @PersistenceContext
    EntityManager entityManager;
	
    /**
     * 获取所有员工信息
     * 访问地址: http://localhost:8080/employee/list
     * @return
     */
    @RequestMapping(value="/list")
    public List<EmployeeDTO> list(){
        // 查询
        List<EmployeeEntity> entityList = employeeRepository.findAll();
		
        // 数据转换
        List<EmployeeDTO> dtoList = new ArrayList<EmployeeDTO>();
        if (!CollectionUtils.isEmpty(entityList)) {
            entityList.forEach(entity -> {
                EmployeeDTO dto = new EmployeeDTO();
                BeanUtils.copyProperties(entity, dto);
        		
                // 添加到集合中返回
                dtoList.add(dto);
            });
        }
        return dtoList;
    }
	
    /**
     * 获取所有员工信息并分页
     * 访问地址: http://localhost:8080/employee/list/page?page=0&size=10
     * @return
     */
    @RequestMapping(value="/list/page")
    public List<EmployeeDTO> listPage(@RequestParam(value = "page") int page,@RequestParam(value = "size") int size){
		
        // 排序,字段在entity要存在
        Sort sort = new Sort(Sort.Direction.DESC, "empID", "createDate");
        // 拼接条件
        Specification<EmployeeEntity> specification = getEmployeeWhereClause(new EmployeeDTO());
        List<EmployeeEntity> entityList = null;
        
        // 如果分页参数不为空,需要分页展示数据
        if (!StringUtils.isEmpty(page) && !StringUtils.isEmpty(size)) {
            // 分页
            Page<EmployeeEntity> pageAll = employeeRepository.findAll(specification, new PageRequest(page, size, sort));
        	
            // 获取集合数据
            entityList = pageAll.getContent();
        } else {
            entityList = employeeRepository.findAll(specification, sort);
        }
        
        // 数据转换
        List<EmployeeDTO> dtoList = new ArrayList<EmployeeDTO>();
        if (!CollectionUtils.isEmpty(entityList)) {
            entityList.forEach(entity -> {
                EmployeeDTO dto = new EmployeeDTO();
                BeanUtils.copyProperties(entity, dto);
        		
                // 添加到集合中返回
                dtoList.add(dto);
            });
        }
        return dtoList;
    }
	
    // 拼接条件, 该方法只是展示条件的多样性
    public static Specification<EmployeeEntity> getEmployeeWhereClause(EmployeeDTO employeeDTO){
        return new Specification<EmployeeEntity>() {
            @Override
            public Predicate toPredicate(Root<EmployeeEntity> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
                List<Predicate> predicate = new ArrayList<>();
                // 有效员工
                predicate.add(cb.equal(root.get("status"), "0"));
                
                // 方式一: 转换成数组,查询多个,用分号分隔
                Object[] empIDs = employeeDTO.getEmpID().split(";");
                predicate.add(root.get("empID").in(empIDs));
                
                // 员工姓名
                String empName = employeeDTO.getEmpName();
                if (!StringUtils.isEmpty(empName)) {
                    List<Predicate> pred = new ArrayList<>();
                    // 循环
                    for (String name : empName.split(";")) {
                        pred.add(cb.or(
                            cb.like(root.get("empName"), "%"+name+"%")
                        ));
                    }
                    Predicate[] ppp = new Predicate[pred.size()];
                    predicate.add(cb.or(pred.toArray(ppp)));
                }
                Predicate[] pre = new Predicate[predicate.size()];
                return query.where(predicate.toArray(pre)).getRestriction();
            }
        };
    }
	
    /**
     * 根据状态查询员工信息
     * 访问地址: http://localhost:8080/employee/findByEmpDTO?status=0
     * @param status
     * @return
     */
    @RequestMapping(value="/findByEmpDTO", method = RequestMethod.POST)
    public List<EmployeeDTO> findByEmpDTO(@RequestBody EmployeeDTO empDTO){
        // 封装条件
        EmployeeEntity employeeEntity = new EmployeeEntity();
        employeeEntity.setStatus(empDTO.getStatus());
    	
        // 获取信息
        List<EmployeeEntity> entityList = employeeRepository.findAll(Example.of(employeeEntity, ExampleMatcher.matchingAll()));
    	
        // 数据转换
        List<EmployeeDTO> dtoList = new ArrayList<EmployeeDTO>();
        if (!CollectionUtils.isEmpty(entityList)) {
            entityList.forEach(entity -> {
                EmployeeDTO dto = new EmployeeDTO();
                BeanUtils.copyProperties(entity, dto);
        		
                // 添加到集合中返回
                dtoList.add(dto);
            });
        }
        return dtoList;
    }
	
    /**
     * 根据empID账号获取员工信息
     * 访问地址: http://localhost:8080/employee/findByEmpID/oysept
     * @param empID
     * @return
     */
    @RequestMapping(value="/findByEmpID/{empID}", method = RequestMethod.GET)
    public EmployeeDTO findByEmpID(@PathVariable("empID") String empID){
        // 获取信息
        EmployeeEntity entity = employeeRepository.findByEmpID(empID);
    	
        // 复制
        EmployeeDTO employeeDTO = new EmployeeDTO();
        BeanUtils.copyProperties(entity, employeeDTO);
        return employeeDTO;
    }
	
    /**
     * 自定义sql查询数据
     * 访问地址: http://localhost:8080/employee/findByNativeSql?empID=oysept
     * @param empID
     * @return
     */
    @RequestMapping(value="/findByNativeSql", method = RequestMethod.GET)
    public EmployeeDTO findByNativeSql(@RequestParam(value = "empID") String empID){
		
        // 获取服务主单查询sql
        StringBuffer buffer = new StringBuffer();
        buffer.append("select ");
        // 查询字段-----start-----
        buffer.append("emp_id       as empID, ");
        buffer.append("emp_no       as empNO, ");
        buffer.append("emp_name     as empName, ");
        buffer.append("status       as status, ");
        buffer.append("create_date  as createDate ");
        // 查询字段-----end-----
        buffer.append("from oysept_employee where 1=1 ");
        buffer.append("and emp_id = '" + empID + "' ");
				
        // 执行查询sql
        Query query = this.entityManager.createNativeQuery(buffer.toString());
        // 把查询的结果从List<Object[]>转换成List<Map<Object,Object>>
        query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
        List<Map<Object,Object>> objList = query.getResultList();
		
        try {
            List<EmployeeDTO> dtoList = ObjectConvertUtils.castMapToBean(objList, EmployeeDTO.class);
            System.out.println("==>findByNativeSql,dtoList.size(): " + dtoList.size());
            return dtoList.get(0);
        } catch (Exception e) {
            System.out.println("==> findByNativeSql数据转换异常:" + e);
        }
        return null;
    }
}

 

八)创建一个springboot启动类

package com.oysept.springboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * springboot启动类
 * @author ouyangjun
 */
@SpringBootApplication
public class JpaApplication {

    public static void main(String[] args) {
        SpringApplication.run(JpaApplication.class, args);
    }
}

 

九)项目结构图

最后启动JpaApplication,输入Controller中的地址测试,也可以下载Postman等测试工具测试。

 

识别二维码关注个人微信公众号


 本章完结,待续,欢迎转载!
 
本文说明:该文章属于原创,如需转载,请标明文章转载来源!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值