这一章主要是集成Spring-data-jpa、h2数据库和mysql数据库,h2数据库这里不多讲,可以参考这篇博文,进行了详细讲解:SpringBoot集成H2数据库
JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
JPA的主要目标之一就是提供更加简单的编程模型:在JPA框架下创建实体和创建Java 类一样简单,没有任何的约束和限制,只需要使用 javax.persistence.Entity进行注释,JPA的框架和接口也都非常简单,没有太多特别的规则和设计模式的要求,开发者可以很容易的掌握。JPA基于非侵入式原则设计,因此可以很容易的和其它框架或者容器集成。
JPA的查询语言是面向对象而非面向数据库的,它以面向对象的自然语法构造查询语句,可以看成是Hibernate HQL的等价物。JPA定义了独特的JPQL(Java Persistence Query Language),JPQL是EJB QL的一种扩展,它是针对实体的一种查询语言,操作对象是实体,而不是关系数据库的表,而且能够支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能够提供的高级查询特性,甚至还能够支持子查询。并且JPA 中能够支持面向对象的高级特性,如类之间的继承、多态和类之间的复杂关系,这样的支持能够让开发者最大限度的使用面向对象的模型设计企业应用,而不需要自行处理这些特性在关系数据库的持久化.
引入Jpa和Mysql的依赖:
pom.xml
<!-- spring-data-jpa的 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!--引入mysql数据库驱动 -->
<dependency> <groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
application.properties的配置:
#mysql数据库参数
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql:///test?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true
spring.datasource.username=root
spring.datasource.password=123456
#spring.jpa的配置
#打印sql语句
spring.jpa.show-sql=true
#hibernate中自动创建删除表
spring.jpa.hibernate.ddl-auto=create-drop
实体类:
( 1 )实体对应关系数据库中的表
(2)每个实体字段对应该表的列
(3)类必须使用@Entity这个注解
(4)必须有无参构造函数
(5)唯一的对象标识符
@Entity
public class User {
// 主键
@Id
// 生成策略,自增策略
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
@Override
public String toString() {
return String.format("User[id=%d,name=%name,email=%email]", id,name,email);
}
public User(Long id, String name, String email) {
super();
this.id = id;
this.name = name;
this.email = email;
}
public User() {
super();
}
dao层:
public interface UserRepository extends CrudRepository<User,Long> {
}
controler层:找不到findone方法,可以使用userRepository.findById(id).orElse(null)方法,这是由于jpa高版本的优化了这个方法,找不到了这个方法,可以使用userRepository.findById(id).get()这个方法的弊端是要判断有没有这个元素,没有的话,就会抛异常,但是userRepository.findById(id).orElse(null)方法不会,不存在就会赋默认值。
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserRepository userRepository;
@GetMapping
public ModelAndView list(Model model) {
model.addAttribute("userList", userRepository.findAll());
model.addAttribute("title", "用户管理");
return new ModelAndView("users/list", "userModel", model);
}
@GetMapping("{id}")
public ModelAndView view(@PathVariable("id") Long id, Model model) {
User user = userRepository.findById(id).orElse(null);
model.addAttribute("user", user);
model.addAttribute("title", "查看用户");
return new ModelAndView("users/view", "userModel", model);
}
@GetMapping("/form")
public ModelAndView createForm(Model model) {
model.addAttribute("user", new User(null,null,null));
model.addAttribute("title", "创建用户");
return new ModelAndView("users/form", "userModel", model);
}
@PostMapping
public ModelAndView saveOrUpdate(User user,Model model) {
user=userRepository.save(user);
return new ModelAndView("redirect:/users", "userModel", model);
}
/**
* 删除用户
* @param id
* @return
*/
@GetMapping(value = "delete/{id}")
public ModelAndView delete(@PathVariable("id") Long id, Model model) {
userRepository.deleteById(id);
model.addAttribute("title", "删除用户");
return new ModelAndView("redirect:/users", "userModel", model);
}
/**
* 修改用户
* @param user
* @return
*/
@GetMapping(value = "modify/{id}")
public ModelAndView modifyForm(@PathVariable("id") Long id, Model model) {
User user = userRepository.findById(id).orElse(null);
model.addAttribute("user", user);
model.addAttribute("title", "修改用户");
return new ModelAndView("users/form", "userModel", model);
}
}
总结:Jpa就是数据持久层API,数据持久层可以理解成需要访问数据库的那一层,对于项目中遇到的问题,先看控制台信息,实在不懂就去百度。