1、选择器 1.1基础选择器
通配符选择器(*),标签选择器,类选择器,id选择器
1.2复合选择器
后代选择器
元素1 元素2
子元素选择器
元素1>元素2(亲儿子)
并集选择器
元素1,元素2
链接伪类选择器:
a:link
未访问的链接
a:visited
已访问的链接
a:hover
鼠标经过的链接
a:active
鼠标按下未弹起的链接
focus伪类选择器:选取获得光标的表单元素(input:focus)
2、字体属性font 属性
属性值
作用
font-family
如“microsoft yahei”
字体类型
font-size
如“10px”
字体大小
font-weight
normal/bold
字体粗细(400~700)
font-style
italic/normal
字体格式
font:font-style font-weight font-size/line-hight font-family
3、文本属性 属性
属性值
作用
color
white/#fff/rgb(255,255,255)
设置文字颜色
text-align
left/center/right
水平对齐方式
text-decoration
none/underline/overline/line-though
装饰文本
text-indent
如“2em”
文本缩进
4、外部样式表CSS引入方式 <link rel="stylesheet" href="url">
5、元素显示模式 5.1、块级元素(独占一行,可设置宽高)
文字类的块元素中间不允许放其他块元素:<h1>~<h6>,<p>
<li>,<ul>,<ol>,<div>
5.2、行内元素(一行可以放多个元素,无法设置宽高。行内元素只能容纳行内元素)
<span>,<a>,<i>,<em>
<a>里面可以放块级元素,但不允许嵌套链接
一、API 接口(预定义的函数),简单理解为给程序员提供的一个工具,以便实现想要的功能
二、Web API 浏览器提供的一套操作浏览器功能和页面元素的API(BOM和DOM)
三、DOM文档对象模型 1、DOM
编程接口
2、DOM树
文档:一个页面就是一个文档,DOM中使用document表示
元素:页面中所有标签都是元素,DOM中使用element表示
节点:网页中的所有内容都是节点(标签、属性、文本、注释等),DOM中使用node表示
3、获取元素
//(1)根据id获取,返回带有id的元素对象 document.getElementById('id'); //(2)根据标签名获取,返回带有指定标签名的对象的集合,是一个伪元素 document.getElementsByTagName('标签名'); //(3)通过HTML5新增的方法获取 //querySelector() 返回指定选择器的第一个元素对象 document.querySelector('.类名'); document.querySelector('#id名'); //querySelectorAll()返回指定选择器的所有元素对象集合 document.querySelectorAll('.类名'); //(4)特殊元素获取 //获取body 元素 varbodyEle=document.body; //获取html 元素 varhtmlEle=document.html; varhtmlEle=document.documentElement; 4、事件基础
4.1、事件概述:触发---响应机制
4.2、事件三要素
事件源(谁做)、事件类型(什么事件)、事件处理程序(做什么)
4.3、执行事件的步骤
获取事件源---注册事件---添加事件处理程序
4.4、鼠标事件
鼠标事件
触发条件
onclick
鼠标点击左键触发
onmouseover
鼠标经过触发
onmouseout
鼠标离开触发
onfocus
获得鼠标焦点触发
onblur
失去鼠标焦点触发
onmousemove
鼠标移动触发
onmouseup
鼠标弹起触发
onmousedown
鼠标按下触发
mouseenter和mouseover的区别
mouseenter不会冒泡
5、操作元素
5.1、改变元素内容
element.innerText
element.innerHTML
innerText 和 innerHTML的区别 innerText 不识别html标签 非标准 去除空格和换行
一、物理像素和逻辑像素 1、物理分辨率 1920 * 1080 指的硬件分辨率(物理分辨率 单位是像素点 px )
物理分辨率 1920 表示的就是 1920个像素点 也就是 1920px 像素点就是px 的单位 可以和px 转换 但是1px 不一定等于1个物理像素点 厂商出厂就设置好的 不能改变(指的屏幕就是1920个物理像素点)
2、逻辑分辨率 可以调节的 显示设置中 125% 150% 175% 这些都是 逻辑分辨率
125% 作用为了让网页显示的更加的清晰 125% == 物理分辨率/1.25 就等于网页的宽度 1920 的分辨率 放大125% 的时候 实际网页的宽度是 1520px 1520px = 1920个物理像素点 1px = 1.25个物理像素点 在分辨率 1920 的上面 放大125%之后 显示的更加清晰的原因 100% 的时候 1920 分辨率 网页的宽度就是 1920 px 1px = 1个物理像素点 网页的宽度 就是 逻辑分辨率 二、视口 1、视口标签meta <metaname="
文章目录 简介命令格式常用选项常用命令查询进程所占用的端口号查看端口号的使用情况显示所有连接和监听端口并显示每个连接相关的进程ID显示UDP、TCP协议的连接的统计信息并显示每个连接相关的进程 ID显示所有已建立的连接显示每个进程的连接数显示每个IP地址的连接数显示每种类型TCP/UDP的连接数显示每种网络状态的数量显示指定进程ID网络状态的数量显示端口占用数量显示指定进程ID指定协议的数量 网络状态 简介 netstat 命令是 Linux 系统中一个非常常用的网络工具,用于查询和统计网络连接的状态和数据传输情况。在网络故障排除和性能调优中,netstat 命令是必不可少的工具之一。本文将详细介绍 netstat 命令的常用参数及其用法。
命令格式 netstat [-a] [-c] [-e] [-f] [-i] [-n] [-o] [-p protocol] [-r] [-s] [-t] [-u] [interval]
常用选项 netstat 命令的常用选项如下:
-a(all):显示所有连接状态,包括 TCP、UDP 和 Unix 域套接字; -t(tcp):显示 TCP 连接状态;-u(udp):显示 UDP 连接状态;-x:列出所有unix端口 -c(continuous):连续显示网络状态信息。按 Ctrl + C 结束。-e(extend):显示网络统计信息。包括网络接口、协议等。-f:显示外部地址的完全限定域名(FQDN)。-i:显示网络接口信息。-n:以数字形式显示地址和端口号。-o:显示与每个连接相关的进程 ID。-p protocol:显示特定协议(tcp、udp 或 icmp)的连接。-r:显示路由表。-s:显示网络统计信息。包括网络接口、协议等。-t:显示 TCP 协议的连接。-u:显示 UDP 协议的连接。interval:指定连续显示网络状态信息的时间间隔(单位为秒)。 常用命令 查询进程所占用的端口号 netstat -ano | grep 进程ID 查看端口号的使用情况 netstat -ano | grep 端口号 显示所有连接和监听端口并显示每个连接相关的进程ID netstat -ano 显示UDP、TCP协议的连接的统计信息并显示每个连接相关的进程 ID netstat -so -p udp netstat -so -p tcp IPv4 的 TCP 统计信息 主动开放 = 8055 被动开放 = 1136 失败的连接尝试 = 2469 重置连接 = 1712 当前连接 = 67 接收的分段 = 2473796 发送的分段 = 454254 重新传输的分段 = 10493 活动连接 协议 本地地址 外部地址 状态 PID TCP 127.
中国全国地面站点数据(1981-2010)、月平均气象、月平均降水、月平均相对湿度、月最大降水、月最高温度最低温度、月最高温平均值最低温平均值、高低温站点基础数据
b_china_mon_avg_data_pressure月平均气象
b_china_mon_avg_data_rain月平均降水
b_china_mon_avg_data_rhu月平均相对湿度
b_china_mon_max_data_rain月最大降水
b_china_mon_max_min_data_tem月最高温度最低温度
b_china_mon_max_min_avg_data_tem月最高温平均值最低温平均值
b_china_mon_max_min_station高低温站点基础数据
样例数据
中国全国地面站点数据(1981-2010)、月平均温度、降水、相对湿度、最大降水、最高温度最低温度、最高温平均值最低温平均值-MySQL文档类资源-CSDN下载
2011年至2018年全国城市区县天气预报高温、低温、风速、风向、天气现象数据,mysql数据集,数据量800万以上数据大小1G
主要城市气候数据,时间段1944-2022年,部分年份会缺数据包括如下内容:
T年平均温度
TM年平均最高温度
Tm年平均最低温度
PP年降水总量
V年平均风速
RA降雨天数
SN下雪天数
TS暴雨天数
FG雾天数
TN龙卷风天数
GR冰雹天数
方法一(普通方法):
#include <stdio.h> int main() { double n=100,sum=0; for(int i=0;i<9;i++)//循环九次,每次都计算一次下落到反弹的路程 { sum=sum+n;//下落高度 n=n/2;//反弹原来高度一半 sum=sum+n;//反弹高度 } sum=sum+n;//前面已计算九次,再计算一次下落高度即为第10次落地总共经过的距离 n=n/2;//第10次再次反弹 printf("第10次落地总共经过%.5lf米,第10次落地反弹高度%.5lf",sum,n); return 0; } 方法二(递归):
#include <stdio.h> double total(int n,double lenth)//n为落地的次数,lenth是初始球的高度 { if(n==1) return 100;//初始球的高度为100米 else return lenth+2*(total(n-1,lenth/2)/2);//n-1次小球的距离+2*小球弹起的高度 } int main() { double sum,sum1; sum=total(10,100);//第10次小球落地总共经过的路程 sum1=total(11, 100);//第11次小球落地总共经过的路程 printf("第10次落地总共经过%.5lf米\n",sum); printf("第10次弹起的高度:%.5lf米",(sum1-sum)/2);//第11次减去第10次总的路程再除以2就是第十次弹起的高度 return 0; }
在终端窗口执行命令
pip install sklearn 如下图所示
但是发现无法使用 sklearn,原因是用错命令了.
卸载刚刚安装的sklearn
pip uninstall sklearn 使用如下命令安装即可
pip install scikit-learn
#include <stdio.h>
int main()
{
int year,month,day;
printf("请输入年,月:");
scanf("%d%d",&year,&month);
if((year%400==0)||(year%4==0&&year%100!=0))//能被400整除或者能被4整除并且不能被100整除的是闰年
{
printf("闰年\n");
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)//1,3,5,7,8,10,12是31天
day=31;
else if(month==2)//2月是29天
day=29;
else
day=30;
}
else
{
printf("平年\n");
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
day=31;
else if(month==2)
day=28;//二月是28天
else
day=30;
}
printf("day=%d",day);
return 0;
}
E8267D+M8190A连接示意图:
E8267D接口在背面板,下图红色(I OUT,I-bar OUT)和蓝色线(Q OUT,Q-bar OUT)
E8267D要求:016 wideband选件
设置:仪表面板上的I/Q按键,打开I/Q on,选择I/Q路径为外部背面板输入:
频率输入为需要的载波频率;
M8190A设置:
IQ tools中设置外部上变频之后的频率(载波频率)
以1G symbol rate,0.35 滚降系数 ,QPSK调制模式为例:VSA解调结果如下:
M8190A 宽带信号校准
1. 先设置宽带调制信号
2. Download
3. 直接使用VSA校准,即可得到校准之后的宽带信号;
先清除之前的校准数据,再使用in-system cal
校准完成之后,可以看出EVM从原来的10%改善到2.5%。
——作者 君鉴科技/杨云刚
——来源 每日E问eteforum
#include <stdio.h>
#include <math.h>
int main()
{
int i,x,y,z;
for(i=100;i<1000;i++)
{
x=i%100%10;
y=i/10%10;
z=i/100;
if(pow(x,3)+pow(y,3)+pow(z,3)==i)
printf("%d ",i);
}
return 0;
}
一些废话
可能在某某一天,你在删除表的数据的时候,不想一张表一张表的去删除,想把两个表的数据同时删除;然后你就会去搜索,然后你就很有很有很有很有可能会看到 me 的这篇优质(呸!!!)文章了~
嗯,没错,是这么个道理......
本文章赞助商:DataGrip(不是广告哇!!!Σ( ° △ °|||)︴)。
目录
一、删除多表数据
二、删除多表数据(两张表有外键关系)
2.1、设置外键
方法一:SQL 语句 方法二:图形化界面
2.2、解决方法
方法一(简单版):关闭外键约束
方法二(麻烦版):修改删除/更新行为
一、删除多表数据 我这里有两张表,分别是学生表(student)和学生成绩表(achievement)。
/*1、学生表*/ create table student( ID int, Name varchar(20) ); /*给学生表插入数据*/ insert into student(ID, Name) values (1,'海绵宝宝'), (2,'派大星'), (3,'章鱼哥'), (4,'蟹老板'), (5,'痞老板'), (6,'珊迪'), (7,'小蜗'); /*2、学生成绩表*/ create table achievement( ID int primary key auto_increment, Mark int ); /*给学生成绩表插入数据*/ insert into achievement(ID, Mark) values (1,91), (2,97), (3,88), (4,87), (5,84), (6,80), (7,81); /*查询两张表的数据*/ select * from student; select * from achievement; 输出结果: student(学生表)
在建立外键关系时,出现该报错信息:
[23000][1452] Cannot add or update a child row: a foreign key constraint fails (`test2`.`#sql-1238_50`, CONSTRAINT `fk_student_ID` FOREIGN KEY (`ID`) REFERENCES `achievement` (`ID`))
原因: 建立外键时,子表中存在父表没有的数据。
如下👇
我的子表(建立外键的表)
我的父表(外键所关联的表)
我的子表中存在父表没有的数据:ID 为 14 的列;
解决方式: 子表和父表的数据保持一致。
如下👇
我的子表
我的父表
总结: 子表中外键的值只能是父表中主键的值,数据要一样,才可以确保数据的完整性;
完。。。
nginx -s reopen #重启Nginx
nginx -s reload #重新加载Nginx配置文件,然后以优雅的方式重启Nginx
nginx -s stop #强制停止Nginx服务
nginx -s quit #优雅地停止Nginx服务(即处理完所有请求后再停止服务)
nginx -t #检测配置文件是否有语法错误,然后退出
nginx -?,-h #打开帮助信息
nginx -v #显示版本信息并退出
nginx -V #显示版本和配置选项信息,然后退出
nginx -t #检测配置文件是否有语法错误,然后退出
nginx -T #检测配置文件是否有语法错误,转储并退出
nginx -q #在检测配置文件期间屏蔽非错误信息
nginx -p prefix #设置前缀路径(默认是:/usr/share/nginx/)
nginx -c filename #设置配置文件(默认是:/etc/nginx/nginx.conf)
nginx -g directives #设置配置文件外的全局指令
killall nginx #杀死所有nginx进程
1. 消息可靠性投递
前言
在代码里面一定是先操作数据库再发送消息。避免因为数据库回滚导致的数据不一致。但是如果先操作数据,后发送消息,发送消息出了问题,那不是一样会出现业务数据的不一致?
这篇文章我们来分析 RabbitMQ 的可靠性投递,也就是在使用 RabbitMQ 实现异步通信的时候,消息丢了怎么办,消息重复消费怎么办?在 RabbitMQ 里面提供了很多保证消息可靠投递的机制,这个也是 RabbitMQ 的一个特性。
在学习RabbitMQ前,必须要明确一个问题,因为效率与可靠性是无法兼得的,如果要保证每一个环节都成功,势必会对消息的收发效率造成影响。所以如果是一些业务实时一致性要求不是特别高的场合,可以牺牲一些可靠性来换取效率。比如发送通知或者记录日志的这种场景,如果用户没有收到通知,不会造成业务影响,只要再次发送就可以了。
在我们使用 RabbitMQ 收发消息的时候,有几个主要环节:
1 代表消息从生产者发送到 Broker。
生产者把消息发到 Broker 之后,怎么知道自己的消息有没有被 Broker 成功接收?
2 代表消息从 Exchange 路由到 Queue
Exchange 是一个绑定列表,如果消息没有办法路由到正确的队列,会发生什么事情?应该怎么处理?
3 代表消息在 Queue 中存储
队列是一个独立运行的服务,有自己的数据库(Mnesia),它是真正用来存储消息的。如果还没有消费者来消费,那么消息要一直存储在队列里面。如果队列出了问题,消息肯定会丢失。怎么保证消息在队列稳定地存储呢?
4 代表消费者订阅 Queue 并消费消息
队列的特性是什么?FIFO。队列里面的消息是一条一条的投递的,也就是说,只有上一条消息被消费者接收以后,才能把这一条消息从数据库删掉,继续投递下一条消息。那么问题来了,Broker 怎么知道消费者已经接收了消息呢?
下面我们通过收到ack的方式保证消息的可靠性
1.我们进行配置开启手动确认机制
server.port=9994 spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest # 发送方 # 开启发送确认(未到达MQ服务器) spring.rabbitmq.publisher-confirms=true # 开启发送失败退回(未找到对应queue) spring.rabbitmq.publisher-returns=true #启动时自动启动容器 spring.rabbitmq.listener.auto-startup=true # 消费方 开启手动ACK spring.rabbitmq.listener.direct.acknowledge-mode=manual spring.rabbitmq.listener.simple.acknowledge-mode=manual 2.创建交换机,队列和路由 @Slf4j @Configuration public class Config1 implements RabbitTemplate.
在数据库的表里面创建不了外键约束❓❓❓
没错,以我名侦探 q 的分析(狗屁!!!),真相只有一个❗❗❗
那就是:你表的存储引擎非 InnoDB,外键约束只有存储引擎是 InnoDB 才可以创建;
不信,你去查看你外键所关联的两张表的建表语句;
语法:
show create table <表名>;
演示:
show create table student; 你会从查询结果中发现表的存储引擎显示:“ENGINE=MyISAM”;是 MyISAM 引擎,而非 InnoDB;
接下来,我们再去查看 MySQL 数据库内有哪些存储引擎;
语法:
show engines; 然后就会原来发现 MyISAM 为 MySQL 数据库的默认存储引擎(但同时他也是支持 InnoDB 存储引擎的);
那怎么办呢?那还能怎么办呢?
直接修改表的存储引擎为 InnoDB:
语法:
alter table <表名> engine = <存储引擎名>;
演示:
alter table student engine = InnoDB; 小插曲:存储引擎名是不分大小写的,你写 INNODB 和 InnoDB 都可以识别出来的,识别出来的名字会为 InnoDB。
按照上面的语法修改完之后,再次查看该表的建表语句:
show create table student; 就可以看到之前的 “ENGINE=MyISAM” 改成了 “ENGINE=InnoDB”,;
然后,你把两张要建立外键关系的表的存储引擎都修改为 InnoDB 的存储引擎,就能使用外键啦!!!
1.首先安装JDK及配置JDK环境变量
https://www.cnblogs.com/ww-926/p/16639367.html
2.jenkins下载以及JDK环境准备
jenkins官网下载地址:https://jenkins.io/download/目前稳定版本:2.204.2,jenkins项目有两条发布线,分别是LTS长期支持版(或稳定版)和每周更新版(最新版)。建议选择LTS长期支持版,下载通用java项目war包
3.jenkins安装
把jenkins.war拷贝到C盘下。
配置Jenkins环境变量改变Jenkins默认的安装目录。
(1)Jenkins默认安装路径在:C:\Users\19897.jenkins
(2)进入系统变量之后增加JENKINS_HOME变量,如下:JENKINS_HOME:C:\jenkins,配置环境变量之后,Jenkins默认会安装到C:\jenkins
设置Jenkins安装和启动文件:在C盘下新建一个startjenkins.bat的文件,输入如下内容:@echo off cd /d %JENKINS_HOME% java -jar jenkins.war pause
双击startjenkins.bat启动文件之后会在C盘目录下生成一个jenkins的文件夹。这时候通过
http://localhost:8080访问jenkins会出现如下解锁界面
4.解锁Jenkins安装
在浏览器中访问jenkins项目:http://localhost:8080/jenkins 出现解锁 Jenkins界面,说明jenkins项
目搭建完成,这里需要输入管理员密码。如下图:
上图中有提示:管理员密码在:C:\jenkins\secrets\initialAdminPassword 打开此文件获得密码并输
入密码,第一种安装方式点击”继续”按钮后如出现如下图的报错信息:这是jenkins的一个Bug,解
决方案是:通过地址http://localhost:8080访问jenkins项目即可。
安装插件:如没有报错则进入下图
点击:【选择插件来安装】(选择【安装推荐的插件】也可以),根据笔者的经验选择【选择插件来
安装】安装插件顺利些,选择后出现如下默认插件安装界面。
这个页面会默认选中安装一些插件,直接点击”安装”按钮,安装所有推荐的插件。
资源分享 下面这份资源,对于想学习【软件测试】的朋友来说应该是最全面最完整的备战仓库,希望也能帮助到你!
资源分享 下面这份资源,对于想学习【软件测试】的朋友来说应该是最全面最完整的备战仓库,希望也能帮助到你!
Java 语言基础(一) 前言一、注释和标识符1. 注释2. 字符集3. 标识符4. 关键字(略) 二、数据类型1.基本类型2.引用类型 三、 常量和变量1.常量2.变量 四、操作符1.赋值运算符2.算术运算符3.关系运算符4.逻辑运算符5.位运算符6.三位运算符7.instanceof运算符 五、流程控制语句六、数组1.数组的语法2.数组的应用3.数组的复制4.数组的遍历(foreach) 乒乓球自由落体示例总结 前言 开始学习Java编程了,本文适合有一定语言基础的友友们,内容基础,可以借鉴学习。(内容整理自燕山大学的学习资料)
一、注释和标识符 1. 注释 Java 语言提供三种类型的注释:
单行注释:以// 开始,以换行符结束。
多行注释:以/* 开始,以*/结束,每行以开始。
文档注释:以/** 开始,以/ 结束,注释中的每行必须以*开始。采用javadoc命令可以从源代码中将信息取出,生成html格式的说明文档。
2. 字符集 ASCII字符集:美国信息互换标准编码,主要用于显示现代英语和其它西欧语言。
GB2312字符集:中国国家标准的简体中文字符集。
Unicode字符集:支持各种不同语言的书面文本的交换、处理及显示。javac -encoding utf-8 hello.java //编译克服乱码命令行
UTF-8(长度可变)
UTF-16(16位)
UTF-32(32位)
3. 标识符 在Java中标识符的命名规则:
标识符必须以字母或下划线()或 $ 符号开始。其余字符可以是字母、数字、$ 符号和下划线。
标识符只能包含两个特殊字符,即下划线 () 和美元符号 ($)。不允许有任何其他特殊字符。
标识符不能包含空格。
区分大小写。
不能使用Java关键字。
4. 关键字(略) 二、数据类型 1.基本类型 (1)基本数据类型的特点
Java 中的基本数据类型的长度是固定的,不依赖于硬件平台,因此具有良好的可移植性。(共8种)
整数类型 (byte、short、int、long)
浮点数类型 (float、double)
字符类型 (char)
布尔类型 (boolean)
Java 中的基本数据类型必须有初始值
核心思想 集成 AbstractRoutingDataSource 并重写 determineCurrentLookupKey 方法。determineCurrentLookupKey 方法的返回值决定了spring使用那个数据源,如果返回null则使用默认数据源。在AbstractRoutingDataSource 的构造函数中完成 多数据源和默认数据源的注册。定义 DruidConfig配置,该配置文件主要将三个 数据源注册到spring中,并且将 主数据员和第二个数据源通过AbstractRoutingDataSource 的实现注册到spring中。 核心代码 pom
<!-- Druid 数据连接池依赖 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.8</version> </dependency> <!--MyBatis整合SpringBoot框架的起步依赖--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.4</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- jdbc --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> <version>2.7.8</version> </dependency> <!-- Mysql驱动包 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.27</version> </dependency> yml配置
# 数据源配置 spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.cj.jdbc.Driver druid: # 主库数据源 master: url: jdbc:mysql://localhost:3306/test?
好文推荐 https://zhuanlan.zhihu.com/p/563949762 mybatis 配置多数据源 参考文章
https://blog.csdn.net/qq_38353700/article/details/118583828 使用mybatis配置多数据源我接触过的有两种方式,一种是通过java config的方式手动配置两个数据源,另一种方式便是使用mybatis-plus-dynamic。*
总体来说,配置主要包括,产生DataSource,然后是mybatis所需要的SqlSessionFactory,以及配置相应的事务管理器
示例代码 pom
<!--MyBatis整合SpringBoot框架的起步依赖--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.4</version> </dependency> <!-- Mysql驱动包 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.27</version> </dependency> <!-- jdbc --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> <version>2.7.8</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> 配置文件 yml
server: port: 8080 spring: datasource: master: jdbc-url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useUnicode=true&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=GMT%2B8 username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver slave: jdbc-url: jdbc:mysql://43.143.217.124:3306/hongbei?characterEncoding=utf8&useUnicode=true&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=GMT%2B8 username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver java config 配置数据源一
=:一个等号为赋值操作==:二个等号为判断,判断的是值是否相等,相等返回 true,不等返回 false===:三个等号为全等,判断的是值和类型是否相等,相等返回 true,不等返回 false 等于操作符 等于操作符用两个等于号( == )表示,如果操作数相等,则会返回 true
在JavaScript中存在隐式转换。等于操作符(==)在比较中会先进行类型转换,再确定操作数是否相等
遵循以下规则:
如果任一操作数是布尔值,则将其转换为数值再比较是否相等 let result1 = true == 1 // true 如果一个操作数是字符串,另一个操作数是数值,则尝试将字符串转换为数值,再比较是否相等 let result1 = '55' == 55 // true 如果一个操作数是对象,另一个操作数不是,则调用对象的 valueOf()方法取得其原始值,再根据前面的规则进行比较 let obj = { valueOf: function () { return 1 }, } let result1 = obj == 1 // true null和undefined相等 let result1 = null == undefined // true 如果有任一操作数是 NaN ,则相等操作符返回 false let result1 = NaN == NaN // false 如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回true let obj1 = {name:"