Spring Data JDBC介绍及实现代码

 更新时间:2018年09月30日 13:40:43   作者:解道  
这篇文章主要介绍了Spring Data JDBC介绍及实现代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

Spring新增了一个新的数据模块:Spring Data JDBC。Spring Data JDBC背后的想法是提供对关系数据库的访问,而无需处理JPA的复杂性。JPA提供延迟加载,缓存和脏跟踪等功能。果你需要这些功能会很很棒,但会让猜测JPA的行为比非JPA更难。

延迟加载可能会在你不需要时触发昂贵的语句,或者它可能会因异常而失败。当你想要比较一个实体的两个版本是哪个变成脏数据时,缓存可能会妨碍你,让你很难找到所有持久性操作都通过的那个点。

Spring Data JDBC目标是实现更简单的模型,不会有缓存,脏数据跟踪或延迟加载。相反,只有在调用数据库方法时才会发出SQL语句。方法返回的对象会完全加载,不会有延迟。实体没有“会话”和代理。所有这些都应该使Spring Data JDBC更易于推理。

当然,这种更简单的方法会导致约束。

我们来看一个简单的例子。

首先,我们需要一个实体:

class Customer {
  @Id
  Long id;
  String firstName;
  LocalDate dob;
}

请注意,不需要getter或setter。如果您意,可以增加。实际上,唯一的要求是实体有一个注释的属性Id(即@org.springframework.data.annotation.Id,注意不是javax.persistence,后者是JPA)。

接下来,我们需要声明一个存储库。最简单的方法是扩展CrudRepository:

interface CustomerRepository extends CrudRepository<Customer, Long> {}

最后,我们需要配置ApplicationContext以启用存储库的创建:

@Configuration
@EnableJdbcRepositories (1)
public class CustomerConfig extends JdbcConfiguration { (2)

  @Bean
  NamedParameterJdbcOperations operations() { (3)
    return new NamedParameterJdbcTemplate(dataSource());
  }

  @Bean
  PlatformTransactionManager transactionManager() { (4)
    return new DataSourceTransactionManager(dataSource());
 }

  @Bean
  DataSource dataSource(){ (5)
    return new EmbeddedDatabaseBuilder()
        .generateUniqueName(true)
        .setType(EmbeddedDatabaseType.HSQL)
        .addScript("create-customer-schema.sql")
        .build();
  }
}

让我们一步一步地解释。

1. EnableJdbcRepositories可以创建存储库。由于它需要存在一些bean,我们需要其余的配置。

2. 继承扩展的JdbcConfiguration将一些默认bean添加到ApplicationContext。可以覆盖其方法以自定义Spring Data JDBC的某些行为。现在,我们使用默认实现。

3. 真正重要的部分是NamedParameterJdbcOperations,它在内部用于向数据库提交SQL语句。

4. 严格来说,事务管理器不是必需的。不支持跨越多个SQL语句的事务。

5. Spring Data JDBC没有直接使用DataSource,但是,由于TransactionManager和NamedParameterJdbcOperations需要,将DataSource注册为bean是一种确保两者使用相同实例的简单方法。

这就是一切。现在让我们测试玩玩:

@RunWith(SpringRunner.class)
@Transactional
@ContextConfiguration(classes = CustomerConfig.class)
public class CustomerRepositoryTest {

  @Autowired CustomerRepository customerRepo;

  @Test
  public void createSimpleCustomer() {

    Customer customer = new Customer();
    customer.dob = LocalDate.of(1904, 5, 14);
    customer.firstName = "Albert";

    Customer saved = customerRepo.save(customer);

    assertThat(saved.id).isNotNull();

    saved.firstName = "Hans Albert";

    customerRepo.save(saved);

    Optional<Customer> reloaded = customerRepo.findById(saved.id);

    assertThat(reloaded).isNotEmpty();

    assertThat(reloaded.get().firstName).isEqualTo("Hans Albert");
  }
}

@Query 注解

你可能不会只使用基本的CRUD方法CrudRepository。可以使用简单的@Query注释来指定存储库方法的查询:

@Query("select id, first_name, dob from customer where upper(first_name) like '%' || upper(:name) || '%' ")
List<Customer> findByName(@Param("name") String name);

请注意,@Param如果使用-parameters标志进行编译,则不需要注释。

如果要执行更新或删除语句,可以使用@Modifying向方法添加注释。

让我们创建另一个测试以试用新方法。

@Test
public void findByName() {

  Customer customer = new Customer();
  customer.dob = LocalDate.of(1904, 5, 14);
  customer.firstName = "Albert";

  Customer saved = customerRepo.save(customer);

  assertThat(saved.id).isNotNull();

  customer.id= null; (1)
  customer.firstName = "Bertram";

  customerRepo.save(customer);

  customer.id= null;
  customer.firstName = "Beth";

  customerRepo.save(customer);

  assertThat(customerRepo.findByName("bert")).hasSize(2); (2)
}

由于Java对象与其对应行之间的连接是Id类型,因此设置Id为null并再次保存它会在数据库中创建另一行。

我们正在进行不区分大小写(例如)搜索,因此,我们找到“Albert”和“Bertram”,但不是“Beth”。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 老生常谈设计模式之动态代理

    老生常谈设计模式之动态代理

    下面小编就为大家带来一篇老生常谈设计模式之动态代理。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • 一篇文章带你深入了解Java基础(2)

    一篇文章带你深入了解Java基础(2)

    这篇文章主要给大家介绍了关于Java中方法使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-08-08
  • Java Buffer缓冲区(NIO)

    Java Buffer缓冲区(NIO)

    Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API。本系列教程将有助于你学习和理解Java NIO。
    2021-09-09
  • JavaEE Filter敏感词过滤的方法实例详解

    JavaEE Filter敏感词过滤的方法实例详解

    我们无论是在聊天还是在留言时,都有一些信息不希望别人看到。那么如果过滤这些关键词呢?下面小编给大家分享JavaEE Filter敏感词过滤的方法实例详解,感兴趣的朋友一起学习吧
    2016-05-05
  • Springboot 配置线程池创建线程及配置 @Async 异步操作线程池详解

    Springboot 配置线程池创建线程及配置 @Async 异步操作线程池详解

    这篇文章主要介绍了Springboot 配置线程池创建线程及配置 @Async 异步操作线程池详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • Java Handler同步屏障浅析讲解

    Java Handler同步屏障浅析讲解

    同步屏障机制是什么?Handler发送的消息分为普通消息、屏障消息、异步消息,一旦Looper在处理消息时遇到屏障消息,那么就不再处理普通的消息,而仅仅处理异步的消息。不再使用屏障后,需要撤销屏障,不然就再也执行不到普通消息了
    2022-08-08
  • java 静态代理 动态代理深入学习

    java 静态代理 动态代理深入学习

    代理模式是常用的java设计模式,特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等,需要的朋友可以参考下
    2012-11-11
  • java实现单链表中的增删改

    java实现单链表中的增删改

    这篇文章主要为大家详细介绍了java实现单链表中的增删改,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • Java中的几种关键字的使用小结

    Java中的几种关键字的使用小结

    本文主要介绍了Java中的几种关键字的使用小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • js中去除字符串中所有的html标签代码实例

    js中去除字符串中所有的html标签代码实例

    这篇文章主要介绍了js中去除字符串中所有的html标签代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08

最新评论