配置环境
MySQL5.7.22
Spring Data JPA 1.11.1RELEASE
Hibernate 5.2.8.Final
MySQL Connercor/J 5.1.41
配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.waylau.spring.boot.blog</groupId>
<artifactId>jpa-in-action</artifactId>
<version>1.0.0</version>
<name>jpa-in-action</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<!-- thymeleaf版本及方言版本 -->
<thymeleaf.version>3.0.3.RELEASE</thymeleaf.version>
<thymeleaf-layout-dialect.version>2.2.0</thymeleaf-layout-dialect.version>
<!-- 自定义Hibernate版本 -->
<hibernate.version>5.2.8.Final</hibernate.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!--
热部署
optional=true 依赖不会传递,该项目依赖devtools
之后依赖该项目的项目如果想要使用devtools,需要重新引入
-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- 布局 -->
<dependency>
<groupId>nz.net.ultraq.thymeleaf</groupId>
<artifactId>thymeleaf-layout-dialect</artifactId>
</dependency>
<!-- Spring Data JPA 自带的Hibernate版本不使用 自定义Hibernate版本 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- MySQL 版本5.1.41 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 内嵌H2 数据库 版本1.4.193 运行时 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
修改User实体如下
package com.waylau.spring.boot.blog.domain;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
/**
* 用户实体
* @author Administrator
*/
@Entity//实体
public class User {
@Id//主键
@GeneratedValue(strategy = GenerationType.IDENTITY)//主键的生成策略(自增)
private Long id;//实体一个唯一标识
private String name;
private String email;
protected User(){}//无参构造 设为protected防止直接使用
public User(Long id, String name, String email) {
this.id = id;
this.name = name;
this.email = email;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", email=" + email + "]";
}
}
修改接口UserRepository如下:
package com.waylau.spring.boot.blog.repository;
import org.springframework.data.repository.CrudRepository;
import com.waylau.spring.boot.blog.domain.User;
/**
* 用户接口
* @author Administrator
*/
public interface UserRepository extends CrudRepository<User, Long>{
}
JPA提供了自带的实现,所以将之前的实现类UserRepositoryImpl删除
修改控制器UserController如下:
package com.waylau.spring.boot.blog.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
import com.waylau.spring.boot.blog.domain.User;
import com.waylau.spring.boot.blog.repository.UserRepository;
/**
* User 控制器
* @author Administrator
*
*/
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserRepository userRepository;
/**
* 查询所有用户
* @param model
* @return
*/
@GetMapping
public ModelAndView list(Model model){
model.addAttribute("userList", userRepository.findAll());
model.addAttribute("title", "用户管理");
//String viewName, String modelName, Object modelObject
return new ModelAndView("users/list", "userModel", model);
}
/**
* 根据id查询用户
* @param id
* @param model
* @return
*/
@GetMapping("{id}")
public ModelAndView view(@PathVariable("id") Long id, Model model){
User user = userRepository.findOne(id);
model.addAttribute("user", user);
model.addAttribute("title", "查看用户");
//String viewName, String modelName, Object modelObject
return new ModelAndView("users/view", "userModel", model);
}
/**
* 获取创建用户的界面
* @param model
* @return
*/
@GetMapping("/form")
public ModelAndView createForm(Model model){
model.addAttribute("user", new User(null,null,null));
model.addAttribute("title", "创建用户");
//String viewName, String modelName, Object modelObject
return new ModelAndView("users/form", "userModel", model);
}
/**
* 新建用户
* @param user
* @return
*/
@PostMapping
public ModelAndView saveOrUpdateUser(User user){
user = userRepository.save(user);
return new ModelAndView("redirect:/users");//重定向到list页面
}
/**
* 删除用户
* @param id
* @param model
* @return
*/
@GetMapping("/delete/{id}")
public ModelAndView delete(@PathVariable("id") Long id){
userRepository.delete(id);
return new ModelAndView("redirect:/users");//重定向到list页面
}
/**
* 获取修改用户的界面
* @param id
* @param model
* @return
*/
@GetMapping("/modify/{id}")
public ModelAndView modifyForm(@PathVariable("id") Long id, Model model) {
User user = userRepository.findOne(id);
model.addAttribute("user", user);
model.addAttribute("title", "修改用户");
return new ModelAndView("users/form", "userModel", model);
}
}
由于之前在实体类中将User的无参构造访问权限设置了protected,所以不能再调用new User(),而调用new User(null,null,null)
配置文件如下:
#### thymeleaf配置 #######
spring.thymeleaf.mode=HTML5
# 编码
spring.thymeleaf.encoding=UTF-8
# 类型
spring.thymeleaf.content-type=text/html
# 开发时关闭缓存,不然没法看到实时页面
spring.thymeleaf.cache=false
# 默认路径
spring.thymeleaf.prefix=classpath:/templates/
# 后缀
spring.thymeleaf.suffix=.html
# 启用MVC Thymeleaf视图分辨率
spring.thymeleaf.enabled=true
#使用H2 控制台
spring.h2.console.enabled=true
注意最后一行,可以在控制台查看H2数据库
如上创建了一条数据,可以在如下链接中查看H2数据库 JDBC URL 默认为 jdbc:h2:mem:testdb
连接后,显示如下
若连接本地数据库MySQL则添加部分配置信息如下:
#MySQL数据库
# 服务器端口,如果不配置默认是8080端口
server.port=8080
# 数据库设置
spring.datasource.url=jdbc:mysql://localhost:3306/blog?useSSL=false&serverTimezone=UTC&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#JPA
#控制台输出格式化的sql
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format-sql=true
#每次程序结束的时候会清空表
spring.jpa.hibernate.ddl-auto=create-drop
启动SpringBoot 其中部分信息部分如下
Hibernate: drop table if exists user
Hibernate: create table user (id bigint not null auto_increment, email varchar(255), name varchar(255), primary key (id))
访问页面如下:
注意:这时候,已经有了MySQL数据库,则H2内存数据库就查询不到了