天天看點

第11章—使用對象關系映射持久化資料—SpringBoot+SpringData+Jpa進行查詢修改資料庫SpringBoot+SpringData+Jpa進行查詢修改資料庫

SpringBoot+SpringData+Jpa進行查詢修改資料庫

JPA由EJB 3.0軟體專家組開發,作為JSR-220實作的一部分。但它又不限于EJB 3.0,你可以在Web應用、甚至桌面應用中使用。JPA的宗旨是為POJO提供持久化标準規範,由此可見,經過這幾年的實踐探索,能夠脫離容器獨立運作,友善開發和測試的理念已經深入人心了。Hibernate3.2+、TopLink 10.1.3以及

OpenJPA

都提供了JPA的實作。

JPA的總體思想和現有Hibernate、TopLink、JDO等ORM架構大體一緻。總的來說,JPA包括以下3方面的技術:

ORM映射中繼資料

JPA支援XML和

JDK

5.0注解兩種中繼資料的形式,中繼資料描述對象和表之間的映射關系,架構據此将實體

對象持久化

到資料庫表中;

API

用來操作實體對象,執行CRUD操作,架構在背景替代我們完成所有的事情,開發者從繁瑣的JDBC和SQL代碼中解脫出來。

查詢語言

這是持久化操作中很重要的一個方面,通過

面向對象

而非面向資料庫的查詢語言查詢資料,避免程式的SQL語句緊密耦合。

例子:SpringBoot+SpringData+Jpa

這裡我的Demo的結構圖如下:

第11章—使用對象關系映射持久化資料—SpringBoot+SpringData+Jpa進行查詢修改資料庫SpringBoot+SpringData+Jpa進行查詢修改資料庫

ddf.gif

相關的代碼如下:

pom.xml:

<?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.beacon</groupId>
    <artifactId>springdata-jpa</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </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-web</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-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <!--資料庫元件-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <!--資料庫元件-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.10</version>
        </dependency>
        <!--//添加AOP-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <!-- Spring boot 引用Thymeleaf模闆依賴包(Thymeleaf模闆如果不适用,這裡也可以不添加這段配置,Thymeleaf模闆使用在下面會講到) -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

    </dependencies>

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

StudentController:

package com.example.springdatajpa.controller;

import com.example.springdatajpa.entity.Student;
import com.example.springdatajpa.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class StudentController {

    @Autowired
    private StudentService studentService;

    @GetMapping("/getAllStu")
    public List<Student> getAllStu(){

        return studentService.findAll();


    }

    @GetMapping("/findById/{id}")
    public Student findById(@PathVariable("id")Integer id){

        return studentService.findById(id);


    }


    //根據money查詢 再根據age排序
    @GetMapping("/findByMoney/{money}")
    public List<Student> findByMoney(@PathVariable("money")Integer money,Integer age){

        return studentService.findByMoneyOrAgeOrderByAgeDesc(money,age);


    }


    @GetMapping("/findByName/{name}")
    public Student findByNameIgnoresCase(@PathVariable("name")String name){

        return studentService.findByName(name);


    }
}

           

StudentDao:

package com.example.springdatajpa.dao;

import com.example.springdatajpa.entity.Student;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface StudentDao extends JpaRepository<Student,Object> {
    Student findById(Integer id);
    public List<Student> findByMoneyOrAgeOrderByAgeDesc(Integer money, Integer age) ;
    Student findByName(String name);
}
           

Student:

package com.example.springdatajpa.entity;



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

@Entity
@Table(name="student")
public class Student {


    private Integer id;
    private String name;
    private Integer age;
    private String password;
    private Integer money;




    //注意:這裡一定要在主鍵的get方法上加上這兩個注解
    //  @Id
    //  @GeneratedValue
    // 不然會報錯找不到
    @Id
    @GeneratedValue
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getMoney() {
        return money;
    }

    public void setMoney(Integer money) {
        this.money = money;
    }


    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", password='" + password + '\'' +
                ", money=" + money +
                '}';
    }
}

           

StudentService

package com.example.springdatajpa.service;

import com.example.springdatajpa.entity.Student;

import java.util.List;

public interface StudentService {
    List<Student> findAll();

    Student findById(Integer id);

    List<Student> findByMoneyOrAgeOrderByAgeDesc(Integer money, Integer age);


    Student findByName(String name);
}

           

StudentServiceImpl

package com.example.springdatajpa.service.impl;
import com.example.springdatajpa.dao.StudentDao;
import com.example.springdatajpa.entity.Student;
import com.example.springdatajpa.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.PathVariable;
import java.util.List;

@Service
public class StudentServiceImpl  implements StudentService {
    @Autowired
    private StudentDao studentDao;


    @Override
    public List<Student> findAll() {
        return studentDao.findAll();
    }

    @Override
    public Student findById(Integer id) {
        return studentDao.findById(id);
    }

    @Override
    public List<Student> findByMoneyOrAgeOrderByAgeDesc(Integer money, Integer age) {
        return studentDao.findByMoneyOrAgeOrderByAgeDesc(money,age);
    }

    @Override
    public Student findByName(String name) {
        return studentDao.findByName(name);
    }

}
           

application.yml:

server:
  port: 8089
spring:
  datasource:
        url: jdbc:mysql://localhost:3306/test?useSSL=false
        username: root
        password: root
        driver-class-name: com.mysql.jdbc.Driver
        type: com.alibaba.druid.pool.DruidDataSource
        initialSize: 20
        minIdle: 50
        maxActive: 80
        maxWait: 10000
        timeBetweenEvictionRunsMillis: 60000
        minEvictableIdleTimeMills: 300000
  jpa:
    hibernate:
     ddl-auto: update
    generate-ddl: true
    show-sql: true

#    thymeleaf
  thymeleaf:
    prefix: classpath:templates/
    suffix: .html
    mode: HTML5
    encoding: utf-8
    servlet:
      content-type: text/html
    cache: false

           

這裡我們可以使用的是JPA的定義查詢,相應的方法名的規則如下:

第11章—使用對象關系映射持久化資料—SpringBoot+SpringData+Jpa進行查詢修改資料庫SpringBoot+SpringData+Jpa進行查詢修改資料庫

image.png

相應的示範如下:

通路:

http://localhost:8089/getAllStu
第11章—使用對象關系映射持久化資料—SpringBoot+SpringData+Jpa進行查詢修改資料庫SpringBoot+SpringData+Jpa進行查詢修改資料庫
http://localhost:8089/findByMoney/9(

這個地方可以把相應的資料查出來并按照相應的字段進行排序)

第11章—使用對象關系映射持久化資料—SpringBoot+SpringData+Jpa進行查詢修改資料庫SpringBoot+SpringData+Jpa進行查詢修改資料庫