Spring Data JPA简介
Spring Data JPA是Spring Data的一个子项目,使得访问数据库变得很容易,开发中,大量减少了持久层数据库访问的代码量,我们只需要编写一个接口继承Spring Data JPA内部定义的接口便可实现CRUD操作。利用Spring Data JPA实现数据库的访问通常需要四个步骤,也即:(1)创建一个接口,继承Repository或者Repository的子类并指定实体类和ID类型;(2)在创建的接口中添加数据库访问方法(该接口已经从父类中继承了一系列CRUD方法,如果继承的方法满足需求,可不用添加其他方法);(3)配置spring让其为创建的接口生成代理对象——可通过注解利用Java代码配置或者利用XML文件配置;(4)最后进行注入,注入完成便可使用了。这里我们对Spring Data JPA不做过多的介绍,接下来进行Spring Boot整合Spring Data JPA。
1、搭建环境
首先,我们创建(利用的IDE为Eclipse Oxygen)一个springboot项目,并且导入Web、JPA、Oracle数据库依赖,同时修改JDK版本为1.8,此外,添加application.properties配置文件并添加数据库连接配置信息。项目结构如下图所示:
Web、JPA、Oracle数据库依赖的代码如下:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.3</version>
</dependency>
</dependencies>
application.properties配置文件内容如下:
#数据库连接信息
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:orcl
spring.datasource.username=test
spring.datasource.password=test
spring.jpa.database=oracle
spring.jps.showsql=true
2、编写代码
2.1、实体类
首先我们创建实体类Dept,该实体包含deptno、dname、loc三个属性,实现序列号接口,添加get和set方法,并重写toString方法,代码如下:
@Entity
@Table(name="DEPT")
public class Dept implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name="deptno")
private Integer deptno;
@Column(name="dname")
private String dname;
@Column(name="loc")
private String loc;
// 省略get、set和toString()方法
}
2.2、Dao层
创建一个接口DeptDao,继承JpaRepository接口,DeptDao中我们不添加其他方法,代码如下:
@Repository("deptDao")
public interface DeptDao extends JpaRepository<Dept,Integer>{
}
2.3、Service层
(1)创建一个接口DeptService,添加一个方法findDeptById,依据部门编号查询部门信息,代码如下:
public interface DeptService {
public Dept findDeptById(Integer deptno);
}
(2)创建DeptService的实现类DeptServiceImpl,并注入DeptDao。实现方法中直接调用deptDao的findById方法查询部门信息,不做其他逻辑处理,代码如下:
@Service("deptService")
public class DeptServiceImpl implements DeptService{
@Autowired
private DeptDao deptDao;
@Override
public Dept findDeptById(Integer deptno) {
return deptDao.findById(deptno).get();
}
}
2.4、控制器Controller
创建部门控制器DeptController,并注入DeptService,这里设定部门编号为0,之后我们会展示从浏览器中获取部门编号以查询部门信息的写法,代码如下:
@RestController
@RequestMapping("/dept")
public class DeptController {
@Autowired
private DeptService deptService;
@RequestMapping("/getDept")
@ResponseBody
public Dept getDept() {
return deptService.findDeptById(0);
}
}
2.5、Spring Boot启动类
最后,我们需要添加一个Spring Boot启动类StartApplication,在启动类上添加注解@SpringBootApplication并指定扫描的包路径、@EnableJpaRepositories指定JPA接口扫描包路径、@EntityScan指定实体Bean扫描包路径。代码如下:
@SpringBootApplication(scanBasePackages= {"com.don"})
@EnableJpaRepositories(basePackages= {"com.don.dao"})
@EntityScan(basePackages= {"com.don.pojo"})
public class StartApplication {
public static void main(String[] args) {
SpringApplication.run(StartApplication.class, args);
}
}
3、测试
运行启动类的main方法,在浏览器中访问:http://localhost:8080/dept/getDept,返回如下结果:
接下来我们改造一下控制器以接收浏览器传递的参数部门编号,也即使用注解@PathVariable,改造之后的代码如下:
@RestController
@RequestMapping("/dept")
public class DeptController {
@Autowired
private DeptService deptService;
@RequestMapping("/getDept/{deptno}")
@ResponseBody
public Dept getDept(@PathVariable("deptno")Integer deptno) {
return deptService.findDeptById(deptno);
}
}
在浏览器中访问:http://localhost:8080/dept/getDept/10,返回如下结果:
至此,Spring Boot 整合Spring Data JPA的简单案例就算完成了。
4、总结
Spring Boot整合Spring Data JPA极大的减少了代码量,确切的说应该是Spring Data JPA为我们实现了DAO层,从而减少了DAO层访问数据库的代码量。如果我们需要实现复杂的数据库访问,这需要我们从新定义接口方法,通常就不会减少DAO层的代码量。Spring Boot整合与纯Spring Data JPA开发相比开发步骤少了编写配置文件这一步,这已经为我们的开发带来很大的方便。
代码链接地址:https://pan.baidu.com/s/1fKeWSZOTZ_BXQ4EAwmqIXA 提取码:h8kc