SpringData 进阶篇-上

news2025/1/11 14:44:41

SpringData

  • 一:背景介绍
  • 二:XML配置 与JavaConfig配置
    • 2.1 XML配置
      • 2.1.1 配置文件
      • 2.1.2 具体使用
    • 2.2 JavaConfig配置
      • 2.2.1 配置类
      • 2.2.2 具体使用:
  • 三:SpringDataJpa的CRUD
    • 3.1 接口代码
    • 3.2 具体使用
    • 3.3 其它方法
    • 3.4 分页方法
  • 四:总结&提升

一:背景介绍

本篇为SpringData系列文章的第二篇文章,我们在第一篇文章里,讲述了什么是Jpa,Jpa与hibernate、MyBatis的关系,并且给出了相应的示例,让读者们宏观的了解到SpringData,与之前知识进行关联。
本文将会从配置开始,介绍如何在我们的项目中使用SpringData,并且会给出其提供的Repositories的使用方法,编写一些简单的CRUD代码。
希望通过本文,读者可以学会SpringData的基础使用~

二:XML配置 与JavaConfig配置

想要使用SpringData,就必须要对齐进行一系列的配置,其配置与我们上一篇文章使用Hibernate时,配置相差不大,只不过是Spring的配置方式,配置主要有以下几个方面:

  1. 数据库连接池
  2. 配置entityManagerFactory
  3. 事务管理器
    通过对这三部分的配置即可使用SpringData

2.1 XML配置

2.1.1 配置文件

此配置为XML方式进行的配置,比较复杂,现在主流使用的是JavaConfig的配置方式。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:jdbc="http://www.springframework.org/schema/jdbc"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:jpa="http://www.springframework.org/schema/data/jpa"
       xmlns:task="http://www.springframework.org/schema/task"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
           http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
           http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">

    <!-- 1. dataSource 配置数据库连接池 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" name="dataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://82.157.199.3:3306/jpa?characterEncoding=UTF-8" />
        <property name="username" value="root" />
        <property name="password" value="root666" />
    </bean>

    <!-- 2. 配置entityManagerFactory -->
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="packagesToScan" value="org.example.entity" />
        <property name="persistenceProvider">
            <bean class="org.hibernate.jpa.HibernatePersistenceProvider" />
        </property>
        <!-- JPA的供应商适配器 -->
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <!--                自动生成表-->
                <property name="generateDdl" value="true" />
                <property name="database" value="MYSQL" />
                <property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect" />
                <property name="showSql" value="true" />
            </bean>
        </property>
    </bean>

    <!-- 整合spring data jpa -->
    <jpa:repositories base-package="org.example.repositories"
                      transaction-manager-ref="transactionManager"
                      entity-manager-factory-ref="entityManagerFactory" />

    <!-- 3. 事务管理器 -->
    <!-- JPA事务管理器 -->
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>

    <!-- 基于注解方式的事务,开启事务的注解驱动
    如果基于注解的和xml的事务都配置了会以注解的优先 -->
    <tx:annotation-driven transaction-manager="transactionManager" />

    <!-- 组装其他配置文件 -->

</beans>

2.1.2 具体使用

在需要使用的类上,添加注解,引入此配置文件:

@ContextConfiguration("/spring.xml")
@RunWith(SpringJUnit4ClassRunner.class)

2.2 JavaConfig配置

2.2.1 配置类

JavaConfig 的配置方式是由XML配置方式演化而来,与xml方式相比,JavaConfig方式更加的清晰易读

package org.example.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.persistence.EntityManagerFactory;

/**
 * JavaConfig配置方式
 *
 * 数据源配置
 *
 * 实体管理器工厂配置
 *
 * 事务管理器配置
 */
@Configuration
@EnableJpaRepositories(basePackages = "org.example.repositories")
@EnableTransactionManagement
public class SpringDataJpaConfig {

    /**
     * 数据源配置
     */
    @Bean
    public DruidDataSource dataSource() {
        // 创建Druid数据源对象
        DruidDataSource dataSource = new DruidDataSource();
        // 设置数据库用户名
        dataSource.setUsername("root");
        // 设置数据库密码
        dataSource.setPassword("123456");
        // 设置数据库驱动类名
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        // 设置数据库连接URL
        dataSource.setUrl("jdbc:mysql://localhost:3306/springdata_jpa");
        return dataSource;
    }

    /**
     * 实体管理器工厂配置
     */
    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        // 创建Hibernate JPA供应商适配器
        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        // 设置是否自动生成DDL语句
        vendorAdapter.setGenerateDdl(true);
        // 设置是否在控制台打印SQL语句
        vendorAdapter.setShowSql(true);

