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也非常方便。