• 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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    3、IGoodsDao

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

    @Repository
    public interface IGoodsDao extends CrudRepository<GoodsDo,Long> {
    }
    
    • 1
    • 2
    • 3

    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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    三、项目结构及单元测试

    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());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    在这里插入图片描述
    在这里插入图片描述

    3、源码下载

    源码奉上,欢迎star!
    MyIdea

  • 相关阅读:
    45、DVGO
    陪诊小程序系统平台功能模式
    android: Preferences DataStore 和 Proto DataStore use guide
    Visual Studio Code通过SSH进行远程开发及调试的方法
    数据恢复篇:适用于MacOS的顶级数据恢复软件
    SpringMvc之JSON和全程异常处理
    Stream学习2
    mysql“数据不存在插入,存在则更新”实现
    Java Remote Method Invocation (RMI)
    [.NET项目实战] Elsa开源工作流组件应用(二):内核解读
  • 原文地址:https://blog.csdn.net/jike11231/article/details/133435953