Springboot -- Mybatis + Mybatis Generate + KingbaseES8(pgsql) + 静态多数据源

这篇具有很好参考价值的文章主要介绍了Springboot -- Mybatis + Mybatis Generate + KingbaseES8(pgsql) + 静态多数据源。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🏛🏛🏛 以下内容记录一次 Springboot 项目整和人大金仓数据库的过程 🏛🏛🏛

KingBaseES8

  人大金仓数据库管理系统 KingbaseES(KES) 是面向全行业、全客户关键应用的企业级大型通用数据库管理系统,适用于联机事务处理、查询密集型数据仓库、要求苛刻的互联网应用等场景,提供全部应用开发及系统管理功能,提供性能增强特性,可支持主备集群、读写分离集群、多活共享存储集群等全集群架构,具有高性能、高安全、高可用、易使用、易管理、易维护的特点,支持所有国内外主流CPU、操作系统与云平台部署。
  KES 可以兼容oracle和pgsql,在安装时可以选择兼容模式。
  人大金仓社区地址
  个人感觉目前KES的建设还未有其他国外成熟DB系统完善,因此如果在官网查询不到的问题解决方案的时候,可以尝试向KES兼容的数据库方向上做类似考虑。

SpringBoot整合KES8(pgsql)

以下KingBase兼容pgsql

修改pom文件

添加KES 8、Mybatis、MyBatis plus、Mybatis generator 等依赖

<properties>
    <java.version>11</java.version>
</properties>
<dependencies>
	<!--        其他依赖-->
	...
	<!--        mybatis-->
	<dependency>
	    <groupId>org.mybatis.spring.boot</groupId>
	    <artifactId>mybatis-spring-boot-starter</artifactId>
	    <version>2.1.3</version>
	</dependency>
	<!--        pgsql-->
	<dependency>
	    <groupId>org.postgresql</groupId>
	    <artifactId>postgresql</artifactId>
	    <version>42.5.1</version>
	</dependency>
	<!--        kingbase-->
	<dependency>
	    <groupId>cn.com.kingbase</groupId>
	    <artifactId>kingbase8</artifactId>
	    <version>8.6.0</version>
	</dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.mybatis.generator</groupId>
            <configuration>
                <configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
                <verbose>true</verbose>
                <overwrite>true</overwrite>
            </configuration>
            <artifactId>mybatis-generator-maven-plugin</artifactId>
            <version>1.4.0</version>
            <dependencies>
                <dependency>
                    <groupId>org.mybatis.generator</groupId>
                    <artifactId>mybatis-generator-core</artifactId>
                    <version>1.4.0</version>
                </dependency>
				<!--     设置数据源驱动-->
                <dependency>
                    <groupId>cn.com.kingbase</groupId>
                    <artifactId>kingbase8</artifactId>
                    <version>8.6.0</version>
                </dependency>
            </dependencies>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <compilerVersion>${java.version}</compilerVersion>
                <source>${java.version}</source>
                <target>${java.version}</target>
            </configuration>
        </plugin>
    </plugins>
</build>

配置多数据源

这里的多数据源配置是静态多数据源

配置文件

application.properties

################# KINGBASE CONFIG #################
spring.datasource.db1.jdbc-url=jdbc:kingbase8://ip:port/test?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&allowMultiQueries=true
spring.datasource.db1.driver-class-name=com.kingbase8.Driver
spring.datasource.db1.username=test
spring.datasource.db1.password=1q2w3e4rmb

spring.datasource.db2.jdbc-url=jdbc:kingbase8://ip2:port2/test?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&allowMultiQueries=true
spring.datasource.db2.driver-class-name=com.kingbase8.Driver
spring.datasource.db2.username=test
spring.datasource.db2.password=1q2w3e4rmb
配置类

db1配置文件,为不同业务的包设置不同的数据源
其中如果在DataSource类型的Bean上设置了@Primary属性,则表示该数据源为默认数据源

