Springboot+Gradle+Mysql+Jpa最简单实例教程


发布者 ourjs  发布时间 1732279298390
关键字 java 

JPA是全自动的ORM(对象关系映射)框架,通过注解配置来映射Java对象和数据库表。 JPA提供了丰富的功能,如事务管理、缓存、查询语言(JPQL)等,简化了数据库操作。 与MyBatis半自动化的持久层框架,需要编写SQL语句来不同。JPA封装了常见的数据库操作,如CRUD(创建、读取、更新、删除),减少了开发人员的工作量。

相关阅读: SpringBoot+Spring6入门指南: 使用命令行快速搭建restful web api模板

Docker安装MySQL

使用docker安装mysql,这里用的是8.0的版本

docker pull mysql:8.0

运行 mysql latest 镜像

数据库文件映射到本地 D:\mysql8\db

docker run -v D:\mysql8\db:/var/lib/mysql -p 3306:3306 --name mysql8 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0

登陆,创建数据库。

docker exec -it mysql8 /bin/bash
mysql -u root -p

登陆mysql成功后,创建数据库 ourjs

create database ourjs character set utf8;

【可选】创建用户,也可以直接用root帐号连接

# 创建用户ourjsuser,所有IP可以访问,密码123456
create user 'ourjsuser'@'%' identified by '123456';

# 将数据库wordpress下的所有(*)授权给userwordpress
grant all privileges on ourjs.* to 'ourjsuser'@'%'; 

# 最后刷新权限
flush privileges;

# 查看database
show databases; 

# 查看user
select user,host,authentication_string from mysql.user; 

# 查看用户权限
show grants for 'ourjsuser'; 

创建表

use ourjs;                  #使用数据库
create table user(          #创建表
    id int(11) not null auto_increment,
    user_name varchar(30),
    user_url varchar(255),
    primary key(id)
) default charset=utf8;

# 插入数据,方便测试
insert into ourjs.user values(null,"ourjs","www.ourjs.com");
insert into ourjs.user values(null,"kris","www.kris.com");

更新 SpringBoot 项目

在 SpringBoot 中添加 SPA 和 mysql 连接

在application.properties中添加数据库信息

#配置数据库信息
spring.datasource.url=jdbc:mysql://localhost:3306/ourjs?serverTimezone=UTC
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=123456
spring.jpa.hibernate.ddl-auto=update

添加包引用: build.gradle

    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    runtimeOnly 'mysql:mysql-connector-java:8.0.28'

运行一次,自动下载依赖。

项目启动后IDE会可以支持jpa的自动提示。 gradle 的配置比maven要简洁很多。

更新 Spring

创建 Entity

创建 UserEntity 与 user 表现进行映射

package com.onceoa.springwebapi.user;

import jakarta.persistence.*;

@Entity(name = "user")
public class UserEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(name="user_name")
    private String username;
    @Column(name="user_url")
    private String userUrl;

    // get/set 方法: JSON 序列化时显示到前端
    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 getUserUrl() { return userUrl; }
    public void setUserUrl(String userUrl) { this.userUrl = userUrl; }
}

创建Repository接口

创建一个继承自JpaRepository的接口,用于访问数据库中的User实体,可编写自定义方法

这里有一个自定义SQL的查询方法

package com.onceoa.springwebapi.user;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;

public interface UserRepository extends JpaRepository<UserEntity, Integer> {
    @Query(value = "select * from user where user_name = ?1", nativeQuery = true)
    UserEntity findByUsername(String username);
}

更新Service

更新 UserService 和 UserServiceImpl 添加 getAll 和 getUser方法

UserService 接口

package com.onceoa.springwebapi.user;

import java.util.List;

public interface UserService {
    String getHello(String user1, String user2);
    List<UserEntity> getAll();
    UserEntity getUser(String username);
}

UserServiceImpl 实例类。

如果一个Bean类中只有一个构造函数,@Autowired 依赖注入装饰注释可以被省略。

package com.onceoa.springwebapi.user;

import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserServiceImpl implements UserService {

    private final UserRepository userRepository;

    public UserServiceImpl(
            UserRepository userRepository
    ) {
        this.userRepository = userRepository;
    }

    public String getHello(String user1, String user2) {
        return String.format("This is %s %s from user Service!", user1, user2);
    }

    public List<UserEntity> getAll() {
        //调用SPA自动生成的方法
        return userRepository.findAll();
    }

    public UserEntity getUser(String username) {
        //调用自定义SQL
        return userRepository.findByUsername(username);
    }
}

更新 Controller

更新 UserController, 这里也省略了@Autowired。

package com.onceoa.springwebapi.user;

//同一个包下,不需要引用
//import com.onceoa.springwebapi.user.UserService;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/user")
public class UserController {
    UserService userService;

    public UserController(
            UserService userService
    ) {
        this.userService = userService;
    }

    @GetMapping("/all")
    public List<UserEntity> getAll() {
        return userService.getAll();
    }

    @GetMapping("/find/{username}")
    public UserEntity getUser(@PathVariable String username) {
        return userService.getUser(username);
    }
}

运行测试

运行项目,启动成功后,可浏览器打开网址测试:

http://localhost:8080/user/all

[
    {
        "id": 1,
        "username": "ourjs",
        "userUrl": "www.ourjs.com"
    },
    {
        "id": 2,
        "username": "kris",
        "userUrl": "www.kris.com"
    }
]

http://localhost:8080/user/find/ourjs

{
    "id": 1,
    "username": "ourjs",
    "userUrl": "www.ourjs.com"
}

由上可见 SPA 使用相较 mybits 更加简洁。在 Repository 添加自定义SQL也非常方便。