博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA入门[20]-Spring Data JPA简单示例
阅读量:6849 次
发布时间:2019-06-26

本文共 6026 字,大约阅读时间需要 20 分钟。

Spring 对 JPA 的支持已经非常强大,开发者只需关心核心业务逻辑的实现代码,无需过多关注 EntityManager 的创建、事务处理等 JPA 相关的处理。Spring Data JPA更是能够根据方法名字自动实现持久层。

目标

这次我们的目标还是实现前面几节的功能,即对Category的数据层操作。完整和的代码结构:

首先添加实体类Category.java

Entity@Table(name = "Category")public class Category implements Serializable {    @Override    public String toString() {        return "id="+id+" name="+name;    }    private Integer id;    @Id    public Integer getId() {        return id;    }    public void setId(Integer id) {        this.id = id;    }    private  String name;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}

  

引入JPA

JPA 规范要求,配置文件必须命名为 persistence.xml,并存在于类路径下的 META-INF 目录中。该文件通常包含了初始化 JPA 引擎所需的全部信息。Spring 提供的 LocalContainerEntityManagerFactoryBean 提供了非常灵活的配置,persistence.xml 中的信息都可以在此以属性注入的方式提供。

org.hibernate.ejb.HibernatePersistence
demoJPA.entity.Category

  

实现数据持久层

接下来到了最核心的部分,就是对于数据持久层的支持。使用 Spring Data JPA 进行持久层开发大致需要的三个步骤:

1.首先引入依赖,这里主要用到spring data commons和spring data jpa两个包。

org.springframework.data
spring-data-commons
1.13.3.RELEASE
org.springframework.data
spring-data-jpa
1.11.3.RELEASE

完整的pom:

4.0.0
DemoStore
DemoJPA
1.0-SNAPSHOT
3.5.6-Final
5.0.1.Final
org.springframework.data
spring-data-commons
1.13.3.RELEASE
org.springframework.data
spring-data-jpa
1.11.3.RELEASE
org.springframework
spring-test
4.3.5.RELEASE
junit
junit
4.12
mysql
mysql-connector-java
5.1.30
org.hibernate
hibernate-core
${hibernate.version}
org.hibernate
hibernate-entitymanager
${hibernate.version}
org.hibernate.common
hibernate-commons-annotations
${hibernate.annotations.version}
org.hibernate.javax.persistence
hibernate-jpa-2.0-api
1.0.1.Final

  

2.声明持久层接口 CategoryDao继承 Repository 接口。Spring Data JPA 在后台为持久层接口创建代理对象时,会解析方法名字,并自动实现相应的功能。

public interface CategoryDao extends Repository
{ void save(Category category); Iterable
findAll(); long count(); void delete(int id);}

  

3.在 Spring 配置文件中增加一行声明,让 Spring 为声明的接口创建代理对象。配置了 <jpa:repositories> 后,Spring 初始化容器时将会扫描 base-package 指定的包目录及其子目录,为继承 Repository 或其子接口的接口创建代理对象,并将代理对象注册为 Spring Bean,业务层便可以通过 Spring 自动封装的特性来直接使用该对象。

  

使用 @Query 创建查询

除了通过解析方法名实现功能外,开发者还可以直接在声明的方法上面使用 @Query 注解,并提供一个查询语句作为参数。Spring Data JPA 在创建代理对象时,便会用提供的查询语句来实现其功能。

@Query 注解的使用非常简单,只需在声明的方法上面标注该注解,同时提供一个 JPQL 查询语句即可。JPQL 语句中通过": 变量"的格式来指定参数,同时在方法的参数前面使用 @Param 将方法参数与 JP QL 中的命名参数对应。

@Query("from Category where id=:id")    Category findOne(@Param("id") int id);

开发者也可以通过使用 @Query 来执行一个更新操作,为此,我们需要在使用 @Query 的同时,用 @Modifying 来将该操作标识为修改查询,这样框架最终会生成一个更新的操作,而非查询。

@Transactional    @Modifying    @Query("update Category  set name=:name where id=:id")    void updateName(@Param("id")int id,@Param("name")String name);

  

单元测试

@ContextConfiguration(locations = "classpath:applicationContext.xml")@RunWith(SpringJUnit4ClassRunner.class)public class testJpa {    int id=5;    @Autowired    private CategoryDao categoryDao;    @Test    public void testSave(){        Category category=new Category();        category.setId(id);        category.setName("test");        categoryDao.save(category);    }    @Test    public void testUpdateName(){        String name="test111";        categoryDao.updateName(id,name);    }    @Test    public void testFindById(){        Category category=categoryDao.findOne(id);        System.out.println(category);    }    @Test    public void count(){        long count=categoryDao.count();        System.out.println(count);    }    @Test    public void testFindAll(){        Iterable
categories=categoryDao.findAll(); for(Category category:categories){ System.out.println(category); } } @Test public void delete(){ categoryDao.delete(id); }}

 

源码地址:  

参考资料:

  • 《Spring实战》

转载地址:http://ixrul.baihongyu.com/

你可能感兴趣的文章
9.ORM数据访问
查看>>
href=“javascript:”vs href=“javascript:void(0)”
查看>>
win10文件夹无法打开,双击闪屏
查看>>
【学习笔记14】全局类型转换器
查看>>
Spring Boot学习记录手册<1>
查看>>
在Word2007和Word2010中插入视频文件,并自动在word中播放
查看>>
javascript设置http请求的头信息
查看>>
C++调用java开启远程调试
查看>>
struts2与ajax交互
查看>>
Linux Shell脚本中点号和source命令
查看>>
Unix常用基本数据类型
查看>>
索尼竟用人工智能写了两首流行歌
查看>>
私有云portal
查看>>
Hadoop-环境搭建
查看>>
远程登录ssh免密码
查看>>
Linux下map hash_map和unordered_map效率比较
查看>>
Python学习笔记(二)网络编程的简单示例
查看>>
RabbitMQ 安装和配置
查看>>
Java8新特性之:Optional
查看>>
Redis简单介绍之(安装篇)
查看>>