Spring Data JDBC介绍

栏目: Java · 发布时间: 6年前

内容简介:Spring新增了一个新的数据模块:Spring Data JDBC。Spring Data JDBC背后的想法是提供对关系数据库的访问,而无需处理JPA的复杂性。JPA提供延迟加载,缓存和脏跟踪等功能。果你需要这些功能会很很棒,但会让猜测JPA的行为比非JPA更难。延迟加载可能会在你不需要时触发昂贵的语句,或者它可能会因异常而失败。当你想要比较一个实体的两个版本是哪个变成脏数据时,缓存可能会妨碍你,让你很难找到所有持久性操作都通过的那个点。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”。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Adobe Dreamweaver CS5中文版经典教程

Adobe Dreamweaver CS5中文版经典教程

Adobe公司 / 陈宗斌 / 人民邮电 / 2011-1 / 45.00元

《Adobe Dreamweaver CS5中文版经典教程》由Adobe公司的专家编写,是AdobeDreamweavelCS5软件的官方指定培训教材。全书共分为17课,每一课先介绍重要的知识点,然后借助具体的示例进行讲解,步骤详细、重点明确,手把手教你如何进行实际操作。全书是一个有机的整体,它涵盖了Dreamweavercs5的基础知识、HTML基础、CSS基础、创建页面布局、使用层叠样式表、使......一起来看看 《Adobe Dreamweaver CS5中文版经典教程》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换