spring data jdbc 基本使用

2022-08-28 11:09:18
spring data jdbc是spring data产品中的一员, 它提供查询数据库并映射成实体的功能,类似于jpa,但没有实体生命周期管理这些复杂功能, 并且它对领域驱动设计提供了一些支持。

配置

添加依赖:

plugins {
    id 'org.springframework.boot' version '2.1.6.RELEASE'
    id 'java'
}

apply plugin: 'io.spring.dependency-management'
// ... ...
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
    implementation 'mysql:mysql-connector-java:8.0.17'
    // ... ...
}

配置类:

@Configuration
@EnableJdbcRepositories("com.example.springdatajdbcdemo") //这里的扫描目录要写好了
public class JdbcConfig {

}

数据库参数配置:

spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=123456

使用

用一个登录账号的小例子来演示用法

创建表

createdatabase test;droptableifexists test.account;createtable test.account(
    idbigintprimarykeyauto_increment,
    login_namevarchar(16)notnull,
    passwordvarchar(16)notnull);

创建实体类

spring data jdbc读取记录后,会先创建对象,然后给对象赋值

@Data//用lombok来消除模板代码publicclassAccount{@Id//标记属性为主键private Long id;private String loginName;private String password;//1.如果有无参数的构造函数, spring data jdbc会使用无参数的构造函数来创建对象//2.如果只有一个构造函数, spring data jdbc会使用它//3.如果有多个构造函数, spring data jdbc会使用有@PersistenceConstructor标记的那个@PersistenceConstructorpublicAccount(Long id, String loginName, String password){this.id= id;this.loginName= loginName;this.password= password;}}

创建操作接口Repository

//继承CrudRepository, 第一个模板参数是实体类, 第二个参数是主键对应的数据类型publicinterfaceAccountRepositoryextendsCrudRepository<Account, Long>{}

读写数据

可以直接使用CrudRepository中的方法

@Slf4j@RunWith(SpringRunner.class)@SpringBootTestpublicclassSpringDataJdbcDemoApplicationTests{@Autowiredprivate AccountRepository accountRepository;@TestpublicvoidtestSave(){
        Account account=newAccount(null,"test","123456");
        account= accountRepository.save(account);
        log.info("save ok , id is {}", account.getId());
        Optional<Account> dbAccountOptional= accountRepository.findById(account.getId());
        Assert.assertTrue(dbAccountOptional.isPresent());
        Account dbAccount= dbAccountOptional.get();
        log.info("get login account: {}", dbAccount);
        Assert.assertEquals("test", dbAccount.getLoginName());
        Assert.assertEquals("123456", dbAccount.getPassword());}}

也可以自己写查询语句:

publicinterfaceAccountRepositoryextendsCrudRepository<Account, Long>{@Query("select * from account where login_name=:loginName")
    Optional<Account>getByLoginName(@Param("loginName") String loginName);}

然后测试一下

@TestpublicvoidtestQuery(){
        Optional<Account> optionalAccount= accountRepository.getByLoginName("test");
        Assert.assertTrue(optionalAccount.isPresent());
        Account dbAccount= optionalAccount.get();
        log.info("get login account: {}", dbAccount);
        Assert.assertEquals("test", dbAccount.getLoginName());
        Assert.assertEquals("123456", dbAccount.getPassword());}

总结

以上就是spring data jdbc的基本操作了, 总的来说还是比较方便,定义一个实体类,写个接口,就能实现CRUD了, 没有spring data jpa复杂的生命周期, 没有mybatis那么复杂的代码(个人感觉使用mybatis generator也不是很方便)。
但还有许多不足之处, 比如不能使用spring data jpa那样使用方法名称查询, 而@Param标记也不能省略, 还有很多可以优化的地方。

  • 作者:M_O_
  • 原文链接:https://blog.csdn.net/crazyman2010/article/details/98207539
    更新时间:2022-08-28 11:09:18