@Configuration
@MapperScan(basePackages = "com.xxx.xxx.mapper", sqlSessionFactoryRef = "db1SqlSessionFactory")
public class MybatisDB1Config {
    @Bean(name = "db1DataSource")
    // 表示这个数据源是默认数据源
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource.db1")
    public DataSource getDateSourceDB1() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "db1SqlSessionFactory")
    @Primary
    // @Qualifier表示查找Spring容器中名字为test1DataSource的对象
    public SqlSessionFactory db1SqlSessionFactory(@Qualifier("db1DataSource") DataSource datasource)
            throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(datasource);
        //解决mapper 返回类型为Map 类型时,如果数据数据为空,则不显示列名的问题。
        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
        configuration.setCallSettersOnNulls(true);
        bean.setConfiguration(configuration);
        return bean.getObject();
    }

    @Bean("db1SqlSessionTemplate")
    @Primary
    public SqlSessionTemplate db1SqlSessionTemplate(
            @Qualifier("db1SqlSessionFactory") SqlSessionFactory sessionFactory) {
        return new SqlSessionTemplate(sessionFactory);
    }
    
	//写事务时使用,使用事务时必须指定数据源
    @Bean(name = "db1TransactionManager")
    public DataSourceTransactionManager db1TransactionManager(@Qualifier("db1DataSource") DataSource datasource) {
        DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
        dataSourceTransactionManager.setDataSource(datasource);
        return dataSourceTransactionManager;
    }
}

@Bean(name = “db1TransactionManager”)用来使用事务时指定数据源,否则编译器会报错
使用时如下@Transactional(“db1TransactionManager”)

代码生成器配置

在POM文件中我们制定了生成器读取配置的文件位置
我们需要将我们生成的表配置一下
Springboot -- Mybatis + Mybatis Generate + KingbaseES8(pgsql) + 静态多数据源,spring boot,mybatis,后端,数据库,java

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
		PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
		"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>
	<context id="auth" targetRuntime="MyBatis3">
		<plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin"></plugin>
		<plugin type="org.mybatis.generator.plugins.SerializablePlugin"></plugin>
		<commentGenerator type="com.qdeicc.base.db.MyCommentGenerator">
			<!--			&lt;!&ndash; 是否去除自动生成的注释 true:是 : false:否 &ndash;&gt;-->
			<!--&lt;!&ndash;			<property name="suppressAllComments" value="true" />&ndash;&gt;-->
			<property name="suppressDate" value="true"/>
		</commentGenerator>
		<!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
		<jdbcConnection driverClass="com.kingbase8.Driver"
						connectionURL="jdbc:kingbase8://ip:port/test?useUnicode=true&amp;characterEncoding=utf8&amp;serverTimezone=GMT%2B8&amp;allowMultiQueries=true&amp;stringtype=unspecified"
						userId="test"
						password="1q2w3e4rmb">
		</jdbcConnection>
		<!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和
            NUMERIC 类型解析为java.math.BigDecimal -->
		<javaTypeResolver>
			<property name="forceBigDecimals" value="false"/>
		</javaTypeResolver>

		<!-- targetProject:生成PO类的位置 -->
		<javaModelGenerator targetPackage="com.xxx.xxx.db.pojo"
							targetProject=".\src\main\java\">
			<!-- enableSubPackages:是否让schema作为包的后缀 -->
			<property name="enableSubPackages" value="false"/>
			<!-- 从数据库返回的值被清理前后的空格 -->
			<property name="trimStrings" value="true"/>
		</javaModelGenerator>
		<!-- targetProject:mapper映射文件生成的位置 -->
		<sqlMapGenerator targetPackage="com.xxx.xxx.db.mapper"
						 targetProject=".\src\main\java\">
			<!-- enableSubPackages:是否让schema作为包的后缀 -->
			<property name="enableSubPackages" value="false"/>
		</sqlMapGenerator>
		<!-- targetPackage:mapper接口生成的位置 -->
		<javaClientGenerator type="ANNOTATEDMAPPER"
							 targetPackage="com.xxx.xxx.db.mapper"
							 targetProject=".\src\main\java\">
			<!-- enableSubPackages:是否让schema作为包的后缀 -->
			<property name="enableSubPackages" value="false"/>
		</javaClientGenerator>
		<!-- 指定数据库表 -->
		<table schema="" tableName="tb_sys_dict">
			<generatedKey column="id" sqlStatement="JDBC" identity="true"/>
		</table>
	</context>
