SpringBoot开发,实体Entity如何与数据表进行对应?
发布于 作者:苏南大叔 来源:程序如此灵动~

书接上文,本文说一下spring boot
中的entity
。它是把model
和数据表具象化绑定后的产物,一个实体对应一个数据表。这个思想规范叫做JPA
:Persistence API
,具体实现这一思想的框架叫做Hibernate
。Hibernate
挺好用,但是有更加轻便的mybatis
/mybatisplus
正在取代它。
苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验总结。测试环境:win10
,openjdk@23.0.2
,IntelliJ IDEA 2024.3.4.1
,maven@3.3.2
,spring boot@2.5.4
,java@17
,mysql@5.7.26
。
龙套代码
虽然说JPA
/Hibernate
的势头,正在不断被mybatis
赶超。但是它的思想还是值得大家学习的。
本文的配套例子,基于下面这篇文章修改:
本文和下面的这个文章紧密联系,代码结构复用。
上文中的Model
文件,在本文中就分为了sql
部分和Entity
部分了。Model
文件中的findByName()
方法,被分到了repository
文件中。
jpa依赖
pom.xml
:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
然后就执行mvn install
命令。
resources/application.properties
新增配置:
spring.datasource.url=jdbc:mysql://localhost:3306/boot
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect
spring.jpa.properties.hibernate.format_sql=true
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
sql【分拆而来】
这里本地数据库是mysql@5.7
,建立了一个user
数据表。建表语句如下:
CREATE TABLE user (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
password VARCHAR(255) NOT NULL
);
INSERT INTO user (name, password) VALUES ('user1', 'password1');
INSERT INTO user (name, password) VALUES ('user2', 'password2');
Entity【分拆而来】
src\main\java\com\example\demo\entity\userEntity.java
:
package com.example.demo.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String password;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
这个文件非常好理解,不做过多解释。
Repository【新增】
src\main\java\com\example\demo\repository\UserRepository.java
:
package com.example.demo.repository;
import com.example.demo.model.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
User findByName(String name);
}
这个接口文件的具体操作,是由springboot
来完成的,并不需要项目这边做实现。所以,仅仅是个没有什么存在感的接口文件。
Controller【不变】
src/main/java/com/example/demo/controller/PageController.java
:
package com.example.demo.controller;
import com.example.demo.repository.ProductRepository;
import com.example.demo.repository.UserRepository;
import com.example.demo.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class PageController {
@Autowired
private UserRepository userRepository;
@GetMapping("/login")
public String showLoginPage() {
return "login";
}
@PostMapping("/login")
public String login(@RequestParam("username") String username, @RequestParam("password") String password, Model model) {
User user = userRepository.findByName(username);
// System.out.println("user: " + user + username + password);
if (user != null && user.getPassword().equals(password)) {
model.addAttribute("message", "Login successful");
} else {
model.addAttribute("message", "Invalid username or password");
}
return "login";
}
}
template【不变】
src\main\resources\templates\login.html
文件:
<form action="#" th:action="@{/login}" method="post">
<div>
<label for="username">Username:</label>
<input type="text" id="username" name="username" required>
</div>
<div>
<label for="password">Password:</label>
<input type="password" id="password" name="password" required>
</div>
<div>
<button type="submit">Login</button>
</div>
</form>
<p th:text="${message}">Message will be displayed here</p>
结语
本文的内容看起来很多,代码比较难记。但是如果使用代码助手(比如vscode
的copilot
)的话,生成起来也比较容易。所以,只要理解各个文件之间的关系,就可以了。
更多苏南大叔的java
经验文字,请点击:


