官方文档: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<Account, Long> {
}
读写数据
可以直接使用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<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());
}
}
也可以自己写查询语句:
public interface AccountRepository extends CrudRepository<Account, Long> {
@Query("select * from account where login_name=:loginName")
Optional<Account> getByLoginName(@Param("loginName") String loginName);
}
然后测试一下
@Test
public void testQuery() {
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标记也不能省略, 还有很多可以优化的地方。