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标记也不能省略, 还有很多可以优化的地方。