最近忙里偷闲,想写一点关于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 {@Autowiredprivate IGoodsDao goodsDao;@Overridepublic void add(GoodsDo goods) {goodsDao.save(goods);}@Overridepublic void remove(Long id) {goodsDao.deleteById(id);}@Overridepublic void edit(GoodsDo goods) {goodsDao.save(goods);}@Overridepublic Optional<GoodsDo> getById(Long id) {return Optional.empty();}@Overridepublic Iterable<GoodsDo> getList() {return null;}
}
5、GoodsController
@RestController
public class GoodsController {@Autowiredprivate 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、JpaApplicationTests
@SpringBootTest
public class JpaApplicationTests {@Autowiredprivate IGoodsDao goodsDao;/*** 新增测试*/@Testpublic void testAdd() {GoodsDo goods = new GoodsDo();goods.setName("大力金刚丹");goods.setDescription("金刚丹活血化瘀");goods.setPrice("18888");GoodsDo result = goodsDao.save(goods);System.out.println("新增商品id:" + result.getId());}
}
3、源码下载
源码奉上,欢迎star!
MyIdea