Spring Boot 笔记 四 (数据访问)

  Spring Data 是Spring 的一个子项目, 旨在统一和简化对各类型持久化存储, 而不拘泥于是关系型数据库还是NoSQL 数据存储。无论是哪种持久化存储, 数据访问对象(或称作为DAO,即Data Access Objects)通常都会提供对单一域对象的CRUD (创建、读取、更新、删除)操作、查询方法、排序和分页方法等.

Spring Data的子项目有:

   Commons: 提供共享的基础框架,适合各个子项目使用,支持跨数据库持有化

   Hadoop: 基于spring的Hadoop作业配置和一个pojo编程模型的mapreduce作业

   key-value: 集成了Redis和Riak, 提供多个常用场景下的简单封装

   Document: 集成了文档数据库

   Graph: 集成Neo4j提供强大的基于POJO的编程模型

   Graph Roo AddOn

   JDBC Extensions: 支持oracle RAD,高级队列和高级数据类型

   JPA: 简化创建JPA数据访问层和跨存储的持久层功能

   Mapping: 基于Grails的提供对象映射框架,支持不同的数据库

   Examples: 示例程序,文档和图数据库

   Guidance: 高级文档

Spirng Data Repository抽象

一, Docker

      Docker是一种轻量级容器技术,类似于虚拟机技术.

      是直接运行在当前操作系统之上,也实现了虚拟机技术的资源隔离,性能远远高于虚拟机

      Linux安装: sudo yum update

                        sudo yum install docker

       windows下安装: 是通过Boot2Docker软件实现的,安装前要确认BIOS设置中的CPU虚拟化技术已开启.

     常用命令: docker search 镜像名

                     docker pull 镜像名

                     docker images

                     docker rmi image-id

                     docker run --name container-name -d image-name

                     docker ps

                     docker stop/start container-name/container-id

                     docker logs container-id/container-name

二, Spring Data JPA

  1, 定义数据访问层

     只需定义一个继承JpaRepository的接口即可, JpaRepository源码如下:

 @NoRepositoryBean

public interface JpaRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID> { 

 List<T> findAll(); 

 List<T> findAll(Sort sort); 

 List<T> findAll(Iterable<ID> ids); 

 <S extends T> List<S> save(Iterable<S> entities); 

 void flush(); 

 T saveAndFlush(T entity); 

 void deleteInBatch(Iterable<T> entities); 

 void deleteAllInBatch();

 T getOne(ID id);

   2, 配置使用Spring Data JPA

    通过注解@EnableJpaRepositories来开启Spring Data JPA支持

   3, 定义查询方法

    1), 根据属性查询

        findBy, And, Or, Like, Between等

   2),限制结果集数量: top, first

      e.g. findFirst10ByName

   3), NameQuery查询

   e.g.

           @Entity

           @NameQuery(name="person.findByName","select  * from person where name =?1")

           public class Person{}

    4), @Query查询

    5),更新查询  e.g.

         @Modifying

         @Transactional

         @Query("update person set name=?1")

         int setName(String name);

    6),排序和分页

      sort: findByName(xx,new Sort(Direction.ASC,"age"));

      Page: findByName(xx, new PageRequest(0,10));

      其中page接口可以获得当前页面的记录,总页数,总记录数是否有上一页下一页.

  4, 自定义Repository实现

      1), @NoRepositoryBena

       2), 继承

       3), 方法,dosomething

  5, Spring Boot的支持

   1), jdbc的自动配置

      源码在org.springframework.boot.autoconfigure.jdbc下

    2), 对JPA的自动配置

      源码在 org.springframework.boot.autoconfigure.orm.jpa

   3), Spring Data JPA的自动配置

     源码在: org.springframework.boot.autoconfigure.data.jpa

三, Spring Data Rest

   1, Spring MVC中配置Spring Data Rest

     可通过继承类或加@Import

    e.g.

        @Configuration

        public class xxx extends RepositoryRestMvcConfiguration{}

    或

         @Configuration

         @Import(RepositoryRestMvcConfiguration.class)

         public class  xxxxx{} 

     2, application.properties配置

         spring boot已自动配置了RepositoryRestConfiguration来支持

         只需添加依赖spring-boot-starter-data-rest

         在application.properties中以spring.data.rest为前缀的属性来配置

          e.g.

               spring.data.rest.base-path=

               spring.data.rest.default-page-size= 

      3, Rest测试

        安装Chrome插件Postman REST Client来测试REST

         服务测试: 

            1), jquery

             e.g.  $.ajax({

                          type:"GET",

                          datatype:"json",

                          url:"",

                          success:function(data){}

                     });

    AngularJS:

    $http:get(url);  $http.post(url,data);  $http.put(url,data);  $http.delete(url);

四, 声明式事务

  Spring的事务机制是用同一的机制来处理不同的数据访问技术的事务处理.

 
    数据访问技术        实       现
JDBC DataSourceTransactionManager
JPA JpaTransactionManager
Hibernate HibernateTransactionManager
JDO JdoTransactionManager
分布式事务 JtaTransactionManager

  1,  声明式事务

      @Transactional: 来自org.springframework.transaction.annotation

           表示该方法需要事务支持

       @EnableTransactionManagement

          注解在配置类上开启事务支持

    2, 注解事务

  @Transactional有如下的属性定义事务的行为:

属性 含         义 默认值
propagationtion

定义事务的生命周期

REQUIRED, REQUIRED_NEW

NESTED

SUPPORTS

NOT_SUPPORTED

MANDATORY

REQUIRED
issolation   DEFAULT
timeout   TIMEOUT_DEFAULT
readOnly   false
rollbackFor   Throwable的子类
noRollbackFor   Throwable的子类
     

 

 

五, 数据缓存

    Spring定义了org.springframework.cache.CacheManagement 和

     org.springframework.cache.Cache接口来统一不同的缓存技术.

    1, CacheManager

CacheManager 实现
CacheManager 描    述
SimpleCacheManager 使用简单的Collection来存储缓存, 主要用来测试用途
ConcurrentMapCacheManager 使用XoncurrentMap来存储缓存
NoOpCacheManager 仅测试用途,不会实际存储E缓存
EhCacheCacheManager 使用EhCache
GuavaCacheManager  
HazelcastCacheManager  
JCacheCacheManager  
RedisCacheManager  

   2,  声明式缓存注解

声明式缓存
注解 解释
@Cacheable 在方法执行前先查看是否有缓存,有,则直接返回缓存
@CachePut 无论如何把方法的返回值放到缓存中
@CacheEvict 将一条或多条数据从缓存中删除
@Caching 组合多个注解策略在一个方法上

  3, 开启事务缓存支持

 @EnableCaching即可

六, 非关系型数据库NoSQL

NoSQL是对于与使用关系作为数据管理的数据库系统的统称.

NoSQL有文档存储,图形关系存储,键值对存储.

MongoDB: 基于文档

猜你喜欢

转载自ldaolong.iteye.com/blog/2405779