Spring boot2+jpa+thymeleaf实现增删改查

作者:gdjlc 时间:2021-06-02 07:21:49 

一、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}" rel="external nofollow" rel="external nofollow" rel="external nofollow" ></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})}" rel="external nofollow" >edit</a></td>
     <td><a th:href="@{/delete(id=${user.id})}" rel="external nofollow" >delete</a></td>
   </tr>
   </tbody>
 </table>
</div>
<div class="form-group">
 <div class="col-sm-2 control-label">
   <a href="/toAdd" rel="external nofollow" rel="external nofollow" th:href="@{/toAdd}" rel="external nofollow" class="btn btn-info">add</a>
 </div>
</div>

</body>
</html>

Spring boot2+jpa+thymeleaf实现增删改查

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}" rel="external nofollow" rel="external nofollow" rel="external nofollow" ></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>

Spring boot2+jpa+thymeleaf实现增删改查

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}" rel="external nofollow" rel="external nofollow" rel="external nofollow" ></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" rel="external nofollow" rel="external nofollow" th:href="@{/list}" rel="external nofollow" class="btn btn-info">Back</a>
     </div>

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

来源:https://www.cnblogs.com/gdjlc/p/10039494.html

标签:Spring,boot,jpa,thymeleaf,增删改查
0
投稿

猜你喜欢

  • Android UI设计系列之自定义ListView仿QQ空间阻尼下拉刷新和渐变菜单栏效果(8)

    2023-05-23 14:57:04
  • Mybatis Plus使用XML编写动态sql的超简易方法

    2022-02-20 01:49:16
  • Android动画 实现开关按钮动画(属性动画之平移动画)实例代码

    2023-01-02 23:06:30
  • Android开发注解排列组合出启动任务ksp

    2022-10-06 21:25:16
  • android轻量级无侵入式管理数据库自动升级组件

    2023-12-09 15:36:01
  • android实现图片裁剪的两种方法

    2022-10-27 18:41:05
  • 解析Flink内核原理与实现核心抽象

    2023-11-25 10:30:04
  • Java实现InputStream的任意拷贝方式

    2022-04-08 10:11:32
  • Android开发实现跟随手指的小球效果示例

    2022-05-31 08:58:10
  • Android中解决WebView上下滑动监听问题

    2022-04-18 04:45:37
  • unity3d实现七天签到功能

    2023-01-05 08:57:21
  • AJAX SpringBoot 前后端数据交互的项目实现

    2023-11-24 05:49:48
  • Android模仿美团顶部的滑动菜单实例代码

    2023-04-24 08:10:23
  • Java向上转型和向下转型实例解析

    2022-08-12 01:59:28
  • Java基础之Thymeleaf的简单使用

    2023-08-24 19:00:22
  • C语言实现航空订票系统课程设计

    2023-11-15 10:50:20
  • Java农夫过河问题的继承与多态实现详解

    2022-07-12 16:13:22
  • 详解利用SpringCloud搭建一个最简单的微服务框架

    2023-08-21 04:24:32
  • Unity实现物体左右移动效果

    2021-12-17 15:52:31
  • 再谈异常处理try catch finally

    2021-11-12 11:17:31
  • asp之家 软件编程 m.aspxhome.com