0基础学习Mybatis系列数据库操作框架——多环境配置

大纲

  • 配置
  • 代码
  • 参考资料

在实际开发中,我们往往会将开发环境分成:开发、测试、线上等环境。这些环境的数据源不一样,比如开发环境就不能访问线上环境,否则极容易出现线上数据污染等问题。Mybatis通过多环境配置分开定义来解决这个问题,即我们可以在Mybatis的配置文件中定义多个环境的信息。

配置

下面的配置在environments项下分出了两个environment:

  • development。用于开发环境。开发环境连接的数据库是testdb,这在url中体现出来。
  • production。用于生产环境。生产环境连接的数据库是db。

environments的default属性定义了默认选择哪个environment。这样如果我们代码没有指定环境名,则会使用这个默认的environment配置来配置环境。

<?xml version="1.0" encoding="UTF-8" ?>
<!-- mybatis-config-multi-env.xml -->
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/testdb?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf8"/><property name="username" value="root"/><property name="password" value="fangliang"/></dataSource></environment><environment id="production"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/db?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf8"/><property name="username" value="root"/><property name="password" value="fangliang"/></dataSource></environment></environments><mappers><mapper resource="mybatis/mapper/AllTypeMapper.xml"/></mappers>
</configuration>

在上例中,dataSource下除了url不同外(因为要连接不同数据库),数据库其他信息(比如用户名和密码等)都是一样的。这样相同数据写多次,很容易在后续维护中出现问题,比如不小心的修改导致数据不一致的问题。
为了避免这类问题,我们可以将相同的字段放到properties字段下,然后在使用的地方使用${PropertyName}的形式引用。

<?xml version="1.0" encoding="UTF-8" ?>
<!-- mybatis-config-multi-env-1.xml -->
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><properties><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="username" value="root"/><property name="password" value="fangliang"/></properties><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="jdbc:mysql://localhost:3306/testdb?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf8"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment><environment id="production"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="jdbc:mysql://localhost:3306/db?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf8"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments><mappers><mapper resource="mybatis/mapper/AllTypeMapper.xml"/></mappers>
</configuration>

代码

Mybatis的代码核心流程是:

  1. 构建SqlSessionFactoryBuilder
  2. 使用1返回的对象构建SqlSessionFactory
  3. 使用2返回的对象构建SqlSession

在这里插入图片描述
SqlSessionFactoryBuilder是不区分生产环境或者开发环境的,而SqlSessionFactory是区分的,即给build传递环境变量名。下面代码传递的是production,这样后续创建的session就是连着生产环境。

  InputStream in = null;try {in = Resources.getResourceAsStream("mybatis/config/mybatis-config-multi-env.xml");} catch (IOException e) {throw new RuntimeException(e);}SqlSessionFactory sqlSFLocal = new SqlSessionFactoryBuilder().build(in, "production");

完整代码如下

    @Testvoid testMultiEnv() {ArrayList<String> configs = new ArrayList<>(Arrays.asList("mybatis/config/mybatis-config-multi-env.xml","mybatis/config/mybatis-config-multi-env-1.xml"));for (String config : configs) {InputStream in = null;try {in = Resources.getResourceAsStream(config);} catch (IOException e) {throw new RuntimeException(e);}SqlSessionFactory sqlSFLocal = new SqlSessionFactoryBuilder().build(in, "production");List<AllType> all = null;try (SqlSession s = sqlSFLocal.openSession()) {all = s.selectList("org.example.mapper.AllTypeMapper.findAll");} catch (Exception e) {System.out.println(e.getMessage());}for (AllType a : Objects.requireNonNull(all)) {System.out.println(a.getInfo_int());}}}

代码样例见:https://github.com/f304646673/mybatis_demo.git

参考资料

  • https://mybatis.org/mybatis-3/zh_CN/configuration.html

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

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

相关文章

Shell脚本之基本语法

目录 一、变量定义 变量命名规则&#xff1a; 变量的赋值&#xff1a; 只读变量&#xff1a; 删除变量&#xff1a; 二、变量的类型 自定义变量&#xff1a; 环境变量&#xff1a; 位置参数&#xff1a; 预定义变量&#xff1a; 三、键盘输入 四、数值运算 为什么…

数据结构—堆

什么是堆 堆是一种特殊的树形结构&#xff0c;其中每个节点都有一个值。堆可以分为两种类型&#xff1a;最大堆和最小堆。在最大堆中&#xff0c;每个节点的值都大于等于其子节点的值&#xff1b;而在最小堆中&#xff0c;每个节点的值都小于等于其子节点的值。这种特性使得堆…

RPA自动化小红书自动化写文以及发文!

1、视频演示 RPA自动化小红书自动写作发文 2、核心功能点 采集笔记&#xff1a;采集小红书上点赞量大于1000的爆款笔记 下载素材&#xff1a;下载爆款笔记的主图 爆款改写&#xff1a;根据爆款笔记的标题仿写新的标题以及新的文案 自动发布&#xff1a;将爆款笔记发布到小红…

希尔排序算法(Java实现)

1.希尔排序&#xff08;Shell Sort&#xff09; &#xff08;1&#xff09;算法思想 先追求表中元素部分有序&#xff0c;再逐渐逼近全局有序。先将待排序表分割成若干形如 L [ i , i d , i 2 d , . . . , i k d ] L[i,id,i2d,...,ikd] L[i,id,i2d,...,ikd]的子表&#xff…

【docker】基础背景 Windows安装docker(WSL2)

docker解释 docker作用&#xff1a; 使用具体例子解释&#xff0c;在没有docker之前&#xff0c;整体项目由程序员在本地编写完成之后&#xff0c;再把执行文件丢给运维人员。但是有问题&#xff1a;因为运维同学的具体环境与编码人员的环境可能不一致&#xff0c;所以可能在环…

Three.js——scene场景、几何体位置旋转缩放、正射投影相机、透视投影相机

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

第N6周:使用Word2vec实现文本分类

import torch import torch.nn as nn import torchvision from torchvision import transforms,datasets import os,PIL,pathlib,warnings #忽略警告信息 warnings.filterwarnings("ignore") # win10系统 device torch.device("cuda"if torch.cuda.is_ava…

DD3L内存芯片介绍

在数字科技迅猛发展的今天&#xff0c;内存芯片作为硬件的核心组件之一&#xff0c;扮演着至关重要的角色。而DD3L内存芯片以其卓越的性能和独特的设计&#xff0c;成为众多高端电子设备的不二选择。那么&#xff0c;DD3L内存芯片究竟如何应用&#xff0c;又是如何释放数字世界…

导入预览以及解决导入量大引发超时等问题

1、首选解决预览问题 由于使用的是vue3&#xff0c;页面与数据都是交互响应式的&#xff0c;所以可以通过组件或者原生的文件上传&#xff0c;获取到excel的sheet&#xff0c;从而来计算条数&#xff0c;页码&#xff0c;页数&#xff0c;手动实现分页逻辑&#xff0c;也就是把…

flex:1的作用是什么?

占满剩余的高度 <div classfather><div classson1></div><div classson2></div> </div>当给father添加display:flex之后&#xff0c;假设给son2添加flex:1&#xff0c;那么son2将会占满除son1之外的高度

【DevOps工具篇】Keycloak中设置LDAP认证

【DevOps工具篇】Keycloak中设置LDAP认证 目录 【DevOps工具篇】Keycloak中设置LDAP认证本次使用的环境服务器配置LDAP目录结构使用存储在LDAP中的用户进行登录Keycloak配置步骤功能测试从LDAP向Keycloak批量添加用户Keycloak配置步骤功能测试推荐超级课程: Docker快速入门到精…

基于springboot+vue+Mysql的招生管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

震惊!!原来阻塞队列消息队列这样理解会更简单!!!

震惊!!原来阻塞队列&&消息队列这样理解会更简单!!! 一:阻塞队列二:消息队列2.1:生产者消费者模型2.1.1:解耦合:2.1.2:削峰填谷: 三:消息队列代码3.1.13.1.2:3.1.3:生产慢,消费快,消费阻塞3.1.3:生产快,消费慢,生产阻塞 二级目录二级目录 一:阻塞队列 阻塞队列:先进先出…

gitcode 配置 SSH 公钥

在 gitcode 上配置SSH公钥后&#xff0c;可以通过SSH协议安全地访问远程仓库&#xff0c;无需每次都输入用户名和密码。以下是配置SSH公钥的步骤&#xff1a; 5分钟解决方案 用 OpenSSH公钥生成器 生成 公钥和私钥&#xff0c;私钥文件&#xff08;id_rsa&#xff09;下载&am…

解决Maven Clean过程因内存溢出导致的“Process terminated”问题

正文&#xff1a; 在今天的开发过程中&#xff0c;我遇到了一个意料之外的问题&#xff0c;当我尝试使用 Maven 进行项目清理&#xff08;maven clean&#xff09;时&#xff0c;命令行反馈了一个错误信息&#xff1a;“Process terminated”。经过一番排查&#xff0c;发现问…

为什么资讯网站选择高防IP防护攻击

为什么资讯网站选择高防IP防护攻击&#xff1f;在当今信息爆炸的时代&#xff0c;各种资讯网站扮演着重要的角色&#xff0c;为人们提供丰富的信息资源和资讯服务。然而&#xff0c;随着网络环境的不断变化和网络安全威胁的增加&#xff0c;资讯网站面临着越来越严重的网络攻击…

【Leetcode】top 100 图论

基础知识补充 1.图分为有向图和无向图&#xff0c;有权图和无权图&#xff1b; 2.图的表示方法&#xff1a;邻接矩阵适合表示稠密图&#xff0c;邻接表适合表示稀疏图&#xff1b; 邻接矩阵&#xff1a; 邻接表&#xff1a; 基础操作补充 1.邻接矩阵&#xff1a; class GraphAd…

JavaScript class继承

如果用新的class关键字来编写Student&#xff0c;可以这样写&#xff1a; class Student { constructor(name) { this.name name; } hello() {alert(Hello, this.name !); }} class的定义包含了构造函数constructor和定义在原型对象上的函数hello()&#xff08;注意没有f…

Open3D(C++) 鲁棒损失函数优化的ICP算法

目录 一、损失函数1、关于2、损失函数3、Open3D实现二、代码实现三、结果展示1、配准前1、配准后本文由CSDN点云侠原创,

C语言----数据在内存中的存储

文章目录 前言1.整数在内存中的存储2.大小端字节序和字节序判断2.1 什么是大小端&#xff1f;2.2 练习 3.浮点数在内存中的存储3.1.引子3.2.浮点数的存储3.2.2 浮点数取的过程 前言 下面给大家介绍一下数据在内存中的存储&#xff0c;这个是一个了解c语言内部的知识点&#xf…