Spring data jpa的简单使用

前言

一直以来用的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,这样的好处是提高了开发的效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值