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>
  • 相关阅读:
    Ubuntu 下安装Mongodb
    iOS 配置支付宝
    Spring异步任务处理,@Async的配置和使用
    [Tue, 11 Aug 2015 ~ Mon, 17 Aug 2015] Deep Learning in arxiv
    linux-shell脚本命令之awk
    字符串写入文件
    UVa 10773
    Flex下拉框
    DELPHI dbgrid 选中的是第几行 怎么判断?
    delphi 取得数据集某字段值的六种方法
  • 原文地址:https://www.cnblogs.com/gdjlc/p/10039494.html
Copyright © 2011-2022 走看看