1.什么是JPA
JPA(Java Persistence API)是Sun官方提出的Java持久化规范。它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据。他的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在Hibernate,TopLink,JDO等ORM框架各自为营的局面。
注意:JPA是一套规范,不是一套产品,那么像Hibernate,TopLink,JDO他们是一套产品,如果说这些产品实现了这个JPA规范,那么我们就可以叫他们为JPA的实现产品。
2.Spring Data JPA
Spring Data JPA 是 Spring 基于 ORM 框架、JPA 规范的基础上封装的一套JPA应用框架,可使开发者用极简的代码即可实现对数据的访问和操作。它提供了包括增删改查等在内的常用功能,且易于扩展!学习并使用 Spring Data JPA 可以极大提高开发效率!spring data jpa让我们解脱了DAO层的操作,基本上所有CRUD都可以依赖于它来实现。
3.快速开发一个案例
3.1 pom文件引入相关依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--自定义连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
3.2 在yml配置文件中 进行配置
spring: datasource: username: root password: 123456 url: jdbc:mysql://192.168.0.157:3306/db1 driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource # 数据源其他配置 #初始化大小,最小,最大 initialSize: 5 minIdle: 5 maxActive: 20 # 配置获取连接等待超时的时间 maxWait: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 timeBetweenEvictionRunsMillis: 60000 # 配置一个连接在池中最小生存的时间,单位是毫秒 minEvictableIdleTimeMillis: 300000 validationQuery: SELECT 1 FROM DUAL testWhileIdle: true testOnBorrow: false testOnReturn: false poolPreparedStatements: true # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 filters: stat,wall,log4j maxPoolPreparedStatementPerConnectionSize: 20 useGlobalDataSourceStat: true connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500 jpa: hibernate: ddl-auto: update #第一次建表create 后面用update,要不然每次重启都会新建表 show-sql: true mybatis: config-location: classpath:mapping/mybatis-config.xml mapper-locations: classpath:mapping/modules/*.xml
3.3 创建一个entity
@Entity //告诉jpa这是一个实体类 @Table(name = "gy_user") //指定和哪个数据表对应 @JsonIgnoreProperties(value = {"hibernateLazyInitializer", "handler"}) public class UserPO { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) //自增主键 private Integer id; @Column(name = "user_name", length = 50) private String userName; @Column private String password;
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class操作数据库的过程中会出现这样一个异常,
导致这异常的原因是实体类中有的字段值为null,所以在json化的时候,fasterxml.jackson将对象转换为json报错
在实体类上面加上注解 @JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" }) 解决这个问题
3.4 创建DAO
import com.meng.demo.entity.UserPO;
import org.springframework.data.jpa.repository.JpaRepository;
/*
* 我们在这里直接继承 JpaRepository
* 这里面已经有很多现场的方法了
* 这也是JPA的一大优点
*
* */
public interface UserMapper extends JpaRepository<UserPO, Integer> {
}
3.5 Controller类
@GetMapping("/user") public UserPO userInset(UserPO userPO){ userMapper.save(userPO); return userPO; } @GetMapping("/user/{id}") public UserPO getUser(@PathVariable("id") Integer id){ return userMapper.getOne(id); }
这里我们可以看到userMapper接口继承了很多方法
4.启动项目
在启动日志中我们可以看到
数据表会自动创建,此时我们查看数据库
5.测试访问
在浏览器中访问我们写的测试方法
新增一条数据:http://localhost:8080/user?userName=%E6%B5%8B%E8%AF%9501&password=123
查询一条数据:http://localhost:8080/user/1
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class