虽然最近一直在用springboot框架,但还是觉得不太熟悉,所以决定通过手动实践来学习基础的使用。这一篇是介绍springboot简单整合jpa的教程,jpa不需要和mybatis一样去建表。
准备工作
首先给大家看一下application.properties文件代码
##端口号
server.port=8888
##数据库配置
##数据库地址
spring.datasource.url=jdbc:mysql://localhost:3306/springboot_test?characterEncoding=utf8&useSSL=false
##数据库用户名
spring.datasource.username=root
##数据库密码
spring.datasource.password=root
##数据库驱动
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
##validate 加载hibernate时,验证创建数据库表结构
##create 每次加载hibernate,重新创建数据库表结构,这就是导致数据库表数据丢失的原因。
##create-drop 加载hibernate时创建,退出是删除表结构
##update 加载hibernate自动更新数据库结构
##validate 启动时验证表的结构,不会创建表
##none 启动时不做任何操作
spring.jpa.hibernate.ddl-auto=create
spring.jpa.show-sql=true
pom文件
<?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.ooliuyue</groupId>
<artifactId>springboot_swagger</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>springboot_swagger</name>
<description>springboot_swagger</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.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-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.2.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
实体类User
package com.ooliuyue.springboot_swagger.entity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import javax.persistence.*;
/**
* @Auther: ly
* @Date: 2018/12/17 17:56
*/
@Entity
@Table(name = "User")
@ApiModel(description = "user")
public class User {
public User() {
}
public User(Integer id, String username, int age) {
this.id = id;
this.username = username;
this.age = age;
}
@ApiModelProperty(value = "主键id",hidden = true)
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@ApiModelProperty(value = "用户名称")
@Column
private String username;
@ApiModelProperty(value = "用户年龄")
@Column
private int age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
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 属性指明此列的长度。
然后就是jpa的重要地方,TestUseuDao,继承了JpaRepository,由于本文只是简单介绍了jpa的简单功能,所以JpaRepository中内置的方法已经足够使用,代码如下。
package com.ooliuyue.springboot_swagger.dao;
import com.ooliuyue.springboot_swagger.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
public interface TestUserDao extends JpaRepository<User,Integer> {}
然后就是测试方法,我这里直接在test启动类进行测试
package com.ooliuyue.springboot_swagger;
import com.ooliuyue.springboot_swagger.dao.TestUserDao;
import com.ooliuyue.springboot_swagger.entity.User;
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;
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootSwaggerApplicationTests {
@Test
public void contextLoads() {
}
@Autowired
private TestUserDao testUserDao;
@Test
public void insert(){
User user = new User();
user.setUsername("张三");
user.setAge(23);
testUserDao.save(user);
}
@Test
public void update(){
User user = new User();
user.setId(1);
user.setAge(18);
user.setUsername("李四");
testUserDao.save(user);
}
@Test
public void select() {
User user = testUserDao.findOne(1);
System.out.println(user);
}
@Test
public void delete() {
testUserDao.delete(1);
}
}
结果:
自动生成表,在测试方法里可以进行数据库数据操作