</generatorConfiguration>

有些时候我们可能会用到数据库中特殊类型的字段
如jsonb,如果不在代码生成配置中做特殊处理,那么我们生成的代码将无法读取或写入此类字段
所以以jsonb类型字段为例,我们创建一个处理器,并在代码生成配置中使用它

JsonTypeHandler

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.kingbase8.util.KBobject;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class JsonTypeHandler<T extends Object> extends BaseTypeHandler<T> {
    private static final ObjectMapper mapper = new ObjectMapper();
    static {
        mapper.configure(JsonParser.Feature.ALLOW_MISSING_VALUES, false);
        mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
    }

    private Class<T> clazz;

    public JsonTypeHandler(Class<T> clazz) {
        if (clazz == null) throw new IllegalArgumentException("Type argument cannot be null");
        this.clazz = clazz;
    }

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {
        KBobject jsonbObject = new KBobject();
        jsonbObject.setType("jsonb");
        try {
            jsonbObject.setValue(this.toJson(parameter));
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        ps.setObject(i, jsonbObject);
    }

    @Override
    public T getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return this.toObject(rs.getString(columnName), clazz);
    }

    @Override
    public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return this.toObject(rs.getString(columnIndex), clazz);
    }

    @Override
    public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return this.toObject(cs.getString(columnIndex), clazz);
    }

    private String toJson(T object) {
        try {
            return mapper.writeValueAsString(object);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    private T toObject(String content, Class<?> clazz) {
        if (content != null && !content.isEmpty()) {
            try {
                return (T) mapper.readValue(content, clazz);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        } else {
            return null;
        }
    }
}

修改配置文件

如下,如果我们的jsonb字段中存储的是一个列表,那么我们可以使用以下设置读取出内容。

  <table schema="" tableName="tb_sys_role">
      <generatedKey column="id" sqlStatement="JDBC" identity="true"/>
      <columnOverride column="flag" jdbcType="VARCHAR"
                      typeHandler="com.xxx.xxx.xxx.typehandler.JsonTypeHandler"
                      javaType="java.util.List"></columnOverride>
  </table>

如此之后,我们就可以直接读取并写入flag字段
要注意在这里我们读取出来的结构是List<Object> 或者List<Map> 的格式,需要自己转换实体类。
也可以在生成代码时直接指定对应实体类类型,配置方法会复杂一些,后面会在开一篇文章记录一下。

-----------------------------------------------

至此,整合KingbaseES8的步骤就结束了,并可以mybatis-generator生成对应文件文章来源地址https://www.toymoban.com/news/detail-551210.html

到了这里,关于Springboot -- Mybatis + Mybatis Generate + KingbaseES8(pgsql) + 静态多数据源的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MyBatis 使用报错: Can‘t generate mapping method with primitive return type

    今天在新项目中使用 MyBatis 报如下错误: Can\\\'t generate mapping method with primitive return type 发现是 @Mapper 注解引入错误,错误引入 org.mapstruct.Mapper , 实际应该引入 org.apache.ibatis.annotations.Mapper 正确引入注解: org.apache.ibatis.annotations.Mapper 👋 你好,我是 Lorin 洛林,一位 Java 后端技术

    2024年01月20日
    浏览(24)
  • springboot + (mysql/pgsql) + jpa 多数据源(不同类数据源)

     配置文件: datasourceconfig: 数据源一: 数据源二:

    2024年02月14日
    浏览(48)
  • 如何理解mybatis中sql的动态和静态

    在MyBatis中,SQL的语句可以分为动态和静态。静态SQL是指在应用程序编写SQL语句时已经固定好的SQL语句,而动态SQL则是可以根据条件动态地生成SQL语句。 动态SQL在实际开发中非常常见,它可以根据条件进行if、choose、when、otherwise、foreach等元素的组合拼接,从而生成不同的SQL语

    2024年02月13日
    浏览(25)
  • MyBatis XML 映射文件中的 SQL 语句可以分为动态语句和静态语句

    目录 静态查询: 动态查询: 静态更新: 动态更新: 静态删除: 动态删除: 动态语句和静态语句在 MyBatis 中的作用如下: 静态查询: 静态查询是指在 SQL 语句中执行固定的查询操作,查询的条件和内容是预先确定的,不会随着用户输入或其他条件的改变而改变。以下是一

    2024年01月18日
    浏览(50)
  • 【KingbaseES】银河麒麟V10 ARM64架构_安装人大金仓数据库KingbaseES_V8R6(CentOS8)

    🦄 个人主页——🎐开着拖拉机回家_Linux,Java基础学习,大数据运维-CSDN博客 🎐✨🍁 🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥 🪁🍁🪁🍁🪁🍁🪁🍁 🪁🍁🪁🍁🪁🍁🪁 🪁🍁🪁🍁🪁🍁🪁🍁🪁🍁🪁🍁 感谢点赞和关注 ,每天进步

    2024年02月08日
    浏览(35)
  • 人大金仓数据库KingbaseES安全概述

    一、数据库安全性概述 1、数据库安全性就是指保护数据库以防止不合法使用所造成的数据泄露、更改或者破坏。 2、数据库不安全因素: · 计算机系统安全性 · 非授权用户对数据库的恶意存取和破坏 · 数据库中重要或敏感的数据被泄露 · 安全环境的脆弱性 3、数据库安全标

    2024年02月03日
    浏览(34)
  • Kettle连接人大金仓KingbaseES数据库

    一、方法1:某些情况下连接上数据库后,加载数据较慢,甚至卡死时,可往下参考方法2。 1、驱动下载。在人大金仓官网–通用型数据库–接口驱动– JDBC 驱动程序 X86(第一个驱动包)下载出来,直达链接(点此直达)。 2、解压驱动包。注意,驱动包zip文件里面共有6个文

    2024年02月05日
    浏览(111)
  • 人大金仓 KingbaseES 数据库更换 license文件

    人大金仓数据库单机和集群license数量不同。 单机一般一个,集群一般两个。 1、查找老的license.dat文件,在任何位置执行以下命令: [root@kingbase bin]# find / -name license.dat /opt/Kingbase/ES/V8R3/license.dat /home/flysync/license.dat /data/kingbase/R6/license.dat 2、kingbase授权文件确认,一般license.dat全

    2024年02月11日
    浏览(31)
  • 人大金仓数据库KingbaseES 安全功能入门学习

    安全、身份鉴别、用户管理、审计 金仓数据库管理系统KingbaseES V8.0支持微软Windows 7、Windows XP、Windows 2003、 Windows 2008等32位及64位发行版本。 准备需要安装的金仓数据库管理系统KingbaseES安装程序和jdk1.8及以上的jdk环境。 1.3.1 安装用户 在安装金仓数据库管理系统KingbaseES V8.0时

    2024年02月05日
    浏览(31)
  • SpringBoot——静态资源及原理

    优质博文:IT-BLOG-CN 【1】创建 SpringBoot 应用,选中自己需要的模块。 【2】 SpringBoot 已经默认将这些场景配置好,只需要在配置文件中指定少量配置就可以运行起来。 【3】编写业务逻辑代码。 我们要了解 SpringBoot 帮我们配置了什么?能不能修改?能修改那些配置?能不能扩

    2024年02月04日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包