        // 创建本地容器实体管理器工厂Bean
        LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
        factory.setJpaVendorAdapter(vendorAdapter);
        // 设置实体类所在的包路径
        factory.setPackagesToScan("com.tuling.pojo");
        // 设置数据源
        factory.setDataSource(dataSource());
        return factory;
    }

    /**
     * 事务管理器配置
     */
    @Bean
    public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
        // 创建JPA事务管理器
        JpaTransactionManager txManager = new JpaTransactionManager();
        // 设置实体管理器工厂
        txManager.setEntityManagerFactory(entityManagerFactory);
        return txManager;
    }

}

2.2.2 具体使用:

在启动类上,添加如下注解

@ContextConfiguration(classes = SpringDataJpaConfig.class)
@RunWith(SpringJUnit4ClassRunner.class)

三:SpringDataJpa的CRUD

无论是使用XML方式还是使用JavaConfig方式,配置完成后我们就可以使用SpringData的方式来进行代码开发了,我们可以在我们指定的repositories包内,建立一个接口,使用其继承CrudRepository类,进行一些CRUD的基础操作。
在这里插入图片描述

3.1 接口代码

package org.example.repositories;
import org.example.entity.User;
import org.springframework.data.repository.CrudRepository;
/**
 * @BelongsProject: SpringJpa1
 * @BelongsPackage: org.example.repositories
 * @Author:hlzs1
 * @Description: crud的接口
 * @CreateTime: 2023-06-03 08:52
 * @Version: 1.0
 */
public interface IUserRepository extends CrudRepository<User,Long> {
}

3.2 具体使用

import org.example.entity.User;
import org.example.repositories.IUserRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.Optional;

/**
 * @BelongsProject: SpringJpa1
 * @BelongsPackage: PACKAGE_NAME
 * @Author:hlzs1
 * @Description: 测试类
 * @CreateTime: 2023-06-03 08:56
 * @Version: 1.0
 */
@ContextConfiguration("/spring.xml")
@RunWith(SpringJUnit4ClassRunner.class)
public class SpringDataTest {

    @Autowired
    private IUserRepository iUserRepository;

    //增加
    @Test
    public void testC(){

        User user = new User();
        user.setUserName("郝xml");

        iUserRepository.save(user);
    }

    //读取
    @Test
    public void testR(){
        Optional<User> byId = iUserRepository.findById(1l);

        System.out.println(byId.get().getUserName());

    }

    //Update
    @Test
    public void testU(){

        User user = new User();
        user.setId(3L);
        user.setUserName("郝xml666");
        iUserRepository.save(user);

    }

    //Delete
    @Test
    public void testD(){

        User user = new User();
        user.setId(3L);
        user.setUserName("郝xml666");
        iUserRepository.delete(user);

    }
}

通过这种方式,我们无需编写sql即可实现见得的CRUD,将会很大程度上解放我们的生产力。

3.3 其它方法

CrudRepository还有很多方法,这里就不进行解释了,将其中方法列在下方:

// 用来插入和修改 有主键就是修改 没有就是新增
// 获得插入后自增id, 获得返回值
<S extends T> S save(S entity);

// 通过集合保存多个实体
<S extends T> Iterable<S> saveAll(Iterable<S> entities);

// 通过主键查询实体
Optional<T> findById(ID id);

// 通过主键查询是否存在 返回boolean
boolean existsById(ID id);

// 查询所有
Iterable<T> findAll();

// 通过集合的主键 查询多个实体,返回集合
Iterable<T> findAllById(Iterable<ID> ids);

// 查询总数量
long count();

// 根据id进行删除
void deleteById(ID id);

// 根据实体进行删除
void delete(T entity);

// 删除多个
void deleteAllById(Iterable<? extends ID> ids);

// 删除多个传入集合实体
void deleteAll(Iterable<? extends T> entities);

// 删除所有
void deleteAll();

3.4 分页方法

其中有一个分页方法,比较特殊,其使用的是CrudRepository上的PagingAndSortingRepository的抽象,其添加了额外的方法简化对实体的分页访问。

