JPA的基本注解
@Entity:修饰实体类,指明该类将映射到指定的数据表,例如:Customer类默认的数据表名为 customer
@Table:当实体类与映射的数据库表名不同名时需要使用@Table 注解,该注解与@Entity注解并列使用,使用其name属性指明数据库的表名
@Id :标识该属性为主键,一般标注在该属性的 getter 方法上
@GeneratedValue :标注主键的生成策略,通过其 strategy 属性。通常与@Id注解一起使用。默认情况下 JPA 会自动选择一个最适合底层数据库的主键生成策略,MySQL 默认为 AUTO,常用策略有:
–IDENTITY:采用数据库 ID自增长的方式来自增主键字段,Oracle 不支持这种方式;
–AUTO: JPA自动选择合适的策略,是默认选项;
–SEQUENCE:通过序列产生主键,通过 @SequenceGenerator 注解指定序列名,MySql 不支持这种方式
–TABLE:通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植
@Basic :用于没有任何标注的 getXxx() 方法,默认即为 @Basic,所以若一个 getter 方法无任何注解,可以使用 @Basic 注解,也可以不使用
@Column :当实体的属性与其映射的数据表的列不同名时使用,一般用于 getter 方法上。其 name 属性用来指明此属性在数据表中对应的列名;unique 属性指明是否为唯一约束;nullable 属性用来指明是否可以为空,false 为不能为空;length 属性指明此列的长度。
1.引入依赖
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>jpa</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>jpa</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>8.0.11</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.9</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.yml配置
server:
port: 8989
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://127.0.0.1:3306/master?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
username: root
password: 123
jpa:
show-sql: true #显示打印sql
database: mysql #数据库是mysql
hibernate:
ddl-auto: update #没有先创建再更新
3.创建实体类
package com.example.jpa.entity;
import javax.persistence.*;
/**
* @Entity表示该类是一个实体类,在项目启动是会根据该类自动生成一张表,
* 表的名称即@Entity注解中的name值,如果不配置name,默认名为类名
*/
@Entity(name = "t_book")
public class Book {
/**
* @Id表示该属性是一个主键。
* @GeneratedValue注解表示主键自动生成,strategy则表示主键的生成策略
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
/**
* 默认情况下,生成的表中的字段的名称就是实体类中属性的名称,
* 通过@Column注解可以定制生成的字段的属性
* name表示该属性对应的数据表中字段的名称,
* nullable表示该字段非空
*/
@Column(name = "book_name",nullable = false)
private String name;
private String author;
private Float price;
/**
* @Transient注解表示在生成数据库的表时,该属性被忽略,即不生成对应的字段
*/
@Transient
private String description;
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 String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public Float getPrice() {
return price;
}
public void setPrice(Float price) {
this.price = price;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@Override
public String toString() {
return "Book{" +
"id=" + id +
", name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
", description='" + description + '\'' +
'}';
}
}
4.创建DAO接口继承JpaRepository接口
package com.example.jpa.dao;
import com.example.jpa.entity.Book;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import java.util.List;
public interface BookDao extends JpaRepository<Book,Integer> {
//查询以某个字符开始的所有书
List<Book> getBooksByAuthorStartingWith(String author);
//查询单价大于某个值的所有书
List<Book> getBooksByPriceGreaterThan(Float price);
@Query(value = "select * from t_book where id = (select max(id) from t_book)",nativeQuery = true)
Book getMaxIdBook();
@Query(value = "select b from t_book b where b.id > :id and b.author = :author")
List<Book> getBookByIdAndAuthor(@Param("author") String author,@Param("id")Integer id);
@Query("select b from t_book b where b.id < ?2 and b.name like %?1%")
List<Book> getBookByIdAndName(String name,Integer id);
}
5.创建service
package com.example.jpa.service;
import com.example.jpa.dao.BookDao;
import com.example.jpa.entity.Book;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class BookService {
@Autowired
BookDao bookDao;
public Page<Book> getBookByPage(PageRequest pageable) {
return bookDao.findAll(pageable);
}
public List<Book> getBookByIdAndAuthor(String author, int id) {
return bookDao.getBookByIdAndAuthor(author,id);
}
public List<Book> getBookByAuthorStartingWith(String author) {
return bookDao.getBooksByAuthorStartingWith(author);
}
public List<Book> getBookByIdAndName(String name, int id) {
return bookDao.getBookByIdAndName(name,id);
}
public List<Book> getBooksByPriceGreaterThan(float price) {
return bookDao.getBooksByPriceGreaterThan(price);
}
public Book getMaxIdBook() {
return bookDao.getMaxIdBook();
}
public void addBook(Book book) {
bookDao.save(book);
}
}
6.创建controller
package com.example.jpa.controller;
import com.example.jpa.entity.Book;
import com.example.jpa.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class BookController {
@Autowired
BookService bookService;
@GetMapping("/findAll")
public void findAll(){
PageRequest pageable = PageRequest.of(2,3);
Page<Book> page = bookService.getBookByPage(pageable);
System.out.println("总页数:" + page.getTotalPages());
System.out.println("总记录数:" + page.getTotalElements());
System.out.println("查询结果:" + page.getContent());
System.out.println("当前页数:" + page.getNumber() + 1);
System.out.println("当前页记录数:" + page.getNumberOfElements());
System.out.println("每页记录数:" + page.getSize());
}
@GetMapping("/search")
public void search(){
List<Book> bs1 = bookService.getBookByIdAndAuthor("鲁迅",7);
List<Book> bs2 = bookService.getBookByAuthorStartingWith("吴");
List<Book> bs3 = bookService.getBookByIdAndName("西",8);
List<Book> bs4 = bookService.getBooksByPriceGreaterThan(30F);
Book b = bookService.getMaxIdBook();
System.out.println("bs1:" + bs1);
System.out.println("bs2:" + bs2);
System.out.println("bs3:" + bs3);
System.out.println("bs4:" + bs4);
System.out.println("b:" + b);
}
@GetMapping("/save")
public void save(){
Book book = new Book();
book.setAuthor("鲁迅");
book.setName("呐喊");
book.setPrice(23F);
bookService.addBook(book);
}
}
生成的表格