Spring boot2+jpa+thymeleaf實(shí)現(xiàn)增刪改查
一、pom.xml引入相關(guān)模塊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 = 9001spring.datasource.driver-class-name = oracle.jdbc.driver.OracleDriverspring.datasource.url = jdbc:oracle:thin:@127.0.0.1:1521:testdbspring.datasource.username = devspring.datasource.password = devspring.jpa.hibernate.ddl-auto = updatespring.jpa.show-sql = truespring.thymeleaf.cache = false
說明:
1、由于本機(jī)的8080已經(jīng)被使用,修改一下端口號(hào)為9001。
2、hibernate.hbm2ddl.auto參數(shù)有四個(gè)值:
create: 每次加載hibernate時(shí)都會(huì)刪除上一次的生成的表,然后根據(jù)你的model類再重新來生成新表,哪怕兩次沒有任何改變也要這樣執(zhí)行,這就是導(dǎo)致數(shù)據(jù)庫(kù)表數(shù)據(jù)丟失的一個(gè)重要原因。
create-drop :每次加載hibernate時(shí)根據(jù)model類生成表,但是sessionFactory一關(guān)閉,表就自動(dòng)刪除。
update:最常用的屬性,第一次加載hibernate時(shí)根據(jù)model類會(huì)自動(dòng)建立起表的結(jié)構(gòu)(前提是先建立好數(shù)據(jù)庫(kù)),以后加載hibernate時(shí)根據(jù) model類自動(dòng)更新表結(jié)構(gòu),即使表結(jié)構(gòu)改變了但表中的行仍然存在不會(huì)刪除以前的行。要注意的是當(dāng)部署到服務(wù)器后,表結(jié)構(gòu)是不會(huì)被馬上建立起來的,是要等 應(yīng)用第一次運(yùn)行起來后才會(huì)。validate :每次加載hibernate時(shí),驗(yàn)證創(chuàng)建數(shù)據(jù)庫(kù)表結(jié)構(gòu),只會(huì)和數(shù)據(jù)庫(kù)中的表進(jìn)行比較,不會(huì)創(chuàng)建新表,但是會(huì)插入新值。
3、show-sql 是否打印出自動(dòng)生產(chǎn)的SQL,方便調(diào)試的時(shí)候查看
4、propertiesspring.thymeleaf.cache=false是關(guān)閉thymeleaf的緩存,不然在開發(fā)過程中修改頁(yè)面不會(huì)立刻生效需要重啟,生產(chǎn)可配置為true。
三、啟動(dòng)類需要添加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;@SpringBootApplicationpublic 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); }}
四、數(shù)據(jù)庫(kù)層代碼
1、實(shí)體類映射數(shù)據(jù)庫(kù)表
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='密碼長(zhǎng)度不能少于6位') private String password; @Column(nullable = false) private int age; //必須有構(gòu)造 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類會(huì)自動(dòng)實(shí)現(xiàn)很多內(nèi)置的方法
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);}
五、業(yè)務(wù)層
service調(diào)用jpa實(shí)現(xiàn)相關(guān)的增刪改查,實(shí)際項(xiàng)目中service層處理具體的業(yè)務(wù)代碼。
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;@Servicepublic 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;@Controllerpublic 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'; }}
七、頁(yè)面
1、列表頁(yè) 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='http://www.aoyou183.cn/bcjs/@{/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='http://www.aoyou183.cn/bcjs/@{/toEdit(id=${user.id})}' rel='external nofollow' >edit</a></td> <td><a th:href='http://www.aoyou183.cn/bcjs/@{/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='http://www.aoyou183.cn/toAdd' rel='external nofollow' rel='external nofollow' th:href='http://www.aoyou183.cn/bcjs/@{/toAdd}' rel='external nofollow' class='btn btn-info'>add</a> </div></div></body></html>
2、新增頁(yè) 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='http://www.aoyou183.cn/bcjs/@{/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 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' name='userName' placeholder='userName'/> </div> </div> <div class='form-group'> <label for='password' >Password</label> <div class='col-sm-10'><input type='password' name='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' name='age' placeholder='age'/> </div> </div> <div class='form-group'> <div class='col-sm-offset-2 col-sm-10'><input type='submit' value='Submit' /> <input type='reset' value='Reset' /> </div> </div> </form></div></body></html>
3、修改頁(yè) 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='http://www.aoyou183.cn/bcjs/@{/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 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' name='userName' th:value='*{userName}' placeholder='userName'/> </div> </div> <div class='form-group'> <label for='password' >Password</label> <div class='col-sm-10'><input type='password' name='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' name='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' /> <a href='http://www.aoyou183.cn/toAdd' rel='external nofollow' rel='external nofollow' th:href='http://www.aoyou183.cn/bcjs/@{/list}' rel='external nofollow' class='btn btn-info'>Back</a> </div> </div> </form></div></body></html>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
