上一篇:springboot 1.5.4 集成JdbcTemplate(六)

1      Spring Boot使用Spring-Data-JPA访问数据库

spring boot整合jdbcTemplate项目源码:

spring-boot相关项目源码,

码云地址:https://git.oschina.net/wyait/springboot1.5.4.git

github地址https://github.com/wyait/spring-boot-1.5.4.git


1.1  Sping data JPA简介

关于Spring Data jpa这里就不详细做说明,只简单的介绍一下:

 

由于Spring-data-jpa依赖于Hibernate。如果您对Hibernate有一定了解,下面内容可以毫不费力的看懂并上手使用Spring-data-jpa。如果您还是Hibernate新手,您可以先按如下方式入门,再建议回头学习一下Hibernate以帮助这部分的理解和进一步使用。

 

在实际开发过程中,对数据库的操作无非就“增删改查”。就最为普遍的单表操作而言,除了表和字段不同外,语句都是类似的,开发人员需要写大量类似而枯燥的语句来完成业务逻辑。

 

为了解决这些大量枯燥的数据操作语句,我们第一个想到的是使用ORM框架,比如:Hibernate。通过整合Hibernate之后,我们以操作Java实体的方式最终将数据改变映射到数据库表中。

 

为了解决抽象各个Java实体基本的“增删改查”操作,我们通常会以泛型的方式封装一个模板Dao来进行抽象简化,但是这样依然不是很方便,我们需要针对每个实体编写一个继承自泛型模板Dao的接口,再编写该接口的实现。虽然一些基础的数据访问已经可以得到很好的复用,但是在代码结构上针对每个实体都会有一堆Dao的接口和实现。

 

由于模板Dao的实现,使得这些具体实体的Dao层已经变的非常“薄”,有一些具体实体的Dao实现可能完全就是对模板Dao的简单代理,并且往往这样的实现类可能会出现在很多实体上。Spring-data-jpa的出现正可以让这样一个已经很“薄”的数据访问层变成只是一层接口的编写方式

 

1.2  Spring Data的核心接口Repository

Repository,它不提供任何方法,开发者需要在自己定义的接口中声明需要的方法:

 

 public interface Repository<T, ID extendsSerializable> { }

1. Repository是一个空接口,即是一个标记接口;

2. 若我们定义的接口继承了Repository,则该接口会被IOC容器识别为一个Repository Bean纳入到IOC容器中,进而可以在该接口中定义满足一定规范的方法。

3. 实际上也可以通过@RepositoryDefinition,注解来替代继承Repository接口。

4. 查询方法以find | read | get开头;

5. 涉及查询条件时,条件的属性用条件关键字连接,要注意的是条件属性以首字母大写。

6. 使用@Query注解可以自定义JPQL语句实现更灵活的查询。

 

CrudRepository 接口提供了最基本的对实体类的添删改查操作

      --T save(T entity);//保存单个实体   

       --Iterable<T> save(Iterable<?extends T> entities);//保存集合        

       --T findOne(ID id);//根据id查找实体         

       --boolean exists(ID id);//根据id判断实体是否存在         

       --Iterable<T> findAll();//查询所有实体,不用或慎用!         

       --long count();//查询实体数量         

       --void delete(ID id);//根据Id删除实体         

       --void delete(T entity);//删除一个实体   

       --void delete(Iterable<? extends T>entities);//删除一个实体的集合         

       --void deleteAll();//删除所有实体,不用或慎用!   

PagingAndSortingRepository接口

该接口提供了分页与排序功能  

   --Iterable<T>findAll(Sort sort); //排序   

--Page<T> findAll(Pageable pageable); //分页查询(含排序功能)

JpaRepository:查找所有实体,排序、查找所有实体,执行缓存与数据库同步

 

JpaSpecificationExecutor:不属于Repository体系,实现一组 JPACriteria 查询相关的方法,封装  JPACriteria 查询条件。通常使用匿名内部类的方式来创建该接口的对象。

 

自定义 Repository:可以自己定义一个MyRepository接口。

 

1.3  Spring Boot集成Spring-Data-JPA实现

   pom中引入Spring-Data-JPA依赖

<dependency>

         <groupId>org.springframework.boot</groupId>

         <artifactId>spring-boot-starter-data-jpa</artifactId>

      </dependency>

   数据源沿用JdbcTemplate配置,新添加hbm2ddl配置:

#   配置数据源

spring.datasource.url=jdbc:mysql://localhost:3306/test

spring.datasource.username=root

spring.datasource.password=123456

spring.datasource.driver-class-name=com.mysql.jdbc.Driver

# hbm2ddl 数据表和实体类映射生成配置

spring.jpa.properties.hibernate.hbm2ddl.auto=create-drop

spring.jpa.properties.hibernate.hbm2ddl.auto是hibernate的配置属性,其主要作用是:自动创建、更新、验证数据库表结构。该参数的几种配置如下:

  • create:每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。

  • create-drop:每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。

  • update:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才会。

  • validate:每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。

   新建实体类Cat,并添加映射注解

创建一个Cat实体,包含id(主键)、name(姓名)、age(年龄)属性,通过ORM框架其会被映射到数据库表中,由于配置了hibernate.hbm2ddl.auto,在应用启动的时候框架会自动去数据库中创建对应的表。


@Entity//映射表

public class Cat {

   @Id//主键

   @GeneratedValue//主键生成策略

   privateLong id;

   @Column(nullable= false)

   privateString name;

   @Column

   privateInteger age;

   //无参构造

   //带参构造[一定要写无参构造]

   编写Dao实现

public interface CatRepositoryextends JpaRepository<Cat, Long> {

   CatfindByName(String name);

 

   @Query("fromCat c where c.name=:name and c.age=:age")

   CatfindCat(@Param("name") String name, @Param("age") Integerage);

 

}

   编写ServiceCatServiceCatServiceImpl //TODO

   @Autowired

   privateCatRepository catRepository;

 

   @Override

   publicCat findCat(String name) {

      this.catRepository.save(newCat("张三", 27));

      this.catRepository.save(newCat("王五", 27));

      this.catRepository.save(newCat("赵六", 26));

      this.catRepository.save(newCat("呵呵", 27));

      this.catRepository.save(newCat("哈哈", 29));

      this.catRepository.save(newCat("李白", 7));

 

      returnthis.catRepository.findCat(name,7);

   }

 

   @Override

   publicCat findByName(String name) {

      returnthis.catRepository.findByName(name);

   }

   编写Controller

@Controller

public class CatController {

   @Autowired

   privateCatService catService;

 

   /**

    *

    * @描述:查询cat数据

    * @创建人:wyait

    * @创建时间:2017627下午3:54:20

    * @return

    */

   @RequestMapping("/findCat")

   @ResponseBody

   publicCat findUser() {

      Cat c = this.catService.findCat("李白");

      returnc;

   }

 

   /**

    *

    * @描述:查询cat数据

    * @创建人:wyait

    * @创建时间:2017627下午3:54:20

    * @return

    */

   @RequestMapping("/findByName")

   @ResponseBody

   publicCat findByName() {

      Catc = this.catService.findByName("张三");

      returnc;

   }

}

 

   启动,测试:

查看数据库:自动生成cat

spring boot 1.5.4 集成spring-Data-JPA(七)_springboot1.5.4

访问:http://127.0.0.1:8080/findCat

spring boot 1.5.4 集成spring-Data-JPA(七)_springboot_02spring boot 1.5.4 集成spring-Data-JPA(七)_springboot1.5.4_03

cat数据表:

spring boot 1.5.4 集成spring-Data-JPA(七)_springboot集成jdbcTemp_04

 

1.4  Spring-data-jpa总结

Spring-data-jpa中,只需要编写类似上面这样的接口就可实现数据访问。不再像我们以往编写了接口时候还需要自己编写接口实现类,直接减少了我们的文件清单(mapper.xml)。

 

下面对上面的CatRepository做一些解释,该接口继承自JpaRepository,通过查看JpaRepository接口的API文档,可以看到该接口本身已经实现了创建(save)、更新(save)、删除(delete)、查询(findAllfindOne)等基本操作的函数,因此对于这些基础操作的数据访问就不需要开发者再自己定义。

 

在上例中,我们可以看到下面一个函数:

 

    Cat  findByName(String name)

 

它实现了按name查询Cat实体,可以看到我们这里没有任何类SQL语句就完成了条件查询方法。这就是Spring-data-jpa的一大特性:通过解析方法名创建查询。

 

除了通过解析方法名来创建查询外,它也提供通过使用@Query 注解来创建查询,您只需要编写JPQL语句,并通过类似“:name”来映射@Param指定的参数,就像例子中的findCat函数一样。

 

Spring-data-jpa的能力远不止本文提到的这些,由于本文主要以整合介绍为主,对于Spring-data-jpa的使用只是介绍了常见的使用方式。诸如@Modifying操作、分页排序、原生SQL支持以及与SpringMVC的结合使用等等内容就不在本文中详细展开。


项目源码,

码云地址:https://git.oschina.net/wyait/springboot1.5.4.git

github地址:https://github.com/wyait/spring-boot-1.5.4.git


spring boot系列文章:

spring boot 1.5.4 概述(一)

spring boot 1.5.4入门和原理(二)

spring boot 1.5.4 之web开发(三)

spring boot 1.5.4 整合JSP(四)

spring boot 1.5.4 集成devTools(五)

spring boot 1.5.4 集成JdbcTemplate(六)

spring boot 1.5.4 集成spring-Data-JPA(七)

spring boot 1.5.4 配置文件详解(八)

spring boot 1.5.4 统一异常处理(九)

spring boot 1.5.4 定时任务和异步调用(十)

spring boot 1.5.4 整合log4j2(十一)

spring boot 1.5.4 整合 mybatis(十二)

spring boot 1.5.4 整合 druid(十三)

spring boot 1.5.4 之监控Actuator(十四)

spring boot 1.5.4 整合webService(十五)

spring boot 1.5.4 整合redis、拦截器、过滤器、监听器、静态资源配置(十六)

spring boot 1.5.4 整合rabbitMQ(十七)

spring boot 1.5.4 集成Swagger2构建Restful API(十八)

spring boot 1.5.9 整合redis(十九