spring boot2+jpa+thymeleaf增删改查例子

参考这遍文章做了一个例子,稍微不同之处,原文是spring boot、mysql,这里改成了spring boot 2、Oracle。

一、pom.xml引入相关模块web、jpa、thymeleaf、oracle:

        <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
         </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency> 
            <groupId>com.oracle</groupId> 
            <artifactId>ojdbc8</artifactId> 
            <version>12.2.0.1</version>         
        </dependency>

二、application.properties配置

server.port = 9001

spring.datasource.driver-class-name = oracle.jdbc.driver.OracleDriver
spring.datasource.url = jdbc:oracle:thin:@127.0.0.1:1521:testdb
spring.datasource.username = dev
spring.datasource.password = dev

spring.jpa.hibernate.ddl-auto = update
spring.jpa.show-sql = true

spring.thymeleaf.cache = false

说明:
1、由于本机的8080已经被使用,修改一下端口号为9001。
2、hibernate.hbm2ddl.auto参数有四个值:
create: 每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要
这样执行,这就是导致数据库表数据丢失的一个重要原因。
create-drop :每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。
update:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载
hibernate时根据 model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器
后,表结构是不会被马上建立起来的,是要等 应用第一次运行起来后才会。
validate :每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。
3、show-sql 是否打印出自动生产的SQL,方便调试的时候查看
4、propertiesspring.thymeleaf.cache=false是关闭thymeleaf的缓存,不然在开发过程中修改页面不会立刻生效需要重启,生产
可配置为true。

三、启动类需要添加Servlet的支持

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

@SpringBootApplication
public class DemoApplication extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(DemoApplication.class);
    }
    
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

四、数据库层代码

1、实体类映射数据库表

package com.example.demo.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.validation.constraints.NotEmpty;

import org.hibernate.validator.constraints.Length;

@Entity
@Table(name = "userinfo")
public class User {
    @Id
    @GeneratedValue
    private long id;
    
    @Column(nullable = false, unique = true)
    @NotEmpty(message="用户名不能为空")
    private String userName;
    
    @Column(nullable = false)
    @NotEmpty(message="密码不能为空")
    @Length(min=6, message="密码长度不能少于6位")
    private String password;
    
    @Column(nullable = false)
    private int age;

    //必须有构造
      public User() {
      }
          
    public long getId() {
        return id;
    }

    public User setId(long id) {
        this.id = id;
        return this;
    }

    public String getUserName() {
        return userName;
    }

    public User setUserName(String userName) {
        this.userName = userName;
        return this;
    }

    public String getPassword() {
        return password;
    }

    public User setPassword(String password) {
        this.password = password;
        return this;
    }

    public int getAge() {
        return age;
    }

    public User setAge(int age) {
        this.age = age;
        return this;
    }
}

2、继承JpaRepository类会自动实现很多内置的方法

package com.example.demo.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import com.example.demo.entity.User;

public interface UserRepository extends JpaRepository<User, Long> {
    User findById(long id);
    void deleteById(Long id);
}

五、业务层

service调用jpa实现相关的增删改查,实际项目中service层处理具体的业务代码。

1、UserService.java

package com.example.demo.service;

import java.util.List;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import com.example.demo.entity.User;

public interface UserService {
    
    public Page<User> getUserPage(Pageable pageable);
    
    public List<User> getUserList();

    public User findUserById(long id);

    public void save(User user);

    public void edit(User user);

    public void delete(long id);
}

2、UserServiceImpl.java

package com.example.demo.service.impl;

import java.util.List;
import java.util.Optional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;

import com.example.demo.entity.User;
import com.example.demo.repository.UserRepository;
import com.example.demo.service.UserService;

@Service
public class UserServiceImpl implements UserService {
    
    @Autowired
    private UserRepository userRepository;

    @Override
    public Page<User> getUserPage(Pageable pageable) {
        return userRepository.findAll(pageable);
    }
    
    @Override
    public List<User> getUserList() {
        return userRepository.findAll();
    }

    @Override
    public User findUserById(long id) {
        return userRepository.findById(id) ;
    }

    @Override
    public void save(User user) {
        userRepository.save(user);
    }

    @Override
    public void edit(User user) {
        userRepository.save(user);
    }

    @Override
    public void delete(long id) {
        userRepository.deleteById(id);
    }

}

六、控制层

package com.example.demo.web.controller;

import java.util.List;

import javax.annotation.Resource;
import javax.validation.Valid;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.example.demo.entity.User;
import com.example.demo.service.UserService;

@Controller
public class UserController {
    
    @Resource
    UserService userService;

    @RequestMapping("/")
    public String index() {
        return "redirect:/list";
    }

    @RequestMapping("/list")
    public String list(Model model) {
        List<User> users=userService.getUserList();
        model.addAttribute("users", users);
        
        /*int page=1,size=2;
        Sort sort = new Sort(Direction.DESC, "id");
        Pageable pageable = PageRequest.of(page, size, sort);
        model.addAttribute("users", pageable);*/
        
        return "user/list";
    }

    @RequestMapping("/toAdd")
    public String toAdd() {
        return "user/userAdd";
    }

    @RequestMapping("/add")
    public @ResponseBody User add(@Valid User user, BindingResult result) {
        if (result.hasErrors()) {
            List<ObjectError> list = result.getAllErrors();
            for (ObjectError error : list) {
                System.out.println(error.getDefaultMessage());
            }
            return null;
        }
        userService.save(user);
        return user;        
    }

    @RequestMapping("/toEdit")
    public String toEdit(Model model,Long id) {
        User user=userService.findUserById(id);
        model.addAttribute("user", user);
        return "user/userEdit";
    }

    @RequestMapping("/edit")
    public String edit(User user) {
        userService.edit(user);
        return "redirect:/list";
    }

    @RequestMapping("/delete")
    public String delete(Long id) {
        userService.delete(id);
        return "redirect:/list";
    }
}

七、页面

1、列表页 list.hmtl

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8"/>
    <title>userList</title>
    <link rel="stylesheet" th:href="@{/css/bootstrap.css}"></link>
</head>
<body class="container">
<br/>
<h1>用户列表</h1>
<br/><br/>
<div class="with:80%">
    <table class="table table-hover">
        <thead>
        <tr>
            <th>#</th>
            <th>User Name</th>
            <th>Password</th>
            <th>Age</th>
            <th>Edit</th>
            <th>Delete</th>
        </tr>
        </thead>
        <tbody>
        <tr  th:each="user : ${users}">
            <th scope="row" th:text="${user.id}">1</th>
            <td th:text="${user.userName}">neo</td>
            <td th:text="${user.password}">Otto</td>
            <td th:text="${user.age}">6</td>
            <td><a th:href="@{/toEdit(id=${user.id})}">edit</a></td>
            <td><a th:href="@{/delete(id=${user.id})}">delete</a></td>
        </tr>
        </tbody>
    </table>
</div>
<div class="form-group">
    <div class="col-sm-2 control-label">
        <a href="/toAdd" th:href="@{/toAdd}" class="btn btn-info">add</a>
    </div>
</div>

</body>
</html>

2、新增页 userAdd.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8"/>
    <title>user</title>
    <link rel="stylesheet" th:href="@{/css/bootstrap.css}"></link>
</head>
<body class="container">
<br/>
<h1>添加用户</h1>
<br/><br/>
<div class="with:80%">
    <form class="form-horizontal"   th:action="@{/add}"  method="post">
        <div class="form-group">
            <label for="userName" class="col-sm-2 control-label">userName</label>
            <div class="col-sm-10">
                <input type="text" class="form-control" name="userName"  id="userName" placeholder="userName"/>
            </div>
        </div>
        <div class="form-group">
            <label for="password" class="col-sm-2 control-label" >Password</label>
            <div class="col-sm-10">
                <input type="password" class="form-control" name="password" id="password" placeholder="Password"/>
            </div>
        </div>
        <div class="form-group">
            <label for="age" class="col-sm-2 control-label">age</label>
            <div class="col-sm-10">
                <input type="text" class="form-control" name="age"  id="age" placeholder="age"/>
            </div>
        </div>
        <div class="form-group">
            <div class="col-sm-offset-2 col-sm-10">
                <input type="submit" value="Submit" class="btn btn-info" />
                &nbsp; &nbsp; &nbsp;
                <input type="reset" value="Reset" class="btn btn-info" />
            </div>

        </div>
    </form>
</div>
</body>
</html>

3、修改页 userEdit.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8"/>
    <title>user</title>
    <link rel="stylesheet" th:href="@{/css/bootstrap.css}"></link>
</head>
<body class="container">
<br/>
<h1>修改用户</h1>
<br/><br/>
<div class="with:80%">
    <form class="form-horizontal"   th:action="@{/edit}" th:object="${user}"  method="post">
        <input type="hidden" name="id" th:value="*{id}" />
        <div class="form-group">
            <label for="userName" class="col-sm-2 control-label">userName</label>
            <div class="col-sm-10">
                <input type="text" class="form-control" name="userName"  id="userName" th:value="*{userName}" 

placeholder="userName"/>
            </div>
        </div>
        <div class="form-group">
            <label for="password" class="col-sm-2 control-label" >Password</label>
            <div class="col-sm-10">
                <input type="password" class="form-control" name="password" id="password"  th:value="*{password}" 

placeholder="Password"/>
            </div>
        </div>
        <div class="form-group">
            <label for="age" class="col-sm-2 control-label">age</label>
            <div class="col-sm-10">
                <input type="text" class="form-control" name="age"  id="age" th:value="*{age}" placeholder="age"/>
            </div>
        </div>
        <div class="form-group">
            <div class="col-sm-offset-2 col-sm-10">
                <input type="submit" value="Submit" class="btn btn-info" />
                &nbsp; &nbsp; &nbsp;
                <a href="/toAdd" th:href="@{/list}" class="btn btn-info">Back</a>
            </div>

        </div>
    </form>
