SpringBoot JPA 学习

本文最后更新于:2022年3月26日 晚上

SpringBoot JPA

虽然我还没学完SpringBoot,但是我们还是可以直接去开一个JPA项目来了解这个数据持久化层的应用。

Start

使用IDEA的Spring构建(Spring Initializr)来快速完成SpringBoot JPA项目的搭建

在依赖中选中SQL中的Spring Data JPAMySql Driver(当然这是使用mysql数据库)

Connect with DataBase

在resources中生成的application.properties写入数据库中的配置:

# datasource四大件
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/jpa
spring.datasource.username=root
spring.datasource.password=12345678

# 设置web服务器的端口
server.port=8080

# 开启jpa的逆向工程(开发阶段设置为true,线上环境为false)
spring.jpa.generate-ddl=true
# 生成数据表的规则
spring.jpa.hibernate.ddl-auto=update
# 开启sql语句提示
spring.jpa.show-sql=true

dll-auto的详解

  • create

    每次运行springboot就会删除原来的表,重新创建新表(drop-create)

  • create-drop

    每次运行创建数据表,运行完毕后将数据表删除

  • update

    当实体类和数据库中的数据表不对应时,重新更新表

  • none

    功能无效,不自动创建数据表

使用了dll-auto还是不生成表?

有很多可能会造成这种情况,需要根据具体情况来分析

这里有一份错误排除文章,总有一种解决方式适合你😆

编写实体类(pojo)

package com.rokelamen.jpa.pojo;

import javax.persistence.*;

// Entity注解可以使实体类和数据表联系起来
// name 属性指定表名
@Entity(name = "t_user")
public class User {

    // Id注解指定类成员为主键
    @Id
    // GeneratedValue指定了主键的生成策略
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    // Column表示此类成员为普通字段
    @Column
    private String username;

    @Column
    private String password;

    public int getId() {
        return id;
    }

    public void setId(int 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;
    }
}

需要注意的是,如果pojo在启动包的同级的话,就无法生成和关联数据表(也就是说必须要是启动包的子包)。要是想要查找到不是子包的pojo,就得这样:

// 启动类中
package com.rokelamen.jpa;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;

@SpringBootApplication
@EntityScan("com.rokelamen.pojo")
public class SpringbootJpaTestApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootJpaTestApplication.class, args);
    }

}

加上@EntityScan注解

dao层继承Jpa仓库

package com.rokelamen.jpa.dao;

import com.rokelamen.jpa.pojo.User;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserDao extends JpaRepository<User, Integer> {

}

编写Controller

package com.rokelamen.jpa.controller;

import com.rokelamen.jpa.dao.UserDao;
import com.rokelamen.jpa.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Controller
@RequestMapping(path = "/jpa")
public class MainController {

    @Autowired

    private UserDao userDao;

    @GetMapping(path = "/add")
    public @ResponseBody String addNewUser(@RequestParam String username,
                                           @RequestParam String password) {
        User user = new User();
        user.setUsername(username);
        user.setPassword(password);
        userDao.save(user);
        return "Saved!";
    }

    @GetMapping(path = "/getall")
    public @ResponseBody
    List<User> getAllUser() {
        return userDao.findAll();
    }
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!