10、Spring Boot:JPA操作数据库

目标:在数据库中自动建立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():

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值