Spring Data JDBC全解析

 更新时间:2026年02月03日 10:29:01   作者:y***4685  
Spring Data JDBC是一种Java 持久化API工具集,相比JPA更简单、高效,没有session,一次查询查询出指定的结果,没有多余数据,Spring Data JDBC 相比 MyBatis 的优势在于无须配置和加载 XML 映射文件,下面详细介绍下spring data jdbc的相关知识,感兴趣的朋友一起看看吧

一、JPA背景

早期的JPA的特性是懒加载和关联查询,一下能查出所有的关联信息,但我们开发者在查询SQL的时候往往只需要某几个字段,而JPA甚至关联表的所有字段查询出来,如果不需要那么多message,那么查询的性能会大大降低。

Spring官网为此提供了另一个解决方案——spring-data-jdbc, 另一种形式的Java持久化的API工具集,相比JPA来讲,更简单,更高效,没有session, 一次查询查询出指定的结果,没有多余数据,Spring 官网提供了为什么使用它的理由:

1. If you load an entity, SQL statements get run. Once this is done, you have a completely loaded entity. No lazy loading or caching is done.

2. If you save an entity, it gets saved. If you do not, it does not. There is no dirty tracking and no session.

3. There is a simple model of how to map entities to tables. It probably only works for rather simple cases. If you do not like that, you should code your own strategy. Spring Data JDBC offers only very limited support for customizing the strategy with annotations.

简单总结就是: 没有拦截在和缓存,每次执行完的SQL得到的就是一个指定想要的完整实体,没有关联的查询或更新操作,没有session, 更简单、高效。

spring-data-jdbc相比mybatis有哪些好处

其实现在有更好的中间件mybatis和相关插件能够帮助我们更好的执行sql,spring-data-jdbc和mybatis同样是基于spring开发出来的框架,那么他们优势和差别分别是什么

  • mybatis: sql与mapper层分离,开发者可以编写复杂的SQL以及动态SQL,适合查询复杂的场景,能够在xml文件里统一管理SQL文件,缺点是有些场景下需要编写复杂的SQL。
  • spring-data-jdbc: 无须配置和加载xml映射文件, 简化开发,对于单表查询多的场景下,使用spring-boot-data-jdbc会比mybatis更加简单,另外spring-boot-data-jdbc能够与mybatis做集成,使用更加灵活,支持配置SqlSessionFactoryBean。缺点是: 复杂的业务系统和场景下,复杂的SQL难以维护。

Spring-data-jdbc在简单业务场景下的表现会比myabtis更加方便、好用。

二、Spring Boot 整合Spring data JDBC

先看一下目录结构:

jdbc
├─ JdbcApplication.java  // main方法
├─ config
│    └─ DataSourceConfig.java // 配置数据源,采用druid
├─ controller
│    └─ UserController.java // controler
├─ model
│    └─ User.java  // 实体类
├─ repository   // dao层,与数据库连接层
│    ├─ UserCrudRepository.java
│    └─ UserPageRepository.java
├─ service    // 服务层
│    └─ UserService.java
└─ util

启动类的@EnableJdbcRepositories(basePackages = “org.spring.data.jdbc”) 注解也可以放在配置类上。

1. 配置数据源

数据库使用mysql,那么首推alibaba的druid数据源,druid是国内数据库连接性能表现最好且功能强大数据库中间件,druid还有自带的数据库监控工具,能够监控慢sql,sql执行的动态还有预防sql注入攻击等功能。

添加pom依赖:

      <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!-- alibaba  druid数据源-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.18</version>
        </dependency>
           <!--spring-data-jdbc-->
      <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jdbc</artifactId>
        </dependency>

添加数据源配置:

server.port=8002
spring.datasource.url=jdbc:mysql://192.168.31.166:3306/my_shop?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

下载好jar包后,新建一个配置类DataSourceConfig:

