SpringBoot 中使用JPA

最近忙里偷闲,想写一点关于JPA的东西,另外也加深下对JPA的理解,才有了此篇博文。

一、JPA

JPA (Java Persistence API)Java持久化API,是一套Sun公司Java官方制定的ORM 规范(sun公司并没有实现)。

JPA 是一个基于O/R映射的标准规范,所谓规范即只定义标准规则(如注解、接口),不提供实现,软件提供商可以按照标准规范来实现,而使用者只需按照规范中定义的方式来使用,而不用和软件提供商的实现打交道。Spring Data Jpa则是在JPA之上添加另一层抽象(Repository层的实现),极大地简化持久层开发及ORM框架切换的成本

JPA的出现有两个原因:

(1)简化现有Java EE和Java SE应用的对象持久化的开发工作; Sun希望整合对ORM技术,实现持久化领域的统一。

(2)JPA的主要实现有Hibernate、EclipseLink 和OpenJPA 等,这也意味着我们只要使用JPA来开发,无论是哪一个开发方式都是一样的。

JPA作用通过对象来操作数据库(不用编写sql语句)好处不同的数据库的SQL语法是有差异,如果不需要编写SQL语句,就可以屏蔽各种数据库SQL的差异

二、项目实例

1、GoodsDo

import lombok.Data;
import javax.persistence.*;

/**
 * 商品类
 *
 * 对应数据库中的goods表
 */
@Entity
@Table(name = "goods")
@Data
public class GoodsDo {
    /**
     * 商品id
     *
     * 该字段对应数据库中的列为主键
     * 主键自增长
     * 对应goods表中的id列
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    /**
     * 商品名称
     *
     * 对应goods表中的name列
     */
    @Column(name = "name")
    private String name;

    /**
     * 商品价格
     *
     * 对应goods表中的price列
     */
    @Column(name = "price")
    private String price;

    /**
     * 商品描述
     *
     * 对应goods表中的pic列
     */
    @Column(name = "description")
    private String description;
}

2、GoodsService

public interface GoodsService {
    /**
     * 新增商品
     */
    void add(GoodsDo goods);

    /**
     * 删除商品
     */
    void remove(Long id);

    /**
     * 编辑商品信息
     */
    void edit(GoodsDo goods);

    /**
     * 按id获取商品信息(Optional是一个包装类,它的内容是空或者包含的对象,所以可以避免空指针问题)
     */
    Optional<GoodsDo> getById(Long id);

    /**
     * 获取商品信息列表
     */
    Iterable<GoodsDo> getList();
}

3、IGoodsDao

通过继承 CrudRepository 实现 CRUD 操作。泛型参数分别为实体类及主键的数据类型。
注意此时已经可以通过 IGoodsDao 对数据库 goods 表进行增删改查操作了。

@Repository
public interface IGoodsDao extends CrudRepository<GoodsDo,Long> {
}

4、GoodsServiceImpl

@Service
public class GoodsServiceImpl implements GoodsService {
    @Autowired
    private IGoodsDao goodsDao;

    @Override
    public void add(GoodsDo goods) {
        goodsDao.save(goods);
    }

    @Override
    public void remove(Long id) {
        goodsDao.deleteById(id);
    }

    @Override
    public void edit(GoodsDo goods) {
        goodsDao.save(goods);
    }

    @Override
    public Optional<GoodsDo> getById(Long id) {
        return Optional.empty();
    }

    @Override
    public Iterable<GoodsDo> getList() {
        return null;
    }
}

5、GoodsController

@RestController
public class GoodsController {
    @Autowired
    private GoodsService goodsService;
    /**
     * 按id获取商品信息
     */
    @GetMapping("/goods/{id}")
    public Optional<GoodsDo> getOne(@PathVariable("id") long id) {
        return goodsService.getById(id);
    }
    /**
     * 获取商品列表
     */
    @GetMapping("/goods")
    public Iterable<GoodsDo> getList() {
        return goodsService.getList();
    }
    /**
     * 新增商品
     */
    @PostMapping("/goods")
    public void add(@RequestBody GoodsDo goods) {
        goodsService.add(goods);
    }
    /**
     * 编辑商品
     */
    @PutMapping("/goods/{id}")
    public void update(@PathVariable("id") Long id, @RequestBody GoodsDo goods) {
        // 修改指定id的博客信息
        goods.setId(id);
        goodsService.edit(goods);
    }
    /**
     * 移除商品
     */
    @DeleteMapping("/goods/{id}")
    public void delete(@PathVariable("id") long id) {
        goodsService.remove(id);
    }
}

三、项目结构及单元测试

1、项目结构

SpringBoot 中使用JPA_第1张图片

2、JpaApplicationTests

@SpringBootTest
public class JpaApplicationTests {
    @Autowired
    private IGoodsDao goodsDao;

    /**
     * 新增测试
     */
    @Test
    public void testAdd() {
        GoodsDo goods = new GoodsDo();
        goods.setName("大力金刚丹");
        goods.setDescription("金刚丹活血化瘀");
        goods.setPrice("18888");
        GoodsDo result = goodsDao.save(goods);
        System.out.println("新增商品id:" + result.getId());
    }
}

SpringBoot 中使用JPA_第2张图片
SpringBoot 中使用JPA_第3张图片

3、源码下载

源码奉上,欢迎star!
MyIdea

你可能感兴趣的:(JPA,spring,boot,JPA)