SpringBoot 整合 SpringDataJPA的步骤
- 在SpringBoot项目的pom.xml文件中引入依赖
<!-- MySQL 连接驱动依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- Spring Boot JPA 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
- 在application.properties配置文件中配置SpringDataJPA
########################################################
### 配置数据源
########################################################
spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.url = jdbc:mysql://localhost:3306/***
spring.datasource.username = ***
spring.datasource.password = ***
########################################################
### 解决乱码问题
########################################################
spring.http.encoding.force=true
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
server.tomcat.uri-encoding=UTF-8
########################################################
### Spring Data JPA配置
########################################################
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
### 运行时输出jpa执行的sql语句
spring.jpa.show-sql=true
### spring-boot-starter-data-jpa自动映射创建表动作 配置: 有表更新,无表创建
spring.jpa.hibernate.ddl-auto=update
- 在src/main/java目录下的entity包中创建实体类
例:在entity包中创建一个实体类
说明:entity包要和SpringBoot启动类同级
table的字段和entity的属性对应方式:student_id
对应studentId
import java.util.Date;
import java.io.Serializable;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import org.springframework.format.annotation.DateTimeFormat;
@Entity
@Table(name="student")//数据库的表名,如果数据库中没有此表,可自动生成
@JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" })//标不需要转化为json的属性
public class Student implements Serializable{
private static final long serialVersionUID = 1L;
@Id //实体类的主键
@GeneratedValue(strategy = GenerationType.IDENTITY) //自动增长列
private Integer studentId;
private String studentName;
private Integer studentAge;
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") //格式化日期类型
private Date studentBirthday; //学生出生年月
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(Integer studentId, String studentName, Integer studentAge, Date studentBirthday) {
super();
this.studentId = studentId;
this.studentName = studentName;
this.studentAge = studentAge;
this.studentBirthday = studentBirthday;
}
public Integer getStudentId() {
return studentId;
}
public void setStudentId(Integer studentId) {
this.studentId = studentId;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public Integer getStudentAge() {
return studentAge;
}
public void setStudentAge(Integer studentAge) {
this.studentAge = studentAge;
}
public Date getStudentBirthday() {
return studentBirthday;
}
public void setStudentBirthday(Date studentBirthday) {
this.studentBirthday = studentBirthday;
}
@Override
public String toString() {
return "Student [studentId=" + studentId + ", studentName=" + studentName + ", studentAge=" + studentAge
+ ", studentBirthday=" + studentBirthday + "]";
}
}
- 在repository包下创建Repository接口,并继承 JpaRepository接口
例:在repository包中创建一个StudentRepository接口
说明:repository包要和SpringBoot启动类同级,repository层即dao层
import org.springframework.data.jpa.repository.JpaRepository;
/**
* JpaRepository<T, ID>中的T:实体类的类型、ID:主键的数据类型
*
*/
public interface StudentRepository extends JpaRepository<Student, Integer>{
}
- 在controller包下创建Controller类
例:在controller包中创建一个StudentController接口
说明:entity包要和SpringBoot启动类同级
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class StudentController {
//自动注入StudentRepository接口
@Autowired
private StudentRepository repository;
@RequestMapping("/insert")
public Object insert(Student student) {
// 调用StudentRepository中默认的的save方法
student = repository.save(student);
return student;
}
}
- 在SpringBoot启动类上添加@EnableJpaRepositories注解
说明:@EnableJpaRepositories:注解用于 Srping Data JPA 的代码配置,用于取代 xml 形式的配置文件
例:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
@EnableJpaRepositories
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
- 启动项目测试
在浏览器中访问:http://localhost:8080/insert?studentName=小明&studentAge=18&studentBirthday=2000-08-13 11:21:30
实体类中常用的注解
-
@Entity
:标记在类名上面,作为实体类的标识 -
@Table
:当实体类与其映射的数据库表名不相同时需要使用 @Table注解 说明,该注解与 @Entity注解 并列使用,置于实体类声明语句之前,可写于单独语句行,也可与声明语句同行。 @Table注解 的常用选项是 name,用于指明数据库的表名。 @Table注解 还有一个两个选项 catalog 和 schema 用于设置表所属的数据库目录或模式,通常为数据库名。uniqueConstraints 选项用于设置约束条件,通常不须设置 -
@Id
:设置对象表示符,标识的实体类的属性映射对应表中的主键 -
@GeneratedValue
:设置标识符的生成策略,常与 @Id注解 一起使用。参数:strategy 指定具体的生成策略
方式一:@GeneratedValue(strategy=GenerationType.AUTO) 也是默认策略, 即写成@GeneratedValue 也可;类似 Hibernate 的 native 策略,生成方式取决于底层的数据库
方式二:
@GeneratedValue(strategy = GenerationType.IDENTITY)指定 自动增长 策略,适用于 MySQL
方式三:
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = “seqtblperson”)指定 序列 策略,常用于 Oracle,其中 generator 表示生成器的名字。而且还要指定@SequenceGenerator(name =
“seqtblperson”, sequenceName = “seqtblperson”, allocationSize = 1)注解配合使用。其中 name 指定生成器的名字(与 generator 的值一样),sequenceName 指定数据库中定义序列的名字,allocationSize 指定序列每次增长 1 -
@Column
:描述数据库表中该字段的定义,具有以下属性:
name:表示数据库表中该字段的名称,默认情形属性名称一致
nullable:表示该字段是否允许为 null,默认为 true
unique:表示该字段是否是唯一标识,默认为 false
length:表示该字段的大小,仅对 String类型 的字段有效
insertable:表示在 ORM 框架执行插入操作时,该字段是否应出现 INSETRT 语句中,默认为 true
updateable:表示在 ORM 框架执行更新操作时,该字段是否应该出现在 UPDATE 语句中,默认为 true
columnDefinition:表示该字段在数据库中的实际类型。通常 ORM 框架可以根据属性类型自动判断数据库中字段的类型,但是对于 Date 类型仍无法确定数据库中字段类型究竟是 DATE,TIME 还是
TIMESTAMP -
@OrderBy
:在加载数据的时候可以为其指定顺序 -
@Transient
:表示该属性并非一个到数据库表的字段的映射,ORM 框架将忽略该属性。如果一个属性并非数据库表的字段映射。就务必将其标示为@Transient。否则,ORM 框架默认其注解为@Basic