前言
一直以来用的orm框架都是MyBatis,最近接触到了Hibernate,项目中使用了Spring-Data-Jpa,用了之后发现挺方便的,为了防止遗忘,这里做一个简单的记录。
1、Spring-Data-Jpa介绍
SpringData JPA是spring基于ORM框架、JPA规范的基础上封装的一套JPA应用框架,可以使开发者使用极简的代码实现对数据库的访问和操作。它提供了包括增删改查等在内的基本功能,且易于扩展。
2、Spring Data Jpa使用
(1)pom依赖
这里使用spring-data-jpa+orm的组合,如下:
<!-- spring-data-jpa依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>2.3.4.RELEASE</version>
</dependency>
<!-- orm依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>5.2.11.RELEASE</version>
</dependency>
(2)pojo
@Entity
@Table(name = "person")
public class Person implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "id")
@Getter
@Setter
private String id;
@Column(name = "name")
@Getter
@Setter
private String name;
@Column(name = "address")
@Getter
@Setter
private String address;
@Column(name = "age")
@Getter
@Setter
private int age;
}
上面的@Entity、@Table、@Id、@Column都是spring data jpa的注解。
(3)dao
public interface PersonRepository extends JpaRepository<Person, String>{
List <Person> findByAddress(String address);
}
dao层定义一个接口继承JpaRepository就行了,第一个参数是表对应的实体类,第二个参数是主键的类型。
(4)Service
@Service
public class PersonService {
@Autowired
PersonRepository personRepository;
@Autowired
PersonMapper personMapper;
// 按地址查询
public QueryResponseResult<Person> findByAddress(String address) {
List<Person> pers = personRepository.findByAddress(address);
QueryResult<Person> queryResult = new QueryResult<>();
queryResult.setTotal(pers.size());
queryResult.setList(pers);
return new QueryResponseResult<>(CommonCode.SUCCESS, queryResult);
}
// 添加
public ResponseResult addPerson(Person person) {
Person res = personRepository.save(person);
if (res != null) {
return new ResponseResult(CommonCode.SUCCESS);
}
return new ResponseResult(CommonCode.FAIL);
}
// 修改
public ResponseResult updatePerson(Person person) {
Person res = personRepository.save(person);
if (res != null) {
return new ResponseResult(CommonCode.SUCCESS);
}
return new ResponseResult(CommonCode.FAIL);
}
// 按照id删除
public ResponseResult delPerson(int id) {
Optional<Person> optional = personRepository.findById(Integer.toString(id));
if (optional.isPresent()) {
personRepository.deleteById(Integer.toString(id));
return new ResponseResult(CommonCode.SUCCESS);
}
return new ResponseResult(CommonCode.FAIL);
}
// 分页查询
public QueryResponseResult<Person> queryPersonsPaged(int page, int size) {
if (page <= 0) {
page = 1;
}
if (size <= 5) {
size = 5;
}
//设置分页参数
PageHelper.startPage(page, size);
//获取分页对象
Page<Person> personList = personMapper.findPersonPaged();
//从分页对象中获取查询列表
List<Person> list = personList.getResult();
//条目数
long total = personList.getTotal();
QueryResult<Person> queryResult = new QueryResult<Person>();
queryResult.setTotal(total);
queryResult.setList(list);
return new QueryResponseResult<>(CommonCode.SUCCESS, queryResult);
}
}
因为有个分页查询的方法,所以另外注入了一个MyBatis的Mapper接口用PageHelper来实现分页。
(5)Controller
@RestController
@RequestMapping("/person")
public class PersonController implements PersonControllerApi{
@Autowired
PersonService personService;
@Override
@GetMapping("/list/{address}")
public QueryResponseResult<Person> findPersonsByAddress(@PathVariable("address") String address) {
return personService.findByAddress(address);
}
@Override
@PostMapping("/savePerson")
public ResponseResult addPerson(@RequestBody Person person) {
return personService.addPerson(person);
}
@Override
@PutMapping("/updatePerson")
public ResponseResult updatePerson(@RequestBody Person person) {
return personService.updatePerson(person);
}
@Override
@DeleteMapping("/delPerson/{id}")
public ResponseResult delPerson(@PathVariable("id") Integer id) {
return personService.delPerson(id);
}
@Override
@GetMapping("/list/{page}/{size}")
public QueryResponseResult<Person> queryPersonsPaged(@PathVariable("page")int page,
@PathVariable("size")int size) {
return personService.queryPersonsPaged(page,size);
}
}
3、总结
使用spring data jpa的好处是一些简单的增删改查SQL语句不用我们写,框架帮助我们自动生成。那么在项目中可以这样:简单的SQL使用Hibernate框架自动生成,对于复杂的SQL语句我们可以使用MyBatis来自己写SQL,这样的好处是提高了开发的效率。