SpringBoot2.x SpringDataJpa多数据源配置及使用 基于Kotlin

2023-10-18 02:38

本文主要是介绍SpringBoot2.x SpringDataJpa多数据源配置及使用 基于Kotlin,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

SpringDataJpa使用单数据源时的SpringBoot配置很简单,但是随着业务量发展,单个数据库可能不能满足我们的业务需求,这时候一般会对数据库进行拆分或引入其他数据库,此时单数据源就不能满足我们的需求,需要配置多个数据源。

这里主要使用Kotlin语言编写,在使用SpringBoot2.x进行SpringDataJpa多数据源配置之前,可以参考SpringBoot2.x 集成 SpringDataJpa 基于Kotlin,下面就开始进行SpringDataJpa多数据源配置及使用,其中SpringBoot使用的2.2.2.RELEASE版本,pom文件的编写这里就不在表述了。

一、编写配置文件

application.yml中进行如下配置:

spring:# 多数据源数据库连接配置datasource:# 第一数据源配置primary:jdbc-url: jdbc:mysql://127.0.0.1:3306/test1?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=truedriver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: root# 第二数据源配置secondary:jdbc-url: jdbc:mysql://127.0.0.1:3306/test2?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=truedriver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: root# jpa相关配置jpa:database: mysqlshow-sql: truegenerate-ddl: truehibernate:ddl-auto: updatedatabase-platform: org.hibernate.dialect.MySQL5InnoDBDialect

二、编写多数据源的配置类

1.多数据源配置类

package com.rtxtitanv.configimport org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties
import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties
import org.springframework.boot.context.properties.ConfigurationProperties
import org.springframework.boot.jdbc.DataSourceBuilder
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.context.annotation.Primary
import javax.sql.DataSource/*** @name com.rtxtitanv.config.DataSourceConfig* @description 多数据源配置类* @author rtxtitanv* @date 2020/2/5 16:27* @version 1.0.0*/
@Configuration
class DataSourceConfig(private val jpaProperties: JpaProperties,private val hibernateProperties: HibernateProperties) {/*** 配置第一数据源* @return 数据源*/@Bean(name = ["primaryDataSource"])@Primary // 标识为主数据源// prefix:指定yml配置文件中配置项的前缀@ConfigurationProperties(prefix = "spring.datasource.primary")fun primaryDataSource(): DataSource {// 这种方式默认只满足spring的配置方式,如果使用其他数据库连接池,需独立获取配置return DataSourceBuilder.create().build()}/*** 配置第二数据源* @return 数据源*/@Bean(name = ["secondaryDataSource"])@ConfigurationProperties(prefix = "spring.datasource.secondary")fun secondaryDataSource(): DataSource {return DataSourceBuilder.create().build()}/*** 配置 组合jpaProperties和hibernateProperties配置的map对象* @return 组合jpaProperties和hibernateProperties配置的map*/@Bean(name = ["vendorProperties"])fun getVendorProperties(): Map<String, Any> {return hibernateProperties.determineHibernateProperties(jpaProperties.properties, HibernateSettings())}
}

2.第一数据源配置类

