最近忙里偷闲,想写一点关于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、项目结构
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());
}
}
3、源码下载
源码奉上,欢迎star!
MyIdea