您的位置:首页 > 编程语言 > Java开发

SpringData JPA 的使用和简介

2018-03-07 15:26 302 查看
    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仅仅停留在使用的阶段,希望能能和大家多交流,互相学习。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: