SpringData JPA 的使用和简介

本文介绍了SpringDataJPA的基本概念及使用方法,包括实体定义、Repository接口创建、Service层实现和Controller层处理等内容,并探讨了SpringDataJPA对事务的支持。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    Spring Data JPA


    近日,笔者公司开始的持久层框架全面使用spring data jpa,随着发展,给笔者的感触非常大,从以前的status2到spring MVC 的发展,到mybatis到spring data jpa 的出现,不得不感叹“春”的强大。要想了解spring data jpa,要了解jpa和ORM的基本框架,废话少说,下面我们来逐步讲解。

    JPA: JPA(Java Persistence API)是Sun官方提出的java持久的规范。它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据。它的出现主要是为了简化现有的持久化开发工作和整合ORM技术。结束现在Hibernate、TopLink等ORM框架各自为营的局面。JPA是在充分吸收了现有Hibernate、TopLink等ORM框架的基础上发展起来的,具有易于使用,伸缩性强等优点。

    ORM:通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。本质就是将数据从一种形式转换到另外一种形式。

    

Spring-data-jpa和JPA区别

Spring data jpa是在JPA规范下提供了Repository层的实现,但是使用哪一种ORM需要你来决定。stackoverflow答案。虽然ORM框架都实现了JPA规范,但是在不同的ORM框架之间切换仍然需要编写不同的代码,而通过使用Spring data jpa能够方便大家在不同的ORM框架之间进行切换而不要更改代码。并且spring data jpa 对Repository层封装的很好,也省去了不少的麻烦。

下面是代码:

    1、创建一个entity

@Entity
@Table(name = "test_user")
public class TestUser extends BaseEntity implements Serializable {

    private static final long serialVersionUID = -5679422214158452835L;
    @Id
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid")
    @Column(name = "id")
    private String id;

    @Column(name = "user_name")
    private String user_name;
}

注意点:必须实现系列化接口


2、创建接口继承jpaRepository<x,y>

@Repository
public interface TestUserRepository extends JpaRepository<TestUser, String>{

    @Query(value="SELECT * " +
            " FROM test_user "
            , nativeQuery = true)
    List<TestUser> selectAll();

    @Modifying
    @Transactional
    @Query(value = "INSERT INTO test_user  (user_name) VALUES (?1,?2)", nativeQuery = true)
    int saveTestUser(String name);
}

注意点:这里的x为实体,y为表格的主键对应的类型

3、创建service,业务层去处理业务的逻辑

@Service
public class TestUserService extends CurdService<TestUser, TestUserRepository>{

    @Autowired
    @PersistenceContext
    private EntityManager entityManager;

    public List<TestUser> selectAll(){
        return reposiotry.selectAll();
    }

    public void saveTestUser(String name){
        reposiotry.saveTestUser(name);
    }
}

4、创建controller

@Controller
@RequestMapping("/testUser")
public class TestUserController {

    @Autowired
    private TestUserService testUserService;

    @RequestMapping(value = "/index")
    @ResponseBody
    public JSONResult testUser(){
        JSONResult jsonResult = new JSONResult();
        testUserService.selectAll();
        jsonResult.setSuccess(true);
        return jsonResult;
    }

    @RequestMapping(value = "/save")
    @ResponseBody
    public JSONResult testSaveUser(){
        JSONResult jsonResult = new JSONResult();
        testUserService.saveTestUser("22");
        jsonResult.setSuccess(true);
        return jsonResult;
    }

    @RequestMapping(value = "/split")
    @ResponseBody
    public JSONResult testSprilt(String str){
        JSONResult jsonResult = new JSONResult();
        String[] split = str.split(",");
        for (int i = 0; i<split.length;i++) {
            System.out.println(split[i]);
        }
        jsonResult.setSuccess(true);
        return jsonResult;
    }
}

写到这里,一个实例就出现了,读者们可以自己动手去实践一下。

Spring Data JPA 对事务的支持

默认情况下,Spring Data JPA 实现的方法都是使用事务的。针对查询类型的方法,其等价于 @Transactional(readOnly=true);增删改类型的方法,等价于 @Transactional。可以看出,除了将查询的方法设为只读事务外,其他事务属性均采用默认值。

如果用户觉得有必要,可以在接口方法上使用 @Transactional 显式指定事务属性,该值覆盖 Spring Data JPA 提供的默认值。同时,开发者也可以在业务层方法上使用 @Transactional 指定事务属性,这主要针对一个业务层方法多次调用持久层方法的情况。持久层的事务会根据设置的事务传播行为来决定是挂起业务层事务还是加入业务层的事务。具体 @Transactional 的使用,请参考 Spring的参考文档

希望大家能够多多指正,目前笔者对spring data jpa仅仅停留在使用的阶段,希望能能和大家多交流,互相学习。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值