spring data jdbc 基本使用

官方文档:https://docs.spring.io/spring-data/jdbc/docs/1.0.6.RELEASE/reference/html/
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

使用

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

创建表

create database test;
drop table if exists test.account;
create table test.account(
    id bigint primary key auto_increment,
    login_name varchar(16) not null ,
    password varchar(16) not null
);

创建实体类

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

@Data //用lombok来消除模板代码
public class Account {
    @Id  //标记属性为主键
    private Long id;
    private String loginName;
    private String password;

    //1.如果有无参数的构造函数, spring data jdbc会使用无参数的构造函数来创建对象
    //2.如果只有一个构造函数, spring data jdbc会使用它
    //3.如果有多个构造函数, spring data jdbc会使用有@PersistenceConstructor标记的那个
    @PersistenceConstructor
    public Account(Long id, String loginName, String password) {
        this.id = id;
        this.loginName = loginName;
        this.password = password;
    }
}

创建操作接口Repository

//继承CrudRepository, 第一个模板参数是实体类, 第二个参数是主键对应的数据类型
public interface AccountRepository extends CrudRepository {
    
}

读写数据

可以直接使用CrudRepository中的方法

@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringDataJdbcDemoApplicationTests {
    @Autowired
    private AccountRepository accountRepository;

    @Test
    public void testSave() {
        Account account = new Account(null, "test", "123456");
        account = accountRepository.save(account);
        log.info("save ok , id is {}", account.getId());
        Optional 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());
    }
}

也可以自己写查询语句:

public interface AccountRepository extends CrudRepository {
    @Query("select * from account where login_name=:loginName")
    Optional getByLoginName(@Param("loginName") String loginName);
}

然后测试一下

    @Test
    public void testQuery() {
        Optional 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标记也不能省略, 还有很多可以优化的地方。

你可能感兴趣的:(spring data jdbc 基本使用)