spring-data-jdbc的基础使用(一)
前言
很多人知道Mybatis,知道Jpa,但是对spring-data-jdbc可能了解的少之又少。注意我们这里说的是data-jdbc,而不是普通的jdbc。它拥有了类似jpa的一些特性,比如能够根据方法名推导出sql,基本的CRUD等,也拥有了写原生sql的能力。最为关键的是,它非常的清爽,不需要依赖hibernte或者jpa。
一、使用https://start.spring.io/ ,建立一个demo

二、使用 Java 配置的 Spring Data JDBC
// @EnableJdbcRepositories 为接口Repository 创建实现
//AbstractJdbcConfiguration 提供 Spring Data JDBC 所需的各种默认 bean
@Configuration
@EnableJdbcRepositories(basePackages = "com.example.springdatajdbctest")
public class ApplicationConfiguration extends AbstractJdbcConfiguration {
/**
* 创建DataSource,使用springboot的默认的连接池,当然你也可以使用druid
* ConfigurationProperties注解,去配置项中找spring.datasource开头的配置项,来创建DataSource
*/
@Bean
@ConfigurationProperties(prefix="spring.datasource" )
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
/**
* 官方使用内置的数据库类型
@Bean
public DataSource dataSource() {
EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
return builder.setType(EmbeddedDatabaseType.H2).build();
}
*/
/**
* NamedParameterJdbcOperations是Spring Data JDBC 用来访问数据库的
* @param dataSource
* @return
*/
@Bean
NamedParameterJdbcOperations namedParameterJdbcOperations(DataSource dataSource) {
return new NamedParameterJdbcTemplate(dataSource);
}
/**
* 提供的事务管理
* @param dataSource
* @return
*/
@Bean
TransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
对应的application.properties内容如下:
spring.datasource.jdbc-url = jdbc:mysql://127.0.0.1/sss?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useAffectedRows=true
spring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver
spring.datasource.username = root
spring.datasource.password = ****
三、数据库建表、建实体类
create table user_info
(
id int auto_increment primary key,
name varchar(32) not null,
age int not null,
sex tinyint default 1 not null,
create_time datetime not null,
update_time datetime not null
)
comment '用户表';
@Data
public class UserInfo extends BaseEntity{
/**
* ID注解需要加上,标记为主键,否则无法识别主键
* 其他字段不需要加对应的列明,表名也可以不加注解,前提是类名、字段名符合标准的驼峰命名规范,否则无法对应上
*/
@Id
private Integer id ;
private String name;
private Integer age;
private Integer sex;
}
@Data
public class BaseEntity {
private LocalDateTime createTime;
private LocalDateTime updateTime;
}
四、建立仓储接口UserInfoRepository
/**
* 这里CrudRepository接口已经提供了常见的一些接口,因此这里继承CrudRepository
*/
public interface UserInfoRepository extends CrudRepository<UserInfo, Integer> {
}
/**
* 也可以继承PagingAndSortingRepository,它继承了CrudRepository,多了排序和分页默认方法
*/
public interface UserInfoRepository extends PagingAndSortingRepository<UserInfo, Integer> {
}
五、运行一下:
@SpringBootTest
@RunWith(SpringRunner.class)
class SpringDataJdbcTestApplicationTests {
@Autowired
private UserInfoRepository userInfoRepository;
@Test
public void testGet() {
Optional<UserInfo> userInfo = userInfoRepository.findById(1);
System.out.println(userInfo.get());
}
@Test
public void testCount() {
long count = userInfoRepository.count();
System.out.println(count);
}
}

六、关键字查询方法
如果默认方法中没有我们需要的方法,我们还可以按规则来编写关键字查询方法。可以通过带有关键字的方法名来解析出SQL,比如
public interface UserInfoRepository extends PagingAndSortingRepository<UserInfo, Integer> {
List<UserInfo> findByName(String ame);
}
这样无需写SQL语句,就能查询出我们想要的结果。这里使用的是关键字findBy后面的既是需要的查询条件,当然还支持复合查询。比如
List<UserInfo> findByNameAndAge(String name,Integer age);
当然还支持其他的关键字查询。见下表

关键字方式,仅限于可以在WHERE不使用连接的情况下在子句中使用的属性
再如果你不喜欢这种关键字方式,可以自定义方法名字,你还可以使用@Query方式进行定义查询方法
@Query("select name, age from user_info u where u.name = :name")
List<UserInfo> getUserInfoByName(String name);
如果你要修改或者删除,只需要增加注解@Modifying,语句如下:
@Modifying
@Query("update user_info set age=:age where name = :name")
Boolean updateAgeById(String name,Integer age);
@Modifying
@Query("delete from user_info where id = :id")
Boolean deleteRecord(Integer id);
是不是感觉很方便,不再用去写SQL了
七、生命周期的事件机制
Spring Data JDBC 的操作可以作为事件和ApplicationListener的事件相结合
比如,监听所有插入前的操作,这里我们只演示打印日志:
@Configuration
@Slf4j
public class CommonEventConfiguration {
@Bean
public ApplicationListener<BeforeSaveEvent<Object>> loggingSaves() {
return event -> {
Object entity = event.getEntity();
log.info("{} is getting saved.", entity);
};
}
}
当然你不想对所有的操作都监听处理,你可以指定具体某一个表的操作,如下:
@Slf4j
@Repository
public class UserSavedListener extends AbstractRelationalEventListener<UserInfo> {
@Override
protected void onAfterSave(AfterSaveEvent<UserInfo> userInfoAfterSaveEvent) {
log.info("用户:{},保存成功",userInfoAfterSaveEvent.getEntity());
}
}
执行测试代码:
@Test
public void testInsert() {
UserInfo userInfo =new UserInfo();
userInfo.setName("王五");
userInfo.setAge(20);
userInfo.setSex(1);
UserInfo result = userInfoRepository.save(userInfo);
System.out.println(result);
}
执行结果:

可用事件有:

八、实体回调
Spring Data 基础设施提供了在调用某些方法之前和之后修改实体的钩子。也许你已经注意到了,user_info表的创建时间和更新时间我们没有赋值,数据库里的两个时间都是有值的,这就是用实体回调来实现的。
建立一个实体回调类
@Component
public class DefaultingEntityCallback implements BeforeSaveCallback<BaseEntity> {
@Override
public BaseEntity onBeforeSave(BaseEntity baseEntity, MutableAggregateChange<BaseEntity> mutableAggregateChange) {
baseEntity.setCreateTime(LocalDateTime.now());
baseEntity.setUpdateTime(LocalDateTime.now());
return baseEntity;
}
}
另外一种场景,在查询结果出来后需要将用户的敏感信息脱敏,则可以使用AfterLoadCallback实体回调
未完待续
spring-data-jdbc的基础使用(一)的更多相关文章
- IntelliJ IDEA 2017版 spring-boot使用Spring Data JPA搭建基础版的三层架构
1.配置环境pom <?xml version="1.0" encoding="UTF-8"?> <project xmlns="h ...
- 转:使用 Spring Data JPA 简化 JPA 开发
从一个简单的 JPA 示例开始 本文主要讲述 Spring Data JPA,但是为了不至于给 JPA 和 Spring 的初学者造成较大的学习曲线,我们首先从 JPA 开始,简单介绍一个 JPA 示 ...
- 使用 Spring Data JPA 简化 JPA 开发
从一个简单的 JPA 示例开始 本文主要讲述 Spring Data JPA,但是为了不至于给 JPA 和 Spring 的初学者造成较大的学习曲线,我们首先从 JPA 开始,简单介绍一个 JPA 示 ...
- Spring Data(一)概念和仓库的定义
Spring Data(一)概念和仓库的定义 Spring Data的主要任务是为数据访问提供一个相似的.一致的.基于Spring的编程模型,同时又保留着下面各个数据存储的特征.它使得使用数据访问技术 ...
- 了解 Spring Data JPA
前言 自 JPA 伴随 Java EE 5 发布以来,受到了各大厂商及开源社区的追捧,各种商用的和开源的 JPA 框架如雨后春笋般出现,为开发者提供了丰富的选择.它一改之前 EJB 2.x 中实体 B ...
- Spring Data JPA
转自: http://www.cnblogs.com/WangJinYang/p/4257383.html Spring 框架对 JPA 的支持 Spring 框架对 JPA 提供的支持主要体现在如下 ...
- 两行代码玩转Spring Data排序和分页
一:唠嗑 在实际项目中对Spring Data的各种使用相当多,简单的增删改查Spring Data提供了现成的方法,一些复杂的,我们可以在接口方法写And,Not等关键字来搞定,想写原生SQL,CQ ...
- Spring Data JPA实体详解
1. Spring Data JPA实体概述 JPA提供了一种简单高效的方式来管理Java对象(POJO)到关系数据库的映射,此类Java对象称为JPA实体或简称实体.实体通常与底层数据库中的单个关系 ...
- Spring Data Redis整体介绍 (一)
为什么使用Spring Data Redis 首先Spring Data Redis 是Spring 框架提供的用于操作Redis的客户端. Spring框架是一个全栈Java程序框架,通过DI.AO ...
- Spring Data JPA 梳理 - 使用方法
1.下载需要的包. 需要先 下载Spring Data JPA 的发布包(需要同时下载 Spring Data Commons 和 Spring Data JPA 两个发布包,Commons 是 Sp ...
随机推荐
- 资源:CentOS下载地址资源
新版本系统镜像下载(当前最新是CentOS 7.4版本) CentOS官网 官网地址 http://isoredirect.centos.org/centos/7.4.1708/isos/x86_64 ...
- 使用过redis做异步队列么,你是怎么用的?有什么缺点?
Redis设计主要是用来做缓存的,但是由于它自身的某种特性使得它可以用来做消息队列. 它有几个阻塞式的API可以使用,正是这些阻塞式的API让其有能力做消息队列: 另外,做消息队列的其他特性例如FIF ...
- java基础---泛型机制
从java5 开始增加泛型机制,用于明确集合中可以放入的元素类型,只在编译时期有效,运行时不区分是什么类型. 格式:<数据类型> 泛型的本质是参数化类型,让数据类型作为参数传递,E相当于形 ...
- ctf之SusCTF2017-Crack Zip
题目信息如下,可知为杂项题,且无提示 下载文件打开如图,该压缩包是加密的 首先想到的是暴力破解,下载zip暴力破解软件打开文件. 下一步,选择暴力破解 进行暴力破解设定,进行破解 破解完成,得到密解压 ...
- C语言经典试题--指针
分享一道C语言的经典的题目.题目要求如下: 利用字符指针实现字符串1"I Love China"与字符串2"So do I"的输出.然后利用字符指针将字符串2的 ...
- Redis学习——数据结构上
一.常用的全局命令 1.查看所有的键: KEYS * KEYS pattern:查找所有符合给定模式 pattern 的 key . KEYS 的速度非常快,但在一个大的数据库中使用它仍然可能造成性能 ...
- gnome环境设置
1.gnome的环境安装sudo apt-get install gnome2.选择gdm3 开机显示不正常:could not apply the stored configuration for ...
- 15Java进阶 进程
1 线程控制 t.join():让主线程进入线程池,等待t执行完才执行. t.sleep():让线程阻塞,休眠一段时间,休眠结束后进入就绪状态.不会释放锁. t.yield():让线程让出CPU,从运 ...
- Django中F对象,Q对象与运算符
在Django的模型中F对象与Q对象比较常用的,所以单独说一下: F对象 F对象位于django.dc.models模板下,使用的时候记得首先导入!!! 作用:F对象主要用于当模型的字段A与字段B进行 ...
- 犀牛Rhino 7.0中文版安装破解教程
犀牛Rhino 7.0中文版是一款专业的.功能强大的三维建模软件,利用它可以创建.编辑.分析.提供.渲染.动画与转换NURBS线条.曲面.实体与多边形网格:它能轻易整合3DS MAX 与Softima ...