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

 更新时间:2020年04月23日 10:27:17   作者:gdjlc  
这篇文章主要介绍了Spring boot2+jpa+thymeleaf实现增删改查,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

一、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>

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>

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>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Spring Boot启动过程完全解析(一)

    Spring Boot启动过程完全解析(一)

    这篇文章主要介绍了Spring Boot启动过程完全解析(一),需要的朋友可以参考下
    2017-04-04
  • java数据结构基础:绪论

    java数据结构基础:绪论

    这篇文章主要介绍了Java的数据解构基础,希望对广大的程序爱好者有所帮助,同时祝大家有一个好成绩,需要的朋友可以参考下,希望能给你带来帮助
    2021-07-07
  • springboot中RestTemplate配置HttpClient连接池详解

    springboot中RestTemplate配置HttpClient连接池详解

    这篇文章主要介绍了springboot中RestTemplate配置HttpClient连接池详解,这些Http连接工具,使用起来都比较复杂,如果项目中使用的是Spring框架,可以使用Spring自带的RestTemplate来进行Http连接请求,需要的朋友可以参考下
    2023-11-11
  • Spring Cloud Gateway的配置与使用教程

    Spring Cloud Gateway的配置与使用教程

    这篇文章主要介绍了Spring Cloud Gateway的配置与使用,通过本文的介绍,我们了解了Spring Cloud Gateway的核心概念和基本配置,需要的朋友可以参考下
    2023-06-06
  • 简单谈谈java中匿名内部类构造函数

    简单谈谈java中匿名内部类构造函数

    这篇文章主要简单给我们介绍了java中匿名内部类构造函数,并附上了简单的示例,有需要的小伙伴可以参考下。
    2015-11-11
  • java循环删除List元素报错的原因分析与解决

    java循环删除List元素报错的原因分析与解决

    大家在工作中应该都会遇到从List集合中删除某一个或多个元素的业务场景,相信大家都会避开在循环里面删除元素,使用其他方式处理,这是为什么呢,下面小编就来和大家详细聊聊
    2023-11-11
  • Springboot处理异常的常见方式

    Springboot处理异常的常见方式

    SpringBoot框架异常处理有多种处理方式,今天就带大家了解一下常见的springboot异常处理方式,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • java实现数据结构单链表示例(java单链表)

    java实现数据结构单链表示例(java单链表)

    这篇文章主要介绍了java数据结构实现单链表示例,需要的朋友可以参考下
    2014-03-03
  • Eclipse maven项目lombok安装配置图解

    Eclipse maven项目lombok安装配置图解

    这篇文章主要介绍了Eclipse maven项目lombok安装配置图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • java 全角半角字符转换如何实现

    java 全角半角字符转换如何实现

    在java中可能会用到过全角半角字符转换问题,于是网上搜索整理了一下,晒出来和大家分享,希望可以帮助你们
    2012-12-12

最新评论