目标:在数据库中自动建立User表,并增删改查。
1、访问网址https://start.spring.io,下载Spring Boot基础项目:
这里直接选择好依赖模块
- Web
- JPA
- DevTools
- MySQL
2、下载,并导入eclipse项目。打开后可以看到,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.example</groupId>
<artifactId>JPA_Demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>JPA_Demo</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.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-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-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3、配置好MySQL环境。启动MySQL。
4、新建配置文件application.yml,写入数据库连接配置:
spring:
datasource:
url: jdbc:mysql://localhost:3306/test1
username: root
password: 12345678
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
properties:
hibernate:
hbm2ddl:
auto: update
dialect: org.hibernate.dialect.MySQL5InnoDBDialect
show-sql: true
这里的spring.jpa.properties.hibernate.hbm2ddl.auto参数的作用是:
- create:每次加载hibernate时都会删除上一次的生成的表,然后根据你的Entity类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
- create-drop :每次加载hibernate时根据Entity类生成表,但是sessionFactory一关闭,表就自动删除。
- update:最常用的属性,第一次加载hibernate时根据Entity类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据Entity类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才会。
- validate:每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表。如果Entity类增加了成员变量,则会报错。如果Entity类少了成员变量,则会按照null值插入映射表中。
5、建立Entity类:
package com.example.JPA_Demo.domain;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class User implements Serializable
{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private Long id;
@Column(nullable = false, unique = true)
private String userName;
@Column(nullable = false)
private String passWord;
@Column
private Date regTime;
@Column
private String remark;
@Column
private int sex;
public Long getId()
{
return id;
}
public void setId(Long id)
{
this.id = id;
}
public String getUserName()
{
return userName;
}
public void setUserName(String userName)
{
this.userName = userName;
}
public String getPassWord()
{
return passWord;
}
public void setPassWord(String passWord)
{
this.passWord = passWord;
}
public Date getRegTime()
{
return regTime;
}
public void setRegTime(Date regTime)
{
this.regTime = regTime;
}
public String getRemark()
{
return remark;
}
public void setRemark(String remark)
{
this.remark = remark;
}
public int isSex()
{
return sex;
}
public void setSex(int sex)
{
this.sex = sex;
}
}
6、新建一个Repository接口并继承自JpaRepository(Spring为我们准备好的数据库操作接口),就可以操作数据库了。
package com.example.JPA_Demo.domain;
import org.springframework.data.jpa.repository.JpaRepository;
import com.example.JPA_Demo.domain.User;
public interface UserRepository extends JpaRepository<User, Long>
{
// 自定义查询
User findByUserName(String userName);
}
这里的findByUserName是自定义规则查询。不写这个也可以执行最简易的CRUD操作。
到此,所有配置都完成了。测试下:
1、src/test/java目录下,建立测试类UserRepositoryTests
package com.example.JPA_Demo;
import java.util.Date;
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;
import com.example.JPA_Demo.domain.User;
import com.example.JPA_Demo.domain.UserRepository;
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserRepositoryTests {
@Autowired
private UserRepository userRepository;
@Test
public void testInsert() throws Exception
{
User aUser = new User();
aUser.setUserName("a01");
aUser.setPassWord("123456");
aUser.setRegTime(new Date());
aUser.setRemark("rmkA01");
aUser.setSex(1);
userRepository.save(aUser);
}
@Test
public void testSelect() throws Exception
{
User user = userRepository.findByUserName("a01");
System.out.println("testSelect():" + user.getUserName() + "," + user.getRemark());
}
@Test
public void testUpdate() throws Exception
{
User userUpdate = userRepository.findByUserName("a01");
userUpdate.setRemark("rmkA01_XXX");
userRepository.save(userUpdate);
}
@Test
public void testDelete() throws Exception
{
userRepository.delete(userRepository.findByUserName("a01"));
}
}
这里建议一个只执行一个Test,这样更容易看清楚运行情况。
testInsert():
testSelect():
testUpdate():
testDelete():