@ContextConfiguration(classes = SpringDataJpaConfig.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class SpringDataTest2 {

    @Autowired
    private IUserRepository2 iUserRepository2;


    @Test
    public void testPaging() {

        Page<User> all = iUserRepository2.findAll(PageRequest.of(0, 2));
        System.out.println(all.getTotalPages());  // 打印总页数
        System.out.println(all.getTotalElements());  // 打印总元素数
        System.out.println(all.getContent());  // 打印内容
    }

    @Test
    public void testSort() {

        Sort sort = Sort.by("custId").descending();

        Iterable<User> all = iUserRepository2.findAll(sort);

        System.out.println(all);
    }

    @Test
    public void testSortTypeSafe() {


        Sort.TypedSort<User> sortType = Sort.sort(User.class);

        Sort sort = sortType.by(User::getId).descending();

        Iterable<User> all = iUserRepository2.findAll(sort);

        System.out.println(all);
    }

}

四:总结&提升

本文给出了如何通过XML和Javaconfig两种方式进行SpringData的配置,并且给出了使用CrudRepository进行代码的CRUD的方法,并且罗列出了CrudRepository内的主要方法,通过此篇文章,相信你已经学会了如何使用SpringData。
接下来我们还会讲述CRUD的自定义操作、多表关联等知识,如果感兴趣,可以持续关注~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/605262.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据集处理】中国地面气候资料日值数据集(V3.0)

1 数据集介绍-中国地面气候资料日值数据集(V3.0) 中国地面气候资料日值数据集(V3.0)包含以下气象数据资料(包括降水、气温、风速等)。 2 数据处理 以湿度数据(RHU) 处理为例,数据文件如下: 2.1 步骤1:从文件中提取数据 首先提取所有需要的有效信息,查看【数据表格…

sql_server数据库入门学习(二)

&#x1f3ac; 博客主页&#xff1a;博主链接 &#x1f3a5; 本文由 M malloc 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f384; 学习专栏推荐&#xff1a;LeetCode刷题集&#xff01; &#x1f3c5; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指…

Java程序设计入门教程--创建对象

目录 声明对象 声明对象的格式 声明对象的作用 建立对象 创建一个对象 初始化对象 当我们创建了一个类&#xff0c;就等同于我们创建了一种新的数据类型&#xff0c;你可以像使用基本数据类型一样地使用类。 类定义好之后&#xff0c;我们将用该类定义一个实例&am…

【从零开始进行高精度手眼标定 eye in hand(小白向)2 Tsai轴角法与四元数法编程实现】

从零开始进行高精度手眼标定 eye in hand&#xff08;小白向&#xff09;2 Tsai轴角法与四元数法编程实现 前言Tsai标定方法原理推导轴角方法原理matlab编程实现 四元数方法原理matlab编程实现 前言 最近由于组内的相关工作需求&#xff0c;需要进行机器人的高精度标定。原始的…

Redis的常用数据结构之集合类型

集合元素的特点 集合中的元素无序&#xff0c;不可以重复无法通过某一个下标的方式获取元素单个集合最多可以存储2的32次方-1个元素redis支持对集合取交集&#xff08;共同兴趣点&#xff09;、并集&#xff08;两个开发团队擅长什么&#xff09;、差集 单个集合中的操作指令…

系统架构设计师教程(第2版)

系统架构设计师教程&#xff08;第2版&#xff09;作为全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试指定用书&#xff0c;系统地介绍了系统架构设计师的基本要求&#xff0c;应具备的基础知识和需要掌握的知识。 全书分上、下两篇&#xff0c;共计 20 章…

Qt Quick系列(6)—动画

&#x1f680;作者&#xff1a;CAccept &#x1f382;专栏&#xff1a;Qt Quick 文章目录 前言1、简单动画代码示例 2、应用动画代码示例相关知识点 3、缓动曲线代码示例相关知识点 4、动画分组代码示例 5、嵌套动画代码示例 6、状态转换代码示例相关知识点 结语 前言 欢迎来…

安卓进阶(一)App性能优化

文章目录 性能优化的目的及方向流畅性启动速度页面显示速度响应速度 稳定性ANRCrash 资源节省性 布局优化选择耗费性能较少的布局减少布局的层级&#xff08;嵌套&#xff09;使用布局标签尽量少用布局属性wrap_contentincludemergeinclude与merge的区别ViewStub 内存泄露常见内…

计算机网络实验:交换机的Telnet远程登录配置

目录 前言实验目的实验内容实验过程画出拓扑图设置IP3&#xff0c;给交换机设IP&#xff0c;实际上相当于给VLAN 1 这个接口设置IP4&#xff0c;连网线5&#xff0c;测试网络是否连通6&#xff0c;通过telnet去管理配置交换机交换机的密码2、console密码3、telnet密码 总结 前言…

【CSS3系列】第五章 · web 字体

写在前面 Hello大家好&#xff0c; 我是【麟-小白】&#xff0c;一位软件工程专业的学生&#xff0c;喜好计算机知识。希望大家能够一起学习进步呀&#xff01;本人是一名在读大学生&#xff0c;专业水平有限&#xff0c;如发现错误或不足之处&#xff0c;请多多指正&#xff0…

【3DsMAX】从零开始建房(1)

目录 目标 步骤 1. 制作地基 2. 制作台阶 3. 制作地砖 4. 制作第一层主体 5. 挖空第一层门的位置 6. 制作展示厅 目标 要做的房子模型如下&#xff1a; 步骤 1. 制作地基 首先创建一个长方体 可以将其转换为可编辑多边形&#xff0c;然后选中所有顶点&#xff0c;调…

【复变函数笔记】解析函数的定义和性质

文章目录 解析函数的等价定义解析函数的性质 解析函数的等价定义 解析函数的定义&#xff1a; f ( z ) f(z) f(z)在区域内可导则在区域内解析&#xff0c;在一点解析就是在某一邻域内可导。解析函数不可能只在一点解析。柯西-黎曼方程&#xff1a;函数 f ( z ) u ( x , y ) …

【TreeSet集合】比较器排序Comparator的使用

比较器排序Comparator的使用 存储学生对象并遍历&#xff0c;创建TreeSet集合使用带参构造方法 要求&#xff1a;按照年龄从小到大排序&#xff0c;年龄相同时&#xff0c;按照姓名的字母顺序排序 创建学生类&#xff1a; package com.gather.set.treeset; public class Stude…

Nginx网站服务——编译安装与系统服务添加

一、Nginx简介 Nginx特点&#xff1a;&#xff08;占用内存少&#xff0c;并发能力强&#xff09; Nginx 是开源、高性能、高可靠的 Web 和反向代理服务器&#xff0c;而且支持热部署&#xff0c;几乎可以做到 7 * 24 小时不间断运行&#xff0c;即使运行几个月也不需要重新启…

makefile编译debug版本调试时无法定位到源文件:No source available for “main() at 0x8544“

问题 之前用makefile编译了一个release版本的可执行文件&#xff0c;但是后面想调试的时候发现无法调试。 觉得-g就能解决问题&#xff0c;后面发现根本不行。 这里虽然加了-g选项&#xff0c;但是调试的时候还是出现找不到源文件的情况。 解决方案 对已有的C/C工程用mak…

Backtrader官方中文文档:第三章Quickstart Guide快速入门

本文档参考backtrader官方文档&#xff0c;是官方文档的完整中文翻译&#xff0c;可作为backtrader中文教程、backtrader中文参考手册、backtrader中文开发手册、backtrader入门资料使用。 快速入门章节目录 快速入门使用平台从0到100&#xff1a;一步一步的演示基本设置设置现…

2023PS beta 爱国版注册安装教程

软件介绍 主要新功能包括: Generative Fill功能(仅在Photoshop Beta桌面应用程序中可用)。这是一个新的工具,可以使用简单的文本提示非破坏性地添加,扩展或删除图像中的内容,以实现令人惊喜,高兴和震惊的真实结果——几秒钟内。要使用此功能,请选择图像中的目标对象或区域,然…

全局流控 or 端到端拥塞控制

同事推荐一篇论文 Bolt: Sub-RTT Congestion Control for Ultra-Low Latency&#xff0c;写点想法。 端到端原则使网络在拥塞控制中始终扮演配角&#xff0c;人们认为拥塞控制是端到端的事。几十年来人们设计的拥塞控制机制始终围绕 “主机在什么情况下要增减 cwnd” 打转。但…

MongoDB 分片集的基本概念

什么是分片集&#xff1f; 副本集&#xff08;ReplicaSet&#xff09; 用于解决读请求扩展、高可用等问题。但随着业务场景的进一步增长&#xff0c;可能会出现以下问题&#xff1a; 存储容量超出单机磁盘容量&#xff1b;活跃数据集超出单机内存容量&#xff0c;很多读请求需…

使用Python将《青花瓷》歌词生成词云图

哈喽大家好&#xff0c;因为上次有小伙伴问我&#xff0c;歌曲的歌词和评论怎么生成词云图&#xff0c;想买代码… 当时我就拒绝了&#xff0c;直接免费送给了他。 所以今天来分享给大家 我们以周董的《青花瓷》为例&#xff0c;要对《青花瓷》歌词生成词云图&#xff0c;需…