</div>
</body>
</html>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Boot是一个快速开发框架,Thymeleaf是一个模板引擎,可以用于前端开发。在使用Spring BootThymeleaf进行增删改查操作时,可以使用Spring Boot提供的JPA或MyBatis等持久化框架来操作数据库,同时使用Thymeleaf来渲染页面。具体实现可以参考Spring Boot官方文档和Thymeleaf官方文档,也可以参考一些开源项目的实现方式。 ### 回答2: Spring Boot是一个轻量级的框架,可以快速创建基于SpringJava应用程序。它可以自动配置绝大部分的应用程序,还可以将Web项目快速部署到云端。而Thymeleaf是一种Java的服务器端模板引擎,它允许轻松地构建动态Web页面。 在Spring Boot中,使用Thymeleaf实现增删改查是一种非常常见的做法。首先,我们需要在pom.xml文件中添加以下依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> ``` 接下来,我们需要创建一个控制器,用来处理页面请求。这个控制器可以处理四个不同的请求: 1. 显示添加页面。 2. 处理添加请求。 3. 显示修改页面。 4. 处理修改请求。 以下是一个基本的控制器代码: ``` @Controller public class UserController { @Autowired private UserService userService; @GetMapping("/add") public String showAddForm(User user) { return "add-user"; } @PostMapping("/add") public String addUser(@Valid User user, BindingResult result, Model model) { if (result.hasErrors()) { return "add-user"; } userService.save(user); model.addAttribute("users", userService.findAll()); return "redirect:/index"; } @GetMapping("/edit/{id}") public String showUpdateForm(@PathVariable("id") long id, Model model) { User user = userService.findById(id) .orElseThrow(() -> new IllegalArgumentException("Invalid user Id:" + id)); model.addAttribute("user", user); return "update-user"; } @PostMapping("/update/{id}") public String updateUser(@PathVariable("id") long id, @Valid User user, BindingResult result, Model model) { if (result.hasErrors()) { user.setId(id); return "update-user"; } userService.save(user); model.addAttribute("users", userService.findAll()); return "redirect:/index"; } } ``` 在上面的代码中,我们使用了@GetMapping和@PostMapping注释来处理HTTP GET和POST请求。在控制器中,我们还注入了一个UserService对象,用于处理数据层逻辑。 接下来,我们需要创建一些模板来显示页面。在本例中,我们使用了两个模板:一个用于添加和修改用户,另一个用于显示所有用户。以下是一个基本的模板代码: ``` <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>Spring Boot Thymeleaf Example</title> </head> <body> <div th:if="${message}"> <h2 th:text="${message}"></h2> </div> <h3>Add User</h3> <form th:action="@{/add}" th:object="${user}" method="post"> <input type="text" th:field="*{firstName}" placeholder="First Name" /> <input type="text" th:field="*{lastName}" placeholder="Last Name" /> <button type="submit">Add User</button> </form> <hr /> <h3>All Users</h3> <table> <thead> <tr> <th>First Name</th> <th>Last Name</th> <th>Action</th> </tr> </thead> <tbody> <tr th:each="user : ${users}"> <td th:text="${user.firstName}"></td> <td th:text="${user.lastName}"></td> <td> <a th:href="@{'/edit/' + ${user.id}}">Edit</a> | <a th:href="@{'/delete/' + ${user.id}}" onclick="return confirm('Are you sure?')">Delete</a> </td> </tr> </tbody> </table> <hr /> <a th:href="@{/add}">Add New User</a> </body> </html> ``` 在上面的代码中,我们使用了Thymeleaf的模板标签,如th:each和th:field。这些标签可以帮助我们快速构建动态Web页面。 最后,我们还需要创建一个服务类,用于处理所有数据层逻辑。以下是一个基本的服务类代码: ``` @Service public class UserServiceImpl implements UserService { @Autowired private UserRepository userRepository; @Override public List<User> findAll() { return userRepository.findAll(); } @Override public Optional<User> findById(long id) { return userRepository.findById(id); } @Override public User save(User user) { return userRepository.save(user); } @Override public void deleteById(long id) { userRepository.deleteById(id); } } ``` 在本例中,我们使用了UserRepository接口来处理数据库操作。该接口是基于Spring Data JPA的,它提供了许多通用的方法,如findAll和findById等。 以上就是使用Spring BootThymeleaf实现增删改查的基本流程。通过以上步骤,我们可以快速创建一个基于Spring BootThymeleaf的Web应用程序。 ### 回答3: SpringBoot Thymeleaf是一款JavaWeb开发框架,它具有快速开发、简洁明了、模块化等特点。SpringBoot Thymeleaf增删改查方面也具有非常重要的应用。 增加操作:首先通过注解@EnableWebMvc启用Web MVC支持,然后在Controller中创建@RequestMapping注解指定的方法并且在参数上使用注解@RequestParam将HTTP请求参数绑定到参数中。通过JPA或Mybatis操作,把数据写入到数据库中。 删除操作:通过@RequestMapping注解指定的方法和@RequestParam注解使用HTTP请求参数作为输入参数,调用JPA或Mybatis的删除方法将数据从数据库中删除。 修改操作:通过@Controller类中@RequestMapping注解指定相应的方法,使用@RequestParam注解获得请求参数,对于更改操作,使用JPA或Mybatis向数据库提交数据并将其更新。 查询操作:使用@RequestMapping注解指定的方法来呈现视图,使用JPA或Mybatis获取和筛选数据。在将数据返回到视图中使用Thymeleaf模板,渲染内容并呈现回浏览器。 以上就是SpringBoot Thymeleaf增删改查的简单流程。SpringBoot Thymeleaf是开发者们可以借助的一款可靠而强大的JavaWeb框架,凭借其模块化的设计,它使得快速开发变得更加容易。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值