package com.rtxtitanv.configimport org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.context.annotation.Primary
import org.springframework.data.jpa.repository.config.EnableJpaRepositories
import org.springframework.orm.jpa.JpaTransactionManager
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean
import org.springframework.transaction.PlatformTransactionManager
import org.springframework.transaction.annotation.EnableTransactionManagement
import javax.annotation.Resource
import javax.persistence.EntityManager
import javax.sql.DataSource/*** @name com.rtxtitanv.config.PrimaryConfig* @description 第一数据源配置类* @author rtxtitanv* @date 2020/2/5 17:33* @version 1.0.0*/
@Configuration
@EnableTransactionManagement
// entityManagerFactoryRef:指定实体管理器工厂,transactionManagerRef:指定事务管理器
// basePackages:指定该数据源的repository所在包路径
@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactoryPrimary",transactionManagerRef = "transactionManagerPrimary",basePackages = ["com.rtxtitanv.repository.primary"])
class PrimaryConfig(@Resource(name = "primaryDataSource") private val primaryDataSource: DataSource,@Resource(name = "vendorProperties") private val vendorProperties: Map<String, Any>) {/*** 配置第一数据源实体管理工厂的bean* @param builder EntityManagerFactoryBuilder* @return LocalContainerEntityManagerFactoryBean*/@Bean(name = ["entityManagerFactoryPrimary"])@Primary // 标识为主数据源(主库对应的数据源)fun entityManagerFactoryPrimary(builder: EntityManagerFactoryBuilder): LocalContainerEntityManagerFactoryBean {return builder.dataSource(primaryDataSource)// 指定组合jpaProperties和hibernateProperties配置的map对象.properties(vendorProperties)// 指定该数据源的实体类所在包路径.packages("com.rtxtitanv.model.primary").persistenceUnit("primaryPersistenceUnit").build()}/*** 配置第一数据源实体管理器* @param builder EntityManagerFactoryBuilder* @return EntityManager*/@Bean(name = ["entityManagerPrimary"])@Primaryfun entityManagerPrimary(builder: EntityManagerFactoryBuilder): EntityManager {return entityManagerFactoryPrimary(builder).`object`!!.createEntityManager()}/*** 配置第一数据源事务管理器* @param builder EntityManagerFactoryBuilder* @return PlatformTransactionManager*/@Bean(name = ["transactionManagerPrimary"])@Primaryfun transactionManagerPrimary(builder: EntityManagerFactoryBuilder): PlatformTransactionManager {return JpaTransactionManager(entityManagerFactoryPrimary(builder).`object`!!)}
}

3.第二数据源配置类