package org.spring.data.jdbc.config;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jdbc.repository.config.AbstractJdbcConfiguration;
import org.springframework.data.jdbc.repository.config.EnableJdbcRepositories;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.TransactionManager;
import javax.sql.DataSource;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
@Configuration
@EnableJdbcRepositories(basePackages = "org.spring.data.jdbc")
public class DataSourceConfig extends AbstractJdbcConfiguration {
    /**
     * 采用阿里数据源druid
     *
     * @return
     */
    @ConfigurationProperties("spring.datasource")
    @Bean
    DataSource dataSource() {
        return new DruidDataSource();
    }
    /**
     *  Jdbc Template
     * @param dataSource
     * @return
     */
    @Bean
    NamedParameterJdbcOperations namedParameterJdbcOperations(DataSource dataSource) {
        return new NamedParameterJdbcTemplate(dataSource);
    }
    /**
     *  事务管理器
     * @param dataSource
     * @return
     */
    @Bean
    TransactionManager transactionManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
}

2. 配置Druid的admin后台

Druid提供了一种直接重写ServletRegistrationBean和FilterRegistrationBean的方式来生成admin后台管理页面和过滤器。

 //配置Druid监控
    //admin后台, 访问地址: localhost:8002/druid/
    @Bean
    public ServletRegistrationBean statViewServlet() {
        ServletRegistrationBean bean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
        Map<String, String> initParams = new HashMap<>();
        initParams.put("loginUsername", "admin");
        initParams.put("loginPassword", "admin");
        initParams.put("allow", "localhost");
        initParams.put("deny", "0.0.0.0");
        bean.setInitParameters(initParams);
        return bean;
    }
    //filter
    @Bean
    public FilterRegistrationBean webStatFilter() {
        FilterRegistrationBean bean = new FilterRegistrationBean();
        bean.setFilter(new WebStatFilter());
        Map<String, String> initParams = new HashMap<>();
        initParams.put("exclusions", "*.js,*.css,/druid/*");
        bean.setInitParameters(initParams);
        bean.setUrlPatterns(Arrays.asList("/*"));
        return bean;
    }

访问地址: localhost:8002/druid, 即可进入到admin后台管理页面,如下:

输入配置的账号admin,密码admin即可进入到首页, 如下图:

3. Spring-data-jdbc常用接口查询策略

1)CrudRepository 增删改查

我们可以通过继承CrudRepository来定义基于Model的增删改查操作, 也可以使用CrudRepository里提供对数据库增、删、改查操作的基本API。

@NoRepositoryBean
public interface CrudRepository<T, ID> extends Repository<T, ID> {
S save(S entity);

<S extends T> Iterable<S> saveAll(Iterable<S> entities);
Optional<T> findById(ID id);
boolean existsById(ID id);
Iterable<T> findAll();
Iterable<T> findAllById(Iterable<ID> ids);
long count();
void deleteById(ID id);
void delete(T entity);
void deleteAllById(Iterable< extends ID> ids);
void deleteAll(Iterable< extends T> entities);
void deleteAll();

}

自定义接口方法:

@Repository
public interface UserCrudRepository extends CrudRepository<User, String> {
    User findUserById(Integer id);
    @Query("select user_name as userName from sys_user where id = :id")
    String findUserNameById(@Param("id") Integer id);
}

spring-data-jdbc的方便好用、可扩展性进一步显现出来了,如果想分页查询的话,Spring-data-jdbc提供了另外一个接口PagingAndSortingRepository,也可以使用@Query()注解支持原生的sql写入,参数使用过@Param()注入,接收的时候按照顺序接收,但要用 :id来标记接收对应的参数。

2) PagingAndSortingRepository 分页排序

@NoRepositoryBean
public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> {
Iterable findAll(Sort sort);

Page<T> findAll(Pageable pageable);

}

同样的该接口类似于CrudRepository接口的用法,可以使用自带的api,也可以扩展。

package org.spring.data.jdbc.repository;
import org.spring.data.jdbc.model.User;
import org.springframework.data.repository.PagingAndSortingRepository;
public interface UserPageRepository extends PagingAndSortingRepository<User,String> {
    //按照id排序
}

