参考这遍文章做了一个例子,稍微不同之处,原文是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>

最新文章

  1. vim编辑指令(转)
  2. JavaScript DOM动态创建(声明)Object元素
  3. 【原】Hadoop伪分布模式的安装
  4. [生成树][Uva1395][Slim Span]
  5. Centos7下建立rubymine快捷方式到侧栏或桌面
  6. [转载] 十五分钟介绍 Redis数据结构
  7. 剑指架构师系列-持续集成之Maven实现项目的编译、发布和部署
  8. Java核心技术卷一 &#183; 笔记(1)
  9. 【Java】设计模型-五种单例模型
  10. 网站ASHX不执行故障
  11. EntityFrameworkCore DBFirst
  12. springmvc上传zip文件并解压缩代码示例
  13. netable 禁用拖动
  14. WinForm 打开文件夹
  15. Sublime Text常用设置之个人配置
  16. Ubuntu安装后配置
  17. shell 获取不同目录下指定文件,并把文件复制到一个文件夹下面
  18. 将Python项目生成所有依赖包的清单requirements .txt文件
  19. arch安装完成之后不能使用笔记本自带的无线网卡
  20. 部分常用dos命令

热门文章

  1. ERP项目实施记录10
  2. 分布式事务TransactionScope
  3. Java Web 笔试(面试)题
  4. xpinyin模块
  5. centos7编译安装Python3所需要的库(模块)依赖
  6. 类的继承和C3算法
  7. vue-property-decorator 提供 OO 的风格 Vue Component 方便类型声明
  8. 你不知道的JavaScript-2.词法作用域
  9. idea快捷键使用
  10. fiddler学习总结--手机端(APP/微信小程序)抓包