zoukankan      html  css  js  c++  java
  • 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>
  • 相关阅读:
    OutputCache 缓存key的创建 CreateOutputCachedItemKey
    Asp.net Web Api源码调试
    asp.net mvc源码分析DefaultModelBinder 自定义的普通数据类型的绑定和验证
    Asp.net web Api源码分析HttpParameterBinding
    Asp.net web Api源码分析HttpRequestMessage的创建
    asp.net mvc源码分析ActionResult篇 RazorView.RenderView
    Asp.Net MVC 项目预编译 View
    Asp.net Web.config文件读取路径你真的清楚吗?
    asp.net 动态创建TextBox控件 如何加载状态信息
    asp.net mvc源码分析BeginForm方法 和ClientValidationEnabled 属性
  • 原文地址:https://www.cnblogs.com/gdjlc/p/10039494.html
Copyright © 2011-2022 走看看