我们相信:世界是美好的,你是我也是。 来玩一下解压小游戏吧!

书接上文,本文说一下spring boot中的entity。它是把model和数据表具象化绑定后的产物,一个实体对应一个数据表。这个思想规范叫做JPA:Persistence API,具体实现这一思想的框架叫做HibernateHibernate挺好用,但是有更加轻便的mybatis/mybatisplus正在取代它。

苏南大叔:SpringBoot开发,实体Entity如何与数据表进行对应? - springboot-entity-table
SpringBoot开发,实体Entity如何与数据表进行对应?(图3-1)

苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验总结。测试环境:win10openjdk@23.0.2IntelliJ IDEA 2024.3.4.1maven@3.3.2spring boot@2.5.4java@17mysql@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>
XML

然后就执行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
Ini

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');
SQL

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;
    }
}
Java

这个文件非常好理解,不做过多解释。

苏南大叔:SpringBoot开发,实体Entity如何与数据表进行对应? - 对应表
SpringBoot开发,实体Entity如何与数据表进行对应?(图3-2)

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);
}
Java

这个接口文件的具体操作,是由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";
    }
}
Java

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>
HTML

苏南大叔:SpringBoot开发,实体Entity如何与数据表进行对应? - 登陆验证
SpringBoot开发,实体Entity如何与数据表进行对应?(图3-3)

结语

本文的内容看起来很多,代码比较难记。但是如果使用代码助手(比如vscodecopilot)的话,生成起来也比较容易。所以,只要理解各个文件之间的关系,就可以了。

更多苏南大叔的java经验文字,请点击:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   java