Spring Boot中JpaRepository(和CrudRepository有什么区别)

背景

再看一个demo,是说springboot整合数据源,也可以说是整合Dao层.
这里用了Spring-data-jpa.

先说一下jpa是什么?

JPA(java peersistence api),它并不是一个框架,而是一组规范。
其中,Hibernate就实现了这个规范.

框架使用了这个规范,对和数据库的交互做了一些底层的封装,比如我们的sql语句,怎么从数据库获取所需的数据?其实很多框架都可以做这个事情,我们熟悉的mybatis,那个熟悉的组件,sqlSessionFactory都记得吧,无非就是建立了一个通道,把我们在程序中写的按照框架的规范的sql语句转化成数据库引擎可以解析的sql,这样就实现了我们想要的功能。

底层代码都差不多.

springboot整合jpa的过程,也是这个道理.但springboot的版本升级太快,版本的问题带来的就是组件之间的兼容性问题,2.x之后和2.x之前的整合多少有些不太相似的地方,就导致整合时候各种奇葩的问题.

CrudRepository与JpaRepository的区别

自学Spring Boot的时候看视频上在介绍Spring Data JPA的时候,用的是JpaRepository接口,但看很多的博客用的是CrudRepository.
现在研究下两者的关系:
下面这两个接口代码和关系图我copy过来以作记录

@NoRepositoryBean
public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> {
    <S extends T> S save(S var1);
    <S extends T> Iterable<S> save(Iterable<S> var1);
    T findOne(ID var1);
    boolean exists(ID var1);
    Iterable<T> findAll();
    Iterable<T> findAll(Iterable<ID> var1);
    long count();
    void delete(ID var1);
    void delete(T var1);
    void delete(Iterable<? extends T> var1);
    void deleteAll();
}
@NoRepositoryBean
public interface JpaRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
    List<T> findAll();
    List<T> findAll(Sort var1);
    List<T> findAll(Iterable<ID> var1);
    <S extends T> List<S> save(Iterable<S> var1);
    void flush();
    <S extends T> S saveAndFlush(S var1);
    void deleteInBatch(Iterable<T> var1);
    void deleteAllInBatch();
    T getOne(ID var1);
    <S extends T> List<S> findAll(Example<S> var1);
    <S extends T> List<S> findAll(Example<S> var1, Sort var2);
}

看下他们的继承关系:
在这里插入图片描述
事实上,CrudRepository和PagingAndSortingRepository由Spring Data提供;JpaRepository 由Spring Data JPA提供,而Spring Data JPA又是Spring Data的一个子项目,这就是两者的关系。通常,最好的想法是使用 CrudRepository 或 PagingAndSortingRepository, 具体取决于是否需要排序和分页。如果可能,应该避免使用 JpaRepository ,因为它将存储库与JPA持久性技术联系起来,并且在大多数情况下,我们甚至可能不会使用它提供的额外方法。

用的结构不同,实现的写法也不一样.

参考:https://blog.csdn.net/xuemengrui12/article/details/80525227.

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,针对你的问题,我可以为你提供一些思路和建议。 首先,你需要明确购物车功能的需求和实现方式。购物车功能通常需要记录用户选择的商品信息、数量、价格等,并提供添加、修改、删除购物车商品等操作。 在技术实现方面,你可以选择使用 Spring Boot 框架搭建项目,并集成 MariaDB 数据库和 JPA 框架实现数据持久化。具体步骤可以参考以下流程: 1. 创建 Spring Boot 项目,并添加相关依赖,如 Spring Boot Web、Spring Data JPA、MariaDB 驱动等。 2. 创建商品和购物车实体类,并使用 JPA 注解定义实体属性和关联关系。如: 商品实体类: ``` @Entity @Table(name = "product") public class Product { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(nullable = false) private String name; @Column(nullable = false) private BigDecimal price; // 省略其他属性和方法 } ``` 购物车实体类: ``` @Entity @Table(name = "cart") public class Cart { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @ManyToOne @JoinColumn(name = "user_id", nullable = false) private User user; @ManyToOne @JoinColumn(name = "product_id", nullable = false) private Product product; @Column(nullable = false) private Integer quantity; // 省略其他属性和方法 } ``` 3. 创建用户实体类,并添加购物车属性和关联关系。如: 用户实体类: ``` @Entity @Table(name = "user") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(nullable = false) private String username; @OneToMany(mappedBy = "user") private List<Cart> carts = new ArrayList<>(); // 省略其他属性和方法 } ``` 4. 创建商品和购物车的 Repository 接口,并继承 JPA 的 CrudRepository 接口实现数据访问和操作。如: 商品 Repository 接口: ``` public interface ProductRepository extends CrudRepository<Product, Long> { // 省略自定义方法 } ``` 购物车 Repository 接口: ``` public interface CartRepository extends CrudRepository<Cart, Long> { List<Cart> findByUser(User user); } ``` 5. 创建商品和购物车的 Service 类,并注入对应的 Repository 实现业务逻辑。如: 商品 Service 类: ``` @Service public class ProductService { @Autowired private ProductRepository productRepository; // 省略自定义方法 } ``` 购物车 Service 类: ``` @Service public class CartService { @Autowired private CartRepository cartRepository; // 省略自定义方法 } ``` 6. 创建商品和购物车的 Controller 类,并注入对应的 Service 处理 HTTP 请求和响应。如: 商品 Controller 类: ``` @RestController @RequestMapping("/api/products") public class ProductController { @Autowired private ProductService productService; // 省略 HTTP 方法和请求处理 } ``` 购物车 Controller 类: ``` @RestController @RequestMapping("/api/carts") public class CartController { @Autowired private CartService cartService; // 省略 HTTP 方法和请求处理 } ``` 7. 最后,你可以实现购物车功能的具体操作,如添加商品到购物车、修改购物车商品数量、删除购物车商品等。具体实现可以参考以下代码: 添加商品到购物车: ``` @PostMapping("/{productId}/add") public void addToCart(@PathVariable Long productId, @RequestBody Integer quantity, Principal principal) { String username = principal.getName(); User user = userService.findByUsername(username); Product product = productService.findById(productId); Cart cart = cartService.findByUserAndProduct(user, product); if (cart != null) { cart.setQuantity(cart.getQuantity() + quantity); } else { cart = new Cart(); cart.setUser(user); cart.setProduct(product); cart.setQuantity(quantity); } cartService.save(cart); } ``` 修改购物车商品数量: ``` @PutMapping("/{cartId}") public void updateCart(@PathVariable Long cartId, @RequestBody Integer quantity) { Cart cart = cartService.findById(cartId); cart.setQuantity(quantity); cartService.save(cart); } ``` 删除购物车商品: ``` @DeleteMapping("/{cartId}") public void deleteCart(@PathVariable Long cartId) { cartService.deleteById(cartId); } ``` 以上是一个简单的购物车功能的实现思路和代码示例,你可以根据实际需求进行修改和扩展。希望能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值