排序:提供了findAll()方法,Sort.Direction.ASC表示升序,Sort.Direction.DESC表示降序。

   /**
     * 按照指定字段排序,可以指定升序、降,0升序,1降序
     *
     * @param sortField 按照指定字段排序
     * @param sortRule  排序规则
     * @return
     */
    public List<User> findUserBySort(String sortField, Integer sortRule) {
        List<User> results = new ArrayList<>();
        Iterable<User> userIterable = userPageRepository.findAll(Sort.by(sortRule == 0 ? Sort.Direction.ASC : Sort.Direction.DESC, sortField));
        Iterator<User> userIterator = userIterable.iterator();
        while (userIterator.hasNext()) {
            results.add(userIterator.next());
        }
        return results;
    }

分页:直接使用import org.springframework.data.domain.Pageable 类作为参数解析分页的page和size就能实现一个简单的分页查询。

   public List<User> findUserByPage(Pageable page) {
        return userPageRepository.findAll(page).getContent();
    }

controller:

    /**
     * find all user by page
     */
    @GetMapping("/findAllUser/by/page")
    @ResponseBody
    public List<User> findAllUserBySort(Pageable pageable) {
        return userService.findUserByPage(pageable);
    }

按照id降序排序查询, 访问:localhost:8002/api/user/findAllUser/by/sortsortRule=0&sortField=id,打印结果:

[

{

“id”:3,

“userName”:“zhangsan”

},

{

“id”:2,

“userName”:“zhangsan”

},

{

“id”:1,

“userName”:“bingbing”

}

]

到此这篇关于Spring Data JDBC全解析的文章就介绍到这了,更多相关spring data jdbc内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot layui hutool Excel导入的实现

    springboot layui hutool Excel导入的实现

    本文主要介绍了springboot layui hutool Excel导入的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-03-03
  • Java中Maven的打包方式和执行jar详解

    Java中Maven的打包方式和执行jar详解

    这篇文章主要介绍了Java中maven的打包方式和执行jar,文中有详细的代码示例,有需要的朋友可以借鉴一下
    2023-04-04
  • Java高级特性基础之反射五连问

    Java高级特性基础之反射五连问

    反射赋予了我们在运行时分析类以及执行类中方法的能力。通过反射你可以获取任意一个类的所有属性和方法,你还可以调用这些方法和属性。本文就来和大家详细聊聊Java中的反射,感兴趣的可以了解一下
    2023-01-01
  • 基于java SSM springboot实现景区行李寄存管理系统

    基于java SSM springboot实现景区行李寄存管理系统

    这篇文章主要介绍了基于java SSM springboot实现的景区行李寄存管理系统,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • MyBatis中的N+1问题的解决方法

    MyBatis中的N+1问题的解决方法

    本文主要介绍了MyBatis中的N+1问题的四种解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-12-12
  • 如何在Java中优雅地使用正则表达式详解

    如何在Java中优雅地使用正则表达式详解

    这篇文章主要给大家介绍了关于如何在Java中优雅地使用正则表达式的相关资料,正则表达式就是一个字符串,但和普通的字符串不同的是,正则表达式是对一组相似字符串的抽象,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-02-02
  • SpringMVC 拦截器不拦截静态资源的三种处理方式方法

    SpringMVC 拦截器不拦截静态资源的三种处理方式方法

    本篇文章主要介绍了SpringMVC 拦截器不拦截静态资源的三种处理方式方法,详细的介绍了三种方法,有兴趣的可以了解一下。
    2017-01-01
  • java写卷积神经网络(CupCnn简介)

    java写卷积神经网络(CupCnn简介)

    这篇文章主要介绍了java写卷积神经网络(CupCnn简介),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • springboot自定义yml配置文件及其外部部署过程

    springboot自定义yml配置文件及其外部部署过程

    这篇文章主要介绍了springboot自定义yml配置文件及其外部部署过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • 浅析Spring Validation参数校验的实现原理与进阶用法

    浅析Spring Validation参数校验的实现原理与进阶用法

    这篇文章主要介绍了Spring Validation参数校验的实现原理与进阶用法,本文展示了分组校验,嵌套校验,集合校验等进阶功能,并提供了自定义校验注解的实现方法,希望对大家有所帮助
    2026-01-01

最新评论