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”。

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

(0)

相关推荐

  • 关于Spring项目对JDBC的支持与基本使用详解

    什么是JDBC: JDBC全称Java Database Connectivity JDBC可以通过载入不同的数据库的"驱动程序"而与不同的数据库进行连接. JDBC的优点: 使用的驱动不同,即可连接不同的数据库. 使用同一套操作来操作不同的数据库 如果每一个数据库java都制订一套连接方式,那么当不同的数据库更新的时候,java也需要更新自己的代码,而使用jdbc,使用同一套代码来操作,使用不同的驱动程序(驱动程序由数据库厂商提供)来连接,这使得可以连接不同的数据库. Spring对

  • Spring Boot中使用JDBC Templet的方法教程

    前言 Spring 的 JDBC Templet 是 Spring 对 JDBC 使用的一个基本的封装.他主要是帮助程序员实现了数据库连接的管理,其余的使用方式和直接使用 JDBC 没有什么大的区别. 业务需求 JDBC 的使用大家都比较熟悉了.这里主要为了演示在 SpringBoot 中使用 Spring JDBC Templet 的步骤,所以我们就设计一个简单的需求.一个用户对象的 CURD 的操作.对象有两个属性,一个属性是id,一个属性是名称.存储在 MySQL 的 auth_user

  • 在Spring中使用JDBC和JDBC模板的讲解

    spring dao层中对jdbc进行了封装,使用模板模式的设计模式,通过ioc被动注入的方式将jdbcTemplate这个模板类注入到数据对象中,进行数据库操作. 我们要在一个类中进行CRUD操作(crud主要被用在描述软件系统中数据库或者持久层的基本操作功能.),首先要将jdbcTemplate这个模板类注入到数据对象类中,然后将DataSource这个类注入到jdbcTemplate,获取数据源. 这样数据对象类就可以通过jdbcTemplate类中的方法进行数据库操作了. 注意:这里需要

  • Spring的连接数据库以及JDBC模板(实例讲解)

    前言 今天介绍的是关于Spring的数据库连接以及Jdbc模板的相关API方法,虽然在学习了hibernate之后,会知道实现数据库连接一般都是使用hibernate等持久化框架来实现的.但是,很多时候一些涉及到事务的东西使用这些框架并不能够实现,所以我们还需要结合spring来实现相关的需要. 一.创建工程.导包 要想使用Spring的jdbc模板前,还需要导入相关的jar包: 二.进行相关的bean的创建以及工具类的编写 2.1在数据库中创建了两张表,使用spring的jdbcTemplat

  • Spring boot 使用JdbcTemplate访问数据库

    SpringBoot 是为了简化 Spring 应用的创建.运行.调试.部署等一系列问题而诞生的产物, 自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖就可以轻易的搭建出一个 WEB 工程 Spring Framework 对数据库的操作在 JDBC 上面做了深层次的封装,通过 依赖注入 功能,可以将 DataSource 注册到 JdbcTemplate 之中,使我们可以轻易的完成对象关系映射,并有助于规避常见的错误,在 SpringBoot

  • 详解springboot采用多数据源对JdbcTemplate配置的方法

    springboot多数据源配置,代码如下 DataSourceConfig package com.rookie.bigdata.config; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.jdbc.

  • spring boot使用sharding jdbc的配置方式

    本文介绍了spring boot使用sharding jdbc的配置方式,分享给大家,具体如下: 说明 要排除DataSourceAutoConfiguration,否则多数据源无法配置 @SpringBootApplication @EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class}) public class Application { public static void main(String[] arg

  • spring boot tomcat jdbc pool的属性绑定

    下面看下spring boot tomcat jdbc pool的属性绑定代码,具体代码如下所示: spring: datasource: type: org.apache.tomcat.jdbc.pool.DataSource driver-class-name: org.postgresql.Driver url: jdbc:postgresql://192.168.99.100:5432/postgres?connectTimeout=6000&socketTimeout=6000 use

  • SpringBoot JdbcTemplate批量操作的示例代码

    前言 在我们做后端服务Dao层开发,特别是大数据批量插入的时候,这时候普通的ORM框架(Mybatis.hibernate.JPA)就无法满足程序对性能的要求了.当然我们又不可能使用原生的JDBC进行操作,那样尽管效率会高,但是复杂度会上升. 综合考虑我们使用Spring中的JdbcTemplate和具名参数namedParameterJdbcTemplate来进行批量操作. 改造前 在开始讲解之前,我们首先来看下之前的JPA是如何批量操作的. 实体类User: public class App

  • springboot使用JdbcTemplate完成对数据库的增删改查功能

    首先新建一个简单的数据表,通过操作这个数据表来进行演示 DROP TABLE IF EXISTS `items`; CREATE TABLE `items` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(255) DEFAULT NULL, `name` varchar(10) DEFAULT NULL, `detail` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE

随机推荐