package com.rtxtitanv.configimport org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder
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.transaction.PlatformTransactionManager
import org.springframework.transaction.annotation.EnableTransactionManagement
import javax.annotation.Resource
import javax.persistence.EntityManager
import javax.sql.DataSource/*** @name com.rtxtitanv.config.SecondaryConfig* @description 第二数据源配置类* @author rtxtitanv* @date 2020/2/5 17:34* @version 1.0.0*/
@Configuration
@EnableTransactionManagement
// entityManagerFactoryRef:指定实体管理器工厂,transactionManagerRef:指定事务管理器
// basePackages:指定该数据源的repository所在包路径
@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactorySecondary",transactionManagerRef = "transactionManagerSecondary",basePackages = ["com.rtxtitanv.repository.secondary"])
class SecondaryConfig(@Resource(name = "secondaryDataSource") private val secondaryDataSource: DataSource,@Resource(name = "vendorProperties") private val vendorProperties: Map<String, Any>) {/*** 配置第二数据源实体管理工厂的bean* @param builder EntityManagerFactoryBuilder* @return LocalContainerEntityManagerFactoryBean*/@Bean(name = ["entityManagerFactorySecondary"])fun entityManagerFactorySecondary(builder: EntityManagerFactoryBuilder): LocalContainerEntityManagerFactoryBean {return builder.dataSource(secondaryDataSource)// 指定组合jpaProperties和hibernateProperties配置的map对象.properties(vendorProperties)// 指定该数据源的实体类所在包路径.packages("com.rtxtitanv.model.secondary").persistenceUnit("secondaryPersistenceUnit").build()}/*** 配置第二数据源实体管理器* @param builder EntityManagerFactoryBuilder* @return EntityManager*/@Bean(name = ["entityManagerSecondary"])fun entityManagerSecondary(builder: EntityManagerFactoryBuilder): EntityManager {return entityManagerFactorySecondary(builder).`object`!!.createEntityManager()}/*** 配置第二数据源事务管理器* @param builder EntityManagerFactoryBuilder* @return PlatformTransactionManager*/@Bean(name = ["transactionManagerSecondary"])fun transactionManagerSecondary(builder: EntityManagerFactoryBuilder): PlatformTransactionManager {return JpaTransactionManager(entityManagerFactorySecondary(builder).`object`!!)}
}

三、创建实体类和Repository

1.主数据库实体类

package com.rtxtitanv.model.primaryimport javax.persistence.*/*** @name com.rtxtitanv.model.primary.PrimaryUser* @description 主数据库用户实体类* @author rtxtitanv* @date 2020/2/5 18:29* @version 1.0.0*/
@Entity
@Table(name = "user")
data class PrimaryUser(@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@Column(name = "id")var id: Long? = null,@Column(name = "user_name")var userName: String? = null,@Column(name = "pass_word")var passWord: String? = null,@Column(name = "nick_name")var nickName: String? = null,@Column(name = "age")var age: Int? = null,@Column(name = "email")var email: String? = null,@Column(name = "tel")var tel: String? = null)

2.主数据库Repository

package com.rtxtitanv.repository.primaryimport com.rtxtitanv.model.primary.PrimaryUser
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.data.jpa.repository.JpaSpecificationExecutor/*** @name com.rtxtitanv.repository.primary.PrimaryUserRepository* @description PrimaryUserRepository接口用于操作主库用户表* @author rtxtitanv* @date 2020/2/5 19:01* @version 1.0.0*/
interface PrimaryUserRepository : JpaRepository<PrimaryUser, Long>, JpaSpecificationExecutor<PrimaryUser>

3.从数据库实体类

package com.rtxtitanv.model.secondaryimport javax.persistence.*/*** @name com.rtxtitanv.model.secondary.SecondaryUser* @description 从数据库用户实体类* @author rtxtitanv* @date 2020/2/5 18:29* @version 1.0.0*/
@Entity
@Table(name = "user")
data class SecondaryUser(@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@Column(name = "id")var id: Long? = null,@Column(name = "user_name")var userName: String? = null,@Column(name = "pass_word")var passWord: String? = null,@Column(name = "nick_name")var nickName: String? = null,@Column(name = "age")var age: Int? = null,@Column(name = "email")var email: String? = null,@Column(name = "tel")var tel: String? = null)

4.从数据库Repository

package com.rtxtitanv.repository.secondaryimport com.rtxtitanv.model.secondary.SecondaryUser
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.data.jpa.repository.JpaSpecificationExecutor/*** @name com.rtxtitanv.repository.secondary.SecondaryUserRepository* @description SecondaryUserRepository用于操作从库用户表* @author rtxtitanv* @date 2020/2/5 19:02* @version 1.0.0*/
interface SecondaryUserRepository : JpaRepository<SecondaryUser, Long>, JpaSpecificationExecutor<SecondaryUser>

四、使用测试

package com.rtxtitanvimport com.rtxtitanv.model.primary.PrimaryUser
import com.rtxtitanv.model.secondary.SecondaryUser
import com.rtxtitanv.repository.primary.PrimaryUserRepository
import com.rtxtitanv.repository.secondary.SecondaryUserRepository
import org.junit.Test
import org.junit.runner.RunWith
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.test.context.junit4.SpringRunner/*** @name com.rtxtitanv.JpaMultiTest* @description SpringDataJpa多数据源测试类* @author rtxtitanv* @date 2020/2/5 19:03* @version 1.0.0*/
@RunWith(SpringRunner::class)
@SpringBootTest(classes = [JpaMultiApplication::class])
class JpaMultiTest {@Autowiredprivate lateinit var primaryUserRepository: PrimaryUserRepository@Autowiredprivate lateinit var secondaryUserRepository: SecondaryUserRepositoryprivate val logger: Logger = LoggerFactory.getLogger(JpaMultiTest::class.java)/*** 多数据源保存测试*/@Testfun saveTest() {primaryUserRepository.save(PrimaryUser(null, "aaa", "123456", "aaa", 20, "aaa@jpa.com", "13598766131"))primaryUserRepository.save(PrimaryUser(null, "bbb", "123123", "bbb", 22, "bbb@jpa.com", "13659836782"))primaryUserRepository.save(PrimaryUser(null, "ccc", "111111", "ccc", 25, "ccc@jpa.com", "18965233695"))secondaryUserRepository.save(SecondaryUser(null, "ddd", "2356890", "ccc", 18, "ddd@jpa.com", "13678922986"))secondaryUserRepository.save(SecondaryUser(null, "eee", "124678", "bbb", 25, "eee@jpa.com", "13669876321"))secondaryUserRepository.save(SecondaryUser(null, "fff", "112233567", "aaa", 22, "fff@jpa.com", "19862398732"))}/*** 多数据源查询测试*/@Testfun findTest() {logger.info("查询主库user表测试开始")val primaryUsers = primaryUserRepository.findAll()if (primaryUsers.isEmpty()) {logger.info("主库user表不存在数据")} else {primaryUsers.forEach { primaryUser -> logger.info(primaryUser.toString()) }}logger.info("查询主库user表测试结束")logger.info("查询从库user表测试开始")val secondaryUsers = primaryUserRepository.findAll()if (secondaryUsers.isEmpty()) {logger.info("从库user表不存在数据")} else {secondaryUsers.forEach { secondaryUser -> logger.info(secondaryUser.toString()) }}logger.info("查询从库user表测试结束")}/*** 多数据源更新测试*/@Testfun updateTest() {val user = primaryUserRepository.findById(1L)if (!user.isPresent) {logger.info("用户不存在")} else {user.get().userName = "ddd"user.get().nickName = "ddd"user.get().email = "ddd@jpa.com"primaryUserRepository.save(user.get())}val user1 = secondaryUserRepository.findById(1L)if (!user1.isPresent) {logger.info("用户记录不存在")} else {user1.get().userName = "aaa"user1.get().nickName = "aaa"user1.get().email = "aaa@jpa.com"secondaryUserRepository.save(user1.get())}}/*** 多数据源删除测试*/@Testfun deleteTest() {
//        primaryUserRepository.deleteById(1L)
//        secondaryUserRepository.deleteById(3L)primaryUserRepository.deleteAllInBatch()secondaryUserRepository.deleteAllInBatch()}
}

主启动类启动后,test1(主库)和test2(从库)都自动创建了一张user表,暂无数据。
执行保存测试方法后两张表的结果:
主库user表
从库user表
执行简单的查询测试后控制台打印的日志和自动生成的sql如下:

2020-02-05 20:45:08.585  INFO 6744 --- [           main] com.rtxtitanv.JpaMultiTest               : 查询主库user表测试开始
Hibernate: select primaryuse0_.id as id1_0_, primaryuse0_.age as age2_0_, primaryuse0_.email as email3_0_, primaryuse0_.nick_name as nick_nam4_0_, primaryuse0_.pass_word as pass_wor5_0_, primaryuse0_.tel as tel6_0_, primaryuse0_.user_name as user_nam7_0_ from user primaryuse0_
2020-02-05 20:45:08.746  INFO 6744 --- [           main] com.rtxtitanv.JpaMultiTest               : PrimaryUser(id=1, userName=aaa, passWord=123456, nickName=aaa, age=20, email=aaa@jpa.com, tel=13598766131)
2020-02-05 20:45:08.746  INFO 6744 --- [           main] com.rtxtitanv.JpaMultiTest               : PrimaryUser(id=2, userName=bbb, passWord=123123, nickName=bbb, age=22, email=bbb@jpa.com, tel=13659836782)
2020-02-05 20:45:08.746  INFO 6744 --- [           main] com.rtxtitanv.JpaMultiTest               : PrimaryUser(id=3, userName=ccc, passWord=111111, nickName=ccc, age=25, email=ccc@jpa.com, tel=18965233695)
2020-02-05 20:45:08.746  INFO 6744 --- [           main] com.rtxtitanv.JpaMultiTest               : 查询主库user表测试结束
2020-02-05 20:45:08.746  INFO 6744 --- [           main] com.rtxtitanv.JpaMultiTest               : 查询从库user表测试开始
Hibernate: select primaryuse0_.id as id1_0_, primaryuse0_.age as age2_0_, primaryuse0_.email as email3_0_, primaryuse0_.nick_name as nick_nam4_0_, primaryuse0_.pass_word as pass_wor5_0_, primaryuse0_.tel as tel6_0_, primaryuse0_.user_name as user_nam7_0_ from user primaryuse0_
2020-02-05 20:45:08.750  INFO 6744 --- [           main] com.rtxtitanv.JpaMultiTest               : PrimaryUser(id=1, userName=aaa, passWord=123456, nickName=aaa, age=20, email=aaa@jpa.com, tel=13598766131)
2020-02-05 20:45:08.750  INFO 6744 --- [           main] com.rtxtitanv.JpaMultiTest               : PrimaryUser(id=2, userName=bbb, passWord=123123, nickName=bbb, age=22, email=bbb@jpa.com, tel=13659836782)
2020-02-05 20:45:08.750  INFO 6744 --- [           main] com.rtxtitanv.JpaMultiTest               : PrimaryUser(id=3, userName=ccc, passWord=111111, nickName=ccc, age=25, email=ccc@jpa.com, tel=18965233695)
2020-02-05 20:45:08.750  INFO 6744 --- [           main] com.rtxtitanv.JpaMultiTest               : 查询从库user表测试结束

执行更新测试后控制台打印的sql语句如下,刷新两张表后查看更新成功。

Hibernate: select primaryuse0_.id as id1_0_0_, primaryuse0_.age as age2_0_0_, primaryuse0_.email as email3_0_0_, primaryuse0_.nick_name as nick_nam4_0_0_, primaryuse0_.pass_word as pass_wor5_0_0_, primaryuse0_.tel as tel6_0_0_, primaryuse0_.user_name as user_nam7_0_0_ from user primaryuse0_ where primaryuse0_.id=?
Hibernate: select primaryuse0_.id as id1_0_0_, primaryuse0_.age as age2_0_0_, primaryuse0_.email as email3_0_0_, primaryuse0_.nick_name as nick_nam4_0_0_, primaryuse0_.pass_word as pass_wor5_0_0_, primaryuse0_.tel as tel6_0_0_, primaryuse0_.user_name as user_nam7_0_0_ from user primaryuse0_ where primaryuse0_.id=?
Hibernate: update user set age=?, email=?, nick_name=?, pass_word=?, tel=?, user_name=? where id=?
Hibernate: select secondaryu0_.id as id1_0_0_, secondaryu0_.age as age2_0_0_, secondaryu0_.email as email3_0_0_, secondaryu0_.nick_name as nick_nam4_0_0_, secondaryu0_.pass_word as pass_wor5_0_0_, secondaryu0_.tel as tel6_0_0_, secondaryu0_.user_name as user_nam7_0_0_ from user secondaryu0_ where secondaryu0_.id=?
Hibernate: select secondaryu0_.id as id1_0_0_, secondaryu0_.age as age2_0_0_, secondaryu0_.email as email3_0_0_, secondaryu0_.nick_name as nick_nam4_0_0_, secondaryu0_.pass_word as pass_wor5_0_0_, secondaryu0_.tel as tel6_0_0_, secondaryu0_.user_name as user_nam7_0_0_ from user secondaryu0_ where secondaryu0_.id=?
Hibernate: update user set age=?, email=?, nick_name=?, pass_word=?, tel=?, user_name=? where id=?

以下是执行删除测试后控制台打印的sql语句如下,刷新两张表查看删除成功。
按id删除:

Hibernate: select primaryuse0_.id as id1_0_0_, primaryuse0_.age as age2_0_0_, primaryuse0_.email as email3_0_0_, primaryuse0_.nick_name as nick_nam4_0_0_, primaryuse0_.pass_word as pass_wor5_0_0_, primaryuse0_.tel as tel6_0_0_, primaryuse0_.user_name as user_nam7_0_0_ from user primaryuse0_ where primaryuse0_.id=?
Hibernate: delete from user where id=?
Hibernate: select secondaryu0_.id as id1_0_0_, secondaryu0_.age as age2_0_0_, secondaryu0_.email as email3_0_0_, secondaryu0_.nick_name as nick_nam4_0_0_, secondaryu0_.pass_word as pass_wor5_0_0_, secondaryu0_.tel as tel6_0_0_, secondaryu0_.user_name as user_nam7_0_0_ from user secondaryu0_ where secondaryu0_.id=?
Hibernate: delete from user where id=?

删除所有:

Hibernate: delete from user
Hibernate: delete from user

代码示例

  • Github:https://github.com/RtxTitanV/springboot-learning/tree/master/springboot2.x-learning/springboot-data-jpa-multi-kotlin
  • Gitee:https://gitee.com/RtxTitanV/springboot-learning/tree/master/springboot2.x-learning/springboot-data-jpa-multi-kotlin

这篇关于SpringBoot2.x SpringDataJpa多数据源配置及使用 基于Kotlin的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/229628

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没