開發過程中遇到的問題以及解決方法

鞏固基礎,砥礪前行 。
只有不斷重復,才能做到超越自己。
能堅持把簡單的事情做到極致,也是不容易的。

開發過程中遇到的問題以及解決方法

簡單易用的git命令

git命令:
查看有幾個分支:git branch -a
切換分支:git checkout 分支名稱
下載項目:git clone url
拉取項目:每次提交代碼之前都需要,相當于更新代碼 git pull
查看那些文件發送了變化: git status
給本地提交代碼:git add 文件名
寫注釋:git commit -m “注釋”
配置全局變量:git config --global user.email 注冊的郵件名稱
git config --global user.name 注冊的用戶名
給遠程提交代碼:git push

Java操作樹結構

在Java程序中,我們有時會遇見需要遍歷樹類型的場景,如:機構部門的遍歷,如省市區 這種遍歷操作,以下是可以直接使用的邏輯代碼。

1 @UtilityClass2 public class TreeUtil {3     /**4      * 兩層循環實現建樹5      *6      * @param treeNodes 傳入的樹節點列表7      * @return8      */9     public <T extends TreeNode> List<T> bulid(List<T> treeNodes, Object root) {
10 
11         List<T> trees = new ArrayList<>();
12 
13         for (T treeNode : treeNodes) {
14 
15             if (root.equals(treeNode.getParentId())) {
16                 trees.add(treeNode);
17             }
18 
19             for (T it : treeNodes) {
20                 if (it.getParentId() == treeNode.getId()) {
21                     if (treeNode.getChildren() == null) {
22                         treeNode.setChildren(new ArrayList<>());
23                     }
24                     treeNode.add(it);
25                 }
26             }
27         }
28         return trees;
29     }
30 
31     /**
32      * 使用遞歸方法建樹
33      *
34      * @param treeNodes
35      * @return
36      */
37     public <T extends TreeNode> List<T> buildByRecursive(List<T> treeNodes, Object root) {
38         List<T> trees = new ArrayList<T>();
39         for (T treeNode : treeNodes) {
40             if (root.equals(treeNode.getParentId())) {
41                 trees.add(findChildren(treeNode, treeNodes));
42             }
43         }
44         return trees;
45     }
46 
47     /**
48      * 遞歸查找子節點
49      *
50      * @param treeNodes
51      * @return
52      */
53     public <T extends TreeNode> T findChildren(T treeNode, List<T> treeNodes) {
54         for (T it : treeNodes) {
55             if (treeNode.getId() == it.getParentId()) {
56                 if (treeNode.getChildren() == null) {
57                     treeNode.setChildren(new ArrayList<>());
58                 }
59                 treeNode.add(findChildren(it, treeNodes));
60             }
61         }
62         return treeNode;
63     }
64 }TreeUtil
部分代碼:
List<ByEhOperationRoomConf> parentList = list.stream().filter(b->b.getParentCode()==null).collect(Collectors.toList());ByEhOperationRoomConf parentNode = parentList.get(0);Map<String,List<ByEhOperationRoomConf>> map = new HashMap<>();for (int i = 0; i < list.size(); i++) {ByEhOperationRoomConf item = list.get(i);String key = item.getParentCode();if(map.containsKey(key)) {List<ByEhOperationRoomConf> itemList = map.get(key);itemList.add(item);map.put(key, itemList);}else {List<ByEhOperationRoomConf> itemList = new ArrayList<>();itemList.add(item);map.put(key, itemList);}}map.remove(parentNode.getParentCode());parentNode = getParent(parentNode, map);public ByEhOperationRoomConf getParent(ByEhOperationRoomConf parentNode,Map<String,List<ByEhOperationRoomConf>> map) {for (String key:map.keySet()) {String code = parentNode.getCode();if(map.containsKey(code)) {List<ByEhOperationRoomConf> itemList = map.get(code);parentNode.setChildList(itemList);getParent(itemList.get(0), map);}}return parentNode;}

按照格式打印時間

Calendar c = Calendar.getInstance();System.out.println(c.get(Calendar.YEAR));System.out.println(c.get(Calendar.MARCH)+1);System.out.println(c.get(Calendar.DAY_OF_MONTH));int month = c.get(Calendar.MARCH)+1;int day = c.get(Calendar.DAY_OF_MONTH);String monthS = month+"";String dayS = day+"";if(monthS.length()==1) {monthS = "0"+monthS;}if(dayS.length()==1) {dayS = "0"+dayS;}String sspath = "/"+c.get(Calendar.YEAR)+"/"+monthS+"/"+dayS+"/";System.out.println("ss="+sspath);

將本地jar打到本地maven倉庫

將本地jar打到本地maven倉庫

rem mvn install:install-file -Dfile=E:\work\code\CA-KEY\lib\SVSClient.jar -DgroupId=cn.org.bjca.client -DartifactId=SYSClient -Dversion=1.0.1 -Dpackaging=jar
pause
mvn install:install-file -Dfile=E:\BJCA_LOG.jar -DgroupId=bjca.org -DartifactId=BJCALOG  -Dversion=1.0.1 -Dpackaging=jarpause

SpringBoot引入外部jar,并將項目打包成jar包,引發項目運行失敗的問題

SpringBoot引入外部jar,并將項目打包成jar包

正常打包操作
  • 在src/main/resource 目錄下創建一個lib文件夾,將需要打如到項目中的jar放在這里
  • 通過build path 將這些jar加入到工程中,以方便調用
  • 在pom.xml中增加,其中xxx看實際情況而定
	<dependencies><dependency><groupId>XXX</groupId><artifactId>XXX</artifactId><version>XXX</version><scope>system</scope><systemPath>${project.basedir}/src/main/resources/lib/XXX.jar</systemPath></dependency></dependencies>
  • 在pom.xml中增加build 邏輯
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><includeSystemScope>true</includeSystemScope></configuration></plugin></plugins><resources><resource><directory>lib</directory><targetPath>BOOT-INF/lib/</targetPath><includes><include>**/*.jar</include></includes></resource><resource><directory>src/main/resources</directory><targetPath>BOOT-INF/classes/</targetPath></resource></resources></build>
特別注意: 上面的build中的代碼僅僅是在打包的時候打開,在運行項目的時候,需要將上面的代碼注釋掉。不然會報錯:找不到XXXMapper.xml mybatis對應的xml文件。

如何將第三方jar包打到項目中?

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><!-- <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.13.RELEASE</version> <relativePath /> lookup parent from repository </parent> --><groupId>org.smartby</groupId><artifactId>rabbitmq</artifactId><version>1.0-SNAPSHOT</version><properties><java.version>1.6</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!-- <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13</version><!-- <scope>test</scope> --></dependency><dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>2.5.0</version></dependency><!-- <dependency> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>2.6</version> </dependency> <dependency> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> </dependency> --></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>1.1.8.RELEASE</version><configuration><source>1.6</source><target>1.6</target></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.7.1</version></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><source>1.6</source><target>1.6</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><version>3.0.0</version><configuration><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs></configuration><executions><execution><id>make-assembly</id> <!-- this is used for inheritance merges --><phase>package</phase> <!-- 指定在打包節點執行jar包合并操作 --><goals><goal>single</goal></goals></execution></executions></plugin></plugins></build>
</project>

Java通過FTPclient上傳文件后,文件內容是亂碼

//設置上傳文件的類型為二進制類型
ftp.setFileType(FTP.BINARY_FILE_TYPE);
ftp.setFileTransferMode(FTP.BINARY_FILE_TYPE);

以上設置方可解決。

itext和wkhtmltopdf兩種工具對比

在這里插入圖片描述

wkhtmltopdf linux centos7 HostNotFoundError

/usr/ttzz/wkhtmltox/bin/wkhtmltopdf  "/usr/ttzz/1daa45f957ba40298dfa17ef2ce63efc.html"  /usr/ttzz/1daa45f957ba40298dfa17ef2ce63efc.pdf
Loading pages (1/6)
[>                                                           ] 0%
[======>                                                     ] 10%
Error: Failed loading page http:/usr/ttzz/1daa45f957ba40298dfa17ef2ce63efc.html" (sometimes it will work just to ignore this error with --load-error-handling ignore)
Exit with code 1 due to network error: HostNotFoundError

在centos7 上安裝wohtmlbox插件,安裝成功。
單獨測試 也是可以的(wkhtmltopdf https://www.json.cn/ /usr/ttzz/2.pdf)
但是在程序中使用的時候就會報上面的錯誤。

修改辦法:去掉雙引號就可以了 ……

查看 yum 命令下載包的路徑

查看 yum 命令下載包的路徑

Downloadonly
yum install yum-plugin-downloadonly
rpm -ql libXrender | cat -nyum install --downloadonly --downloaddir=/usr/ttzz/yumdir/ libXrender
yum install --downloadonly --downloaddir=/usr/ttzz/yumdir/ libXext
yum install --downloadonly --downloaddir=/usr/ttzz/yumdir/ fontconfig

docker 簡單命令

安裝docker
檢查系統內核版本,必須是3.10以上才能安裝docker : uname -r
安裝docker :yum install docker
查看docker版本: docker -v ; docker info
啟動docker: systemctl start docker
設置開啟啟動docker :systemctl enable docker
關閉docker :systemctl stop docker

安裝dockers遇到的問題:
[root@localhost ~]# service docker start
Redirecting to /bin/systemctl start docker.service
Job for docker.service failed because the control process exited with error code. See “systemctl status docker.service” and “j
ournalctl -xe” for details.
查看詳細內容:
[root@localhost ~]# systemctl status docker.service
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
Active: failed (Result: exit-code) since 五 2018-10-12 13:58:56 CST; 20s ago
Docs: http://docs.docker.com
Process: 5179 ExecStart=/usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default
-runtime=docker-runc --exec-opt native.cgroupdriver=systemd --userland-proxy-path=/usr/libexec/docker/docker-proxy-current --i
nit-path=/usr/libexec/docker/docker-init-current --seccomp-profile=/etc/docker/seccomp.json $OPTIONS $DOCKER_STORAGE_OPTIONS $
DOCKER_NETWORK_OPTIONS $ADD_REGISTRY $BLOCK_REGISTRY $INSECURE_REGISTRY $REGISTRIES (code=exited, status=1/FAILURE)
Main PID: 5179 (code=exited, status=1/FAILURE)
10月 12 13:58:54 localhost systemd[1]: Starting Docker Application Container Engine…
10月 12 13:58:54 localhost dockerd-current[5179]: time=“2018-10-12T13:58:54.608122086+08:00” level=warning msg=“could…ound”
10月 12 13:58:54 localhost dockerd-current[5179]: time=“2018-10-12T13:58:54.614454691+08:00” level=info msg=“libconta…5184”
10月 12 13:58:56 localhost dockerd-current[5179]: Error starting daemon: SELinux is not supported with the overlay2 g…alse)
10月 12 13:58:56 localhost systemd[1]: docker.service: main process exited, code=exited, status=1/FAILURE
10月 12 13:58:56 localhost systemd[1]: Failed to start Docker Application Container Engine.
10月 12 13:58:56 localhost systemd[1]: Unit docker.service entered failed state.
10月 12 13:58:56 localhost systemd[1]: docker.service failed.
Hint: Some lines were ellipsized, use -l to show in full.
找到docker-storage文件
解決:執行 vi /etc/sysconfig/selinux , 把 selinux 屬性值改為disabled
docker 啟動成功

docker命令
docker search mysql:5.7
docker images
docker pull mysql:5.7
刪除鏡像:docker rmi docker_id
刪除容器:docker rm docker_id

docker stop docker_id 關閉軟件
docker start docker_id 重啟軟件

docker ps
docker ps -a
啟動mysql容器: docker run ‐p 3306:3306 ‐‐name mysql02 ‐e MYSQL_ROOT_PASSWORD=123456 ‐d mysql
停止容器 : docker stop docker_id

安裝mysql:
docker search mysql:5.7
docker pull mysql:5.7
docker images
docker run ‐p 3306:3306 ‐‐name mysql02 ‐e MYSQL_ROOT_PASSWORD=123456 ‐d mysql

安裝establishsearch
docker search elasticsearch:5.6.9
docker pull elasticsearch:5.6.9
docker images
docker run -p 9200:9200 -p 9300:9300 -e “discovery.type=single-node” -e ES_JAVA_OPTS=“-Xms256m -Xmx256m” -d --name ES01 elasticsearch:5.6.9

安裝redis
docker pull redis
docker images
docker run -itd --name redis-test -p 6379:6379 redis

安裝tomcat

安裝es
#啟動鏡像
docker run --name elasticsearch7.8 -d -e ES_JAVA_OPTS=“-Xms512m -Xmx512m” -e “discovery.type=single-node” -p 9200:9200 -p 9300:9300 elasticsearch:7.8.0

docker簡單命令2

cat /etc/redhat-release 
uname -r
docker version
systemctl stop docker
systemctl start docker
systemctl restart docker
systemctl status docker
systemctl enable docker -- 開機啟動
docker info
docker XX -help
-- 鏡像
docker images -a
docker images -q -- 只顯示鏡像id
docker search XX
docker search XX -- limit num 只顯示多少條
docker pull ubuntu
docker system df 查看鏡像容器數據卷占用的空間
docker rmi -f 鏡像名稱或者id 刪除某個鏡像
docker rmi -f $(docker images -q) 刪除全部鏡像
--容器
docker run -it -d --name ''  : i 交互 t 偽終端 d 后臺啟動 P 隨機端口 p 映射端口
docker ps
docker ps -a
exit		 說是容器停止,但是也沒有停止啊
ctrl+p+q
docker start 容器id或者容器名稱
docker restart 容器id或者容器名稱
docker stop 容器id或者容器名稱
docker kill 容器id或者容器名稱  強制關閉
docker rm 容器id  刪除已經停止的容器
docker rm -f $(docker ps -a -q) 刪除所有容器
docker exec -it  18b22d138c6a /bin/bash 
docker attach 18b22d138c6a   使用exit 后容器掛了
容器內->物理機
docker cp 18b22d138c6a:/usr/ttzz/aa.txt /tmp/aa.txt  這個命令需要在宿主機中使用
[root@localhost tmp]# docker cp 18b22d138c6a:/usr/ttzz/aa.txt /tmp/aa.txt
物理機->容器內
docker cp /tmp/bb.txt  18b22d138c6a:/usr/ttzz/
[root@localhost tmp]# docker cp /tmp/bb.txt  18b22d138c6a:/usr/ttzz/
導出容器
docker export 18b22d138c6a > /usr/ttzz/aa.tar.gz
[root@localhost /]# docker export 18b22d138c6a > /usr/ttzz/aa.tar.gz

docker 如何啟動tomcat

docker run -d -p 8080:8080 -v /opt/docker/webapps:/usr/local/tomcat/webapps b4b762737ed4

docker 啟動mysql

docker run -p 3306:3306  --name mysql -v /opt/mysql/data:/var/lib/mysql -v /opt/mysql/my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD="root" -d mysqldocker run -p 12345:3306 --name mysql -v /zzyyuse/mysql/conf:/etc/mysql/conf.d -v /zzyyuse/mysql/logs:/logs -v /zzyyuse/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6docker run -p 3306:3306  --name mysql -v /opt/mysql/data:/var/lib/mysql -v /opt/mysql/my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6

如何拷貝文件到docker內部

[root@localhost webapps]# docker cp   edfb9f493717:/usr/local/tomcat/webapps/qq.txt /ttzz/qq.txt[root@localhost ttzz]# docker inspect edfb9f493717"HostConfig": {"Binds": ["/opt/docker/webapps:/usr/local/tomcat/webapps"],

docker 安裝 rabbmit

docker 安裝 rabbmit https://www.cnblogs.com/yy-cola/p/11089800.html

Java 按照拼音排序方法

static  class ComparatorPinYin implements Comparator<SysUserForPad>{  @Override  public int compare(SysUserForPad o1, SysUserForPad o2) { return ToPinYinString(o1.getUserName()).compareTo(ToPinYinString(o2.getUserName()));  }  private String ToPinYinString(String str){  StringBuilder sb=new StringBuilder();  String[] arr=null;  for(int i=0;i<str.length();i++){  arr= PinyinHelper.toHanyuPinyinStringArray(str.charAt(i));  if(arr!=null && arr.length>0){  for (String string : arr) {  sb.append(string);  }  }  }  return sb.toString();  }  } 

jps 和 jstack 命令使用

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

項目的數據返回格式

Result result = new Result();
result.setPageNumber(pageNumber);
result.setPageSize(pageSize);
result.setTotal(list.size());
Integer totalPages = list.size()%pageSize==0?list.size()/pageSize:(list.size()/pageSize +1);
result.setListData(list);
AjaxResultVo vo = new AjaxResultVo(200,"查詢成功",result);

亂碼 轉碼

	/*** 解決亂碼問題  先用  iso-8859-1 編碼  再用  GBK解碼* @param o*/private void convertIsoToGbk(Object o) throws IllegalAccessException, UnsupportedEncodingException {if (o == null){return;}Class<?> aClass = o.getClass();Field[] declaredFields = aClass.getDeclaredFields();for (Field f :  declaredFields){f.setAccessible(true);Object v = f.get(o);if (v instanceof String){String s = String.valueOf(v);byte[] bytes = s.getBytes("iso-8859-1");s = new String(bytes, Charset.forName("GBK"));f.set(o, s);}}}

數據結構介紹

數據結構分為線性結構和非線性結構
線性結構:
線性結構是最常用的數據結構,特點是數據元素之間存在一對一的線性關系;
線性結構有兩種不同的存儲結構,順序存儲結構(數組存儲)和鏈式存儲結構(鏈表)。順序存儲的線性表稱為順序表,順序表中的存儲元素是連續的;
鏈式存儲的為鏈表,鏈表的存儲元素一般不是連續的,元素節點中存放數據元素以及相鄰元素的地址信息;
線性結構常見的有:數組 鏈表 隊列 棧

非線性結構
非線性結構包括:二維數組 廣義表 樹 圖

oracle 日期時間映射,to_date函數

  <result property="startDateTime" javaType="java.util.Date" jdbcType="TIMESTAMP"   column="START_DATE_TIME"    /><result property="endDateTime"  javaType="java.util.Date" jdbcType="TIMESTAMP"  column="END_DATE_TIME"    />to_date(XXX,'yyyy-MM-dd hh24:mi:ss')

oracle with

create or replace view view_name 
(
XX,
XX
)WITH d as(select casewhen to_number(to_char(sysdate, 'hh24')) between 0 and 7 thentrunc(sysdate, 'DD')elsetrunc(sysdate, 'DD') + 1end ddfrom dual)
select XXX
from aa,d.dd 
where d.dd between xx and xx

jvm 參數查詢命令

	D:\workspace-test\tz\ttzz\src\test\java\ttzz\jvm>jps -lD:\workspace-test\tz\ttzz\src\test\java\ttzz\jvm>jinfo -flag PrintGCDetails 27756D:\workspace-test\tz\ttzz\src\test\java\ttzz\jvm>java -XX:+PrintCommandLineFlags -versionD:\workspace-test\tz\ttzz\src\test\java\ttzz\jvm>java -XX:+PrintFlagsFinal -XX:MetaspaceSize=512m HelloGC_60D:\workspace-test\tz\ttzz\src\test\java\ttzz\jvm>java -XX:+PrintFlagsFinalD:\workspace-test\tz\ttzz\src\test\java\ttzz\jvm>java -XX:+PrintFlagsInitialD:\workspace-test\tz\ttzz\src\test\java\ttzz\jvm>jinfo -flags 33056D:\workspace-test\tz\ttzz\src\test\java\ttzz\jvm>jinfo -flag MetaspaceSize 33056-XX:MetaspaceSize=21807104D:\workspace-test\tz\ttzz\src\test\java\ttzz\jvm>jinfo -flag MaxTenuringThreshold 33056-XX:MaxTenuringThreshold=15D:\workspace-test\tz\ttzz\src\test\java\ttzz\jvm>jinfo -flag InitialHeapSize 33056

jvmboolean參數

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
[GC (Allocation Failure) [PSYoungGen: 512K->491K(1024K)] 512K->531K(259584K), 0.0011473 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
helloGC

mybatis oracle 批量插入

在這里插入圖片描述

oracle mybatis xml select 、update

java 類

	void insertRecordDomain(RecordDomain d);RecordDomain selectRecordDomain(String id);

XML文件

<insert id="insertRecordDomain" parameterType="com.wpmt.ons.domain.RecordDomain">insert into by_surgical_goods_check(check_id,first_check_time,  record_id)values (#{checkId},#{firstCheckTime, jdbcType=TIMESTAMP} ,#{recordId})</insert><resultMap type="com.wpmt.ons.domain.RecordDomain" id="rdMap"><result column="check_id" property="checkId" jdbcType="VARCHAR"/><result column="first_check_time" property="firstCheckTime" jdbcType="TIMESTAMP"/><result column="record_id" property="recordId" jdbcType="VARCHAR"/></resultMap><select id="selectRecordDomain" resultMap="rdMap"> select check_id,first_check_time,  record_id from by_surgical_goods_check WHERE CHECK_ID = #{id}</select>

定時任務

1)啟動類 @EnableScheduling // 開啟基于注解的定時任務功能
2)service類的方法上標記@Scheduled(cron = "0/2 * * * * ?")  //每2秒執行一次
@Scheduled(cron = "0/2 * * * * ?")  //每2秒執行一次
public void testSchedule() {System.out.println("1111");
}

3)常用例子

 second(秒), minute(分), hour(時), day of month(日), month(月), day of week(周幾).*   0 * * * * MON-FRI*  【0 0/5 14,18 * * ?】 每天14點整,和18點整,每隔5分鐘執行一次*  【0 15 10 ? * 1-6】 每個月的周一至周六10:15分執行一次*  【0 0 2 ? * 6L】每個月的最后一個周六凌晨2點執行一次*  【0 0 2 LW * ?】每個月的最后一個工作日凌晨2點執行一次*  【0 0 2-4 ? * 1#1】每個月的第一個周一凌晨2點到4點期間,每個整點都執行一次;

mysql 創建用戶并授權

create user ‘dog’@‘%’ identified by ‘123456’;
grant select,insert,update,delete on oop_dev.* to ‘dog’@‘%’;

grant select,update on oop_dev.sys_config to ‘dog’@‘%’;

flush privileges;

mysql left join中on后加條件判斷和where中加條件的區別

left join中關于where和on條件的幾個知識點:
1.多表left join是會生成一張臨時表,并返回給用戶
2.where條件是針對最后生成的這張臨時表進行過濾,過濾掉不符合where條件的記錄,是真正的不符合就過濾掉。
3.on條件是對left join的右表進行條件過濾,但依然返回左表的所有行,右表中沒有的補為NULL
4.on條件中如果有對左表的限制條件,無論條件真假,依然返回左表的所有行,但是會影響右表的匹配值。也就是說on中左表的限制條件只影響右表的匹配內容,不影響返回行數。
結論:
1.where條件中對左表限制,不能放到on后面
2.where條件中對右表限制,放到on后面,會有數據行數差異,比原來行數要多

insert into select,mysql @rownum


INSERT INTO `bbbb`(`PROJECT_ID`, `PROJECT_CODE`, `PROJECT_NAME`, `DEPT_CODE`, `INPUT_CODE`) 
select replace(uuid(),"-","") id,bb.TREAT_PROJECT_ID,bb.title,bb.DEPT_NAME,bb.INPUT_CODE
from
(SELECT distinct TREAT_PROJECT_ID,title,DEPT_NAME,INPUT_CODE FROM `aaaa`) bb;select * from bbbb;INSERT INTO `cccc`(`PROJECT_ITEM_ID`, `SERIAL_NO`,`PROJECT_CODE` , `ITEM_CODE`, `ITEM_NAME`)
select
replace(uuid(),"-","") as uuid,
(@row_number := case when @TREAT_PROJECT_ID = a.TREAT_PROJECT_IDthen@row_number + 1 else 1end
) rn,
(@TREAT_PROJECT_ID := a.TREAT_PROJECT_ID ) as TREAT_PROJECT_ID,
a.ORDER_CODE,
a.ORDER_TEXT
from aaaa a,( SELECT @row_number := 0, @TREAT_PROJECT_ID := '' ) b 
order by TREAT_PROJECT_ID ;select * from cccc;

開發過程中的版本發布

傳統 系統上線新舊版本切換操作:
方式1:舊版本的備份,新的發布。
方式2:通過ngnix。新舊環境,通過ngnix切換
方式3:應用啟動時做到瞬間切換
方式4:在先測試新版本應用,沒問題 然后切換上線

springcloud 的灰度發布,可以使用注冊中心得metadata和Zuul + 特定的負載均衡 的方式進行發布

常見的發布方式
1.藍綠發布:就相當于上面說的方式2,藍綠兩套環境
2.滾動發布:集群環境中按照節點 逐步更新
3.灰度發布:線上部署一個新版本應用,引入少量的流量到應用中,沒有問題,就全部更新。
灰度發布有兩種方式:
A/B方式:引流少量流量,是引流的方式
金絲雀方式部署:在集群中部署一個要上線的版本。

MathUtil BigDecimal工具類

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.NumberFormat;public class MathUtil{/*** @param d1 被除數* @param d2 除數* @param digit 位數* @return*/public static BigDecimal divide(BigDecimal d1,BigDecimal d2,int digit){if(d2.intValue()==0){return new BigDecimal(0);}else{return d1.divide(d2,digit,BigDecimal.ROUND_HALF_UP);}}/*** 兩數相除得到百分比* @param d1 被除數* @param d2 除數* @param digit 位數 * @return*/public static String divideToPercent(BigDecimal d1,BigDecimal d2,int digit){if(d2.intValue()==0){return "0%";}else{return convertToPercent(d1.divide(d2,3,BigDecimal.ROUND_HALF_UP).toString(),digit);}}/*** 獲取增長率:(d1-d2)/d2 --->轉換為百分比* @param d1 * @param d2* @param digit 百分比位數* @return*/public static String getRatio(BigDecimal d1,BigDecimal d2,int digit) {String ratio = "0%";if(d2.floatValue()==0){ratio = d1.multiply(new BigDecimal(100)).setScale(1, BigDecimal.ROUND_HALF_UP).toString()+"%";}else{BigDecimal d3 = d1.subtract(d2).divide(d2,digit+2, RoundingMode.HALF_UP);ratio = convertToPercent(d3.toString(), digit);}return ratio;}/*** 轉化為百分比* @param str* @param* @return*/public static String convertToPercent(String str,int digit){NumberFormat percent = NumberFormat.getPercentInstance();percent.setMaximumFractionDigits(digit);String ratio = percent.format(Double.parseDouble(str));return ratio;}/*** 百分比轉換為BigDecimal* @param str* @return*/public static BigDecimal convertPercentToDecimal(String str){String s1 = str.split("%")[0];BigDecimal d1 = new BigDecimal(s1).divide(new BigDecimal(100));return d1;}/*** 十進制轉二進制 返回二進制字符串* @param: num 十進制數* @param: bits 保留位數* @author: liudongxin* @date: 2020/11/2 - 18:00*/public static String toBinaryString(int num,int bits){StringBuilder stringBuilder = new StringBuilder();for(int i = bits;i >= 1; i--) {stringBuilder.append(num >>> i & 1);}return stringBuilder.toString();}/*** 異或運算* @param: binaryString 二進制數* @param: compareString 對照值* @author: liudongxin* @date: 2020/11/2 - 18:00*/public static String bitWiseXor(String binaryString, String compareString){//轉換成字符數組StringBuilder stringBuilder = new StringBuilder();char[] chars = binaryString.toCharArray();char[] compareChars = compareString.toCharArray();for (int i = 0; i < chars.length; i++) {stringBuilder.append(chars[i] ^ compareChars[i]);}return stringBuilder.toString();}/*** 計算冪次方 -1* @param: num 十進制數* @param: power 保留位數* @author: liudongxin* @date: 2020/11/2 - 18:00*/public static int calPower(int num,int power){return (int)(Math.floor(Math.pow(num,power)) - 1);}}

js web workers簡介

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title></head><body><input type="text" name="" id="t1" value="" placeholder="請輸入數字" /><button type="button" id="b1">計算斐波那契數字</button><script type="text/javascript">/*** web workers 簡介:主要提供了主線程調用分線程的API* Worker: 構造函數,加載分線程執行的js文件* Workers.prototype.onmessage:用來接收另一個線程的回調函數* Workers.prototype.postMessage:向另一個線程發送消息* * 缺點:* 		worker 內代碼不能操作dom* 		不能跨域加載js* 		不是所有的瀏覽器都支持這種新特性(h5)*/document.getElementById('b1').onclick = function(){var num = document.getElementById('t1').value;//創建一個Worker對象var worker = new Worker("c.js");worker.onmessage = function(event){console.log("主線程接收分線程返回的數據:"+event.data)}worker.postMessage(num);console.log("主線程向分線程發送的數據:"+num)}</script></body>
</html>

c.js

function fun(n){if(n<=2) {return 1;}else {return fun(n-1) + fun(n-2)}
}
this.onmessage = function(event){var num = event.data;console.log("分線程接收主線程的數據:"+event.data)var result = fun(num);postMessage(result)console.log("分線程向主線程返回的數據是:"+result)
}

Mybatis 會將 Integer 或者 int 值 為 0 的字段 轉成 null

在這里插入圖片描述

Java 開發規范 強烈推薦 阿里Java開發手冊

最近在查看和修改別人的代碼,遇到了一些很基礎 但是也分不簡單的問題,下面給大家列舉一下:

  1. 使用String類型的數據和Integer類型的數據用 equal方法做比較,這種類型的if條件,程序就不會進去;

  2. 前后端數據傳遞的時候,使用一個大的String類型的字符串傳過來,然后再使用json解析成為對象,這個可以利用SpringMVC的機制,完全可以將屬性映射成為實體屬性的

3.使用mybatis 開發mapper中的操作數據庫的方法的時候,沒有去做驗證測試,同時代碼也沒有做test 測試,毫無體驗可言;

4.Java 中數據類型直接的加減乘除 自己寫方法來操作,jdk已經給我們提供了標準的API,自己還閉門造車

  1. 這一點因人而異吧,在mapper方法中返回的數據類型,都是使用mapper接收,我覺得沒有完全沒有可讀性;在mapper方法入參也是用map傳參,同理,也沒有可讀性。我認為 好的代碼 不僅機器可以看懂,也需要人可以看懂;

  2. 代碼清一色的沒有注釋,返回的報錯信息 只有成功 、失敗;嚴重影響可讀性。

java 轉拼音

List<DictItem> list = dictItemMapper.findDictItemList(domain);
List<Map<String, Object>> listMap = new ArrayList<Map<String, Object>>();
Collections.sort(list, new ComparatorPinYin());
for (int i = 0; i < list.size(); i++) {Map<String, Object> map = new HashMap();map.put("userCode", list.get(i).getItemCode());map.put("userName", list.get(i).getItemName());String key = ChineseCharToEn.getAllFirstLetter(list.get(i).getItemName(), true,1);map.put("key", key);listMap.add(map);
}static  class ComparatorPinYin implements Comparator<ByOperationBillItem>{  @Override  public int compare(ByOperationBillItem o1, ByOperationBillItem o2) { return ToPinYinString(o1.getItemName()).compareTo(ToPinYinString(o2.getItemName()));  }  private String ToPinYinString(String str){  StringBuilder sb=new StringBuilder();  String[] arr=null;  for(int i=0;i<str.length();i++){  arr= PinyinHelper.toHanyuPinyinStringArray(str.charAt(i));  if(arr!=null && arr.length>0){  for (String string : arr) {  sb.append(string);  }  }  }  return sb.toString();  }  }

Java 反射invoke方法 為啥不能 傳對象類型

在這里插入圖片描述
因為這里是一個可變參數。

SpringBoot 、SpringCloud API 地址

SpringCloud:https://cloud.spring.io/spring-cloud-static/Hoxton.SR1/reference/htmlsingle/

SpringBoot:https://docs.spring.io/spring-boot/docs/2.2.2.RELEASE/reference/htmlsingle/

Java 中的JSON轉對象 JsonUtil

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;public class JsonUtil {/*** json轉單個對象* @param obj* @param cla* @return*/public static Object getObject(String obj,Class cla) {if(obj==null) {return null;}return JSONObject.parseObject(obj, cla);}/*** json轉List對象* @param obj* @param cla* @return*/public static Object getObjectList(String obj,Class cla) {if(obj==null) {return null;}return JSONArray.parseArray(obj, cla);}/*** json轉單個對象* @param obj* @param cla* @return*/public static Object getObjectByObjectMapper(Object obj,Class cla) {if(obj==null) {return null;}return JSONObject.parseObject(getJSONString(obj), cla);} /*** json轉List對象* @param obj* @param cla* @return*/public static Object getObjectListByObjectMapper(Object obj,Class cla) {if(obj==null) {return null;}return JSONArray.parseArray(getJSONString(obj), cla);}/*** 使用@JsonProperty 注解 來實現數據轉換,需要使用特定的序列化方法* @param obj* @return*/public static String getJSONString(Object obj) {try {return new ObjectMapper().writeValueAsString(obj);} catch (JsonProcessingException e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}
}

MySQL查詢每科成績前1名

建表語句

CREATE TABLE `testclass` (`id` int(11) DEFAULT NULL,`name` varchar(20) DEFAULT NULL,`kecheng` varchar(20) DEFAULT NULL,`fenshu` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

插入語句

INSERT INTO testclass (id, name, kecheng, fenshu) VALUES (1, '張三', '語文', 10);
INSERT INTO testclass (id, name, kecheng, fenshu) VALUES (2, '張三', '數學', 80);
INSERT INTO testclass (id, name, kecheng, fenshu) VALUES (3, '李四', '語文', 50);
INSERT INTO testclass (id, name, kecheng, fenshu) VALUES (4, '李四', '外語', 100);
INSERT INTO testclass (id, name, kecheng, fenshu) VALUES (5, '王五', '語文', 66);
INSERT INTO testclass (id, name, kecheng, fenshu) VALUES (6, '王五', '數學', 79);select * from testclass;

查詢每科成績前一名

 SELECT t1.name,t1.kecheng,t1.fenshu FROM testclass t1 WHERE
(
SELECT count(1) FROM testclass t2 WHERE
t1.kecheng=t2.kecheng AND t2.fenshu>=t1.fenshu
)<=1
ORDER BY t1.kecheng,t1.fenshu DESC

一個函數介紹:group_concat

group_concat函數,它能將兩條或者多條單個記錄合并成為一條單個就記錄

去除掉XXXMapper.xml中的時間日期函數

在使用mybatis,對應不同的數據庫 oracle 、mysql等,對于查詢到的時間都需要格式化

對于查詢得到的時間,可以使用fastjson提供的注解@JsonFormat(“yyyy-MM-dd HH:mm:dd”)來處理
對于以時間為查詢條件的,mysql和oracle對時間的處理還不一樣。MySQL對于時間字段,可以使用字符串的時間作為條件;Oracle 必須以時間類型作為參數來查詢,否則會報錯
代碼實例
import java.text.ParseException;
import java.text.SimpleDateFormat;import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;import XXX.JobApplication;
import XXX.mapper.docaremapper.MedOperationScheduleMapper;
import XXX.mapper.onsmapper.BySurgicalGoodsDictMapper;@RunWith(SpringRunner.class)
@SpringBootTest(classes = JobApplication.class)
@WebAppConfiguration
public class DateTest {@Autowiredprivate WebApplicationContext webApplicationContext;private MockMvc mockMvc;@Beforepublic void setupMockMvc() {mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();}@Autowiredprivate MedOperationScheduleMapper medOperationScheduleMapper;@Autowiredprivate BySurgicalGoodsDictMapper bySurgicalGoodsDictMapper;@Testpublic void testDate() throws ParseException {String d1 = "2020-01-01 01:00:00";String d2 = "2020-09-01 01:00:00";//MySQL 數據庫int n = bySurgicalGoodsDictMapper.testMasterCount(d1, d2);System.out.println("n="+n);//Oracle 數據庫SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");int m = medOperationScheduleMapper.testCount(sdf.parse(d1), sdf.parse(d2));System.out.println("m="+m);}}

MyBatisPlus學習

MyBatisPlus 特性

  1. 無侵入:只做增強不做改變,引入它不會對現有工程產生影響,如絲般順滑
  2. 損耗小:啟動即會自動注入基本 CURD,性能基本無損耗,直接面向對象操作
  3. 強大的 CRUD 操作:內置通用 Mapper、通用 Service,僅僅通過少量配置即可實現單表大部分 CRUD 操作,更有強大的條件構造器,滿足各類使用需求
  4. 支持 Lambda 形式調用:通過 Lambda 表達式,方便的編寫各類查詢條件,無需再擔心字段寫錯
  5. 支持多種數據庫:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer2005、SQLServer 等多種數據庫
  6. 支持主鍵自動生成:支持多達 4 種主鍵策略(內含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解決主鍵問題
  7. 支持 XML 熱加載:Mapper 對應的 XML 支持熱加載,對于簡單的 CRUD 操作,甚至可以無 XML 啟動
  8. 支持 ActiveRecord 模式:支持 ActiveRecord 形式調用,實體類只需繼承 Model 類即可進行強大的 CRUD 操作
  9. 支持自定義全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  10. 支持關鍵詞自動轉義:支持數據庫關鍵詞(order、key…)自動轉義,還可自定義關鍵詞
  11. 內置代碼生成器:采用代碼或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 層代碼,支持模板引擎,更有超多自定義配置等您來使用
  12. 內置分頁插件:基于 MyBatis 物理分頁,開發者無需關心具體操作,配置好插件之后,寫分頁等同于普通 List 查詢
  13. 內置性能分析插件:可輸出 Sql 語句以及其執行時間,建議開發測試時啟用該功能,能快速揪出慢查詢
  14. 內置全局攔截插件:提供全表 delete 、 update 操作智能分析阻斷,也可自定義攔截規則,預防誤操作
  15. 內置 Sql 注入剝離器:支持 Sql 注入剝離,有效預防 Sql 注入攻擊
	<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.0.5</version></dependency>

testCase

//查詢user表所有數據@Testpublic void findAll() {List<User> users = userMapper.selectList(null);System.out.println(users);}//添加操作@Testpublic void addUser() {User user = new User();user.setName("岳不群2");user.setAge(70);user.setEmail("lucy@qq.com");//        user.setCreateTime(new Date());
//        user.setUpdateTime(new Date());int insert = userMapper.insert(user);System.out.println("insert:"+insert);}//修改操作@Testpublic void updateUser() {User user = new User();user.setId(5L);user.setAge(120);int row = userMapper.updateById(user);System.out.println(row);}//測試樂觀鎖/*** 主要適用場景:當要更新一條記錄的時候,希望這條記錄沒有被別人更新,也就是說實現線程安全的數據更新*/@Testpublic void testOptimisticLocker() {//根據id查詢數據User user = userMapper.selectById(5);//進行修改user.setAge(200);userMapper.updateById(user);}//多個id批量查詢@Testpublic void testSelectDemo1() {List<User> users = userMapper.selectBatchIds(Arrays.asList(1L, 2L, 3L));System.out.println(users);}@Testpublic void testSelectByMap(){HashMap<String, Object> map = new HashMap<>();map.put("name", "Jack");map.put("age", 10);List<User> users = userMapper.selectByMap(map);users.forEach(System.out::println);}//分頁查詢@Testpublic void testPage() {//1 創建page對象//傳入兩個參數:當前頁 和 每頁顯示記錄數Page<User> page = new Page<>(1,3);//調用mp分頁查詢的方法//調用mp分頁查詢過程中,底層封裝//把分頁所有數據封裝到page對象里面//第二個參數是 QueryWrapperuserMapper.selectPage(page,null);//通過page對象獲取分頁數據System.out.println(page.getCurrent());//當前頁System.out.println(page.getRecords());//每頁數據list集合System.out.println(page.getSize());//每頁顯示記錄數System.out.println(page.getTotal()); //總記錄數System.out.println(page.getPages()); //總頁數System.out.println(page.hasNext()); //下一頁System.out.println(page.hasPrevious()); //上一頁}//刪除操作 物理刪除@Testpublic void testDeleteById(){int result = userMapper.deleteById(1L);System.out.println(result);}//批量刪除@Testpublic void testDeleteBatchIds() {int result = userMapper.deleteBatchIds(Arrays.asList(1,2));System.out.println(result);}@Testpublic void testSelectQuery() {//創建QueryWrapper對象QueryWrapper<User> wrapper = new QueryWrapper<>();//通過QueryWrapper設置條件//ge、gt、le、lt//查詢age>=30記錄//第一個參數字段名稱,第二個參數設置值
//        wrapper.ge("age",30); //>=//eq、ne
//        wrapper.eq("name","lilei"); // = 'lilei'//wrapper.ne("name","lilei"); // ! = 'lilei'//between//查詢年齡 20-30
//        wrapper.between("age",20,30); //age BETWEEN 20 AND 30//like
//        wrapper.like("name","岳");//name LIKE '%岳%'//orderByDesc
//        wrapper.orderByDesc("update_time");//last
//        wrapper.last("limit 1"); //limit 1//        wrapper.isNull("name");//name IS NULL//        //指定要查詢的列
//        wrapper.select("id","name");//        User user = userMapper.selectOne(wrapper);
//        userMapper.selectCount(queryWrapper)//        wrapper.notLike(column, val)
//        wrapper.likeRight(column, val)//        wrapper.in("id", Arrays.asList("1"));//        wrapper.inSql("id", "select id from user where id < 3");//        wrapper
//        .like("name", "h")
//        .or(i -> i.eq("name", "李白").ne("age", 20));  // name LIKE ? OR ( name = ? AND age <> ? ) //        wrapper
//        .like("name", "h")
//        .or()
//        .between("age", 20, 30); //        wrapper.select("id", "name", "age");//        System.out.println(user);List<User> users = userMapper.selectList(wrapper);System.out.println(users);}@Testpublic void testUpdateSet() {//修改值User user = new User();
//        user.setId(1405537643277635586L);//修改條件UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();userUpdateWrapper
//            .like("name", "岳").eq("id", 1405537643277635586L).set("name", "老李頭")//除了可以查詢還可以使用set設置修改的字段.setSql(" email = '123@qq.com'");//可以有子查詢int result = userMapper.update(user, userUpdateWrapper);}

config

  //樂觀鎖插件@Beanpublic OptimisticLockerInterceptor optimisticLockerInterceptor() {return new OptimisticLockerInterceptor();}/*** 分頁插件*/@Beanpublic PaginationInterceptor paginationInterceptor() {return new PaginationInterceptor();}@Bean@Profile({"dev","test"})// 設置 dev test 環境開啟public PerformanceInterceptor performanceInterceptor() {PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();//performanceInterceptor.setMaxTime(500);//ms,超過此處設置的ms則sql不執行performanceInterceptor.setFormat(true);return performanceInterceptor;}

靜態屬性獲取配置文件中的值的操作方法

注意兩點:

1.配置類需要讓spring管理
2.set方法不要加static
3.如果靜態屬性是private修飾,則在使用的時候,需要 類名.getXXX方法
如果靜態屬性是public修飾,則在使用的時候,需要 類名.屬性名

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class TestConfig {private static String url ;public static String getUrl() {return url;}@Value("${sendMessUrl}")public  void setUrl(String url) {TestConfig.url = url;}
}
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class TestConfigController {@GetMapping("/testConfig")public String testConfig() {return TestConfig.getUrl();}
}

yml文件中的配置

sendMessUrl: XXX

【臨淵羨魚不如退而結網】
歡迎大家指點

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/35499.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/35499.shtml
英文地址,請注明出處:http://en.pswp.cn/news/35499.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Azure創建第一個虛擬機

首先&#xff0c;登錄到 Azure 門戶 (https://portal.azure.com/)。在 Azure 門戶右上角&#xff0c;點擊“虛擬機”按鈕&#xff0c;并點擊創建&#xff0c;創建Azure虛擬機。 在虛擬機創建頁面中&#xff0c;選擇所需的基本配置&#xff0c;包括虛擬機名稱、操作系統類型和版…

【JVM】JVM 調優的參數都有哪些?

文章目錄 1. 設置堆空間大小2. 虛擬機棧的設置3. 年輕代中Eden區和兩個Survivor區的大小比例4. 年輕代晉升老年代閾值5. 設置垃圾回收收集器 1. 設置堆空間大小 設置堆的初始大小和最大大小&#xff0c;為了防止垃圾收集器在初始大小、最大大小之間收縮堆而產生額外的時間&…

python編程小游戲簡單的,python小游戲編程100例

大家好&#xff0c;給大家分享一下python編程小游戲簡單的&#xff0c;很多人還不知道這一點。下面詳細解釋一下。現在讓我們來看看&#xff01; 不會python就不能用python開發入門級的小游戲&#xff1f; 當然不是&#xff0c;我收集了十個python入門小游戲的源碼和教程&#…

分支語句和循環語句(1)

這篇文章我們詳細的把分支語句和循環語句給大家進行講解。 分支語句&#xff1a; if switch 循環語句&#xff1a; while for do while goto語句&#xff1a; 1.什么是語句&#xff1f; C語句可分為以下五類&#xff1a; 1. 表達式語句 2. 函數調用語句 3. 控制…

qt自己實現方便的線程管理類

看本博客之前&#xff0c;可以先看看我這篇多線程博客&#xff1a;qt多線程使用方式_我是標同學的博客-CSDN博客

ORCA優化器淺析——CDXLOperator Base class for operators in a DXL tree

如上圖所示&#xff0c;CDXLOperator作為Base class for operators in a DXL tree&#xff0c;其子類CDXLLogical、CDXLScalar、CDXLPhysical作為邏輯節點、物理節點和Scalar節點的DXL表示類&#xff0c;因此其包含了這些類的共同部分特性&#xff0c;比如獲取其DXL節點表示的函…

Qt 文件對話框使用 Deepin風格

當你在Deepin或UOS 上開發 Qt 程序時&#xff0c;如果涉及到文件對話框功能&#xff0c;那么就會遇到調用原生窗口的問題。 如果你使用的是官方的Qt版本&#xff0c;那么在Deepin或者UOS系統上&#xff0c;彈出的文件對話框會是如下這樣&#xff1a; 而Deepin或UOS系統提供的默…

可視化高級繪圖技巧100篇-總論

前言 優秀的數據可視化作品可以用三個關鍵詞概括&#xff1a;準確、清晰、優雅。 準確&#xff1a;精準地反饋數據的特征信息&#xff08;既不遺漏也不冗余&#xff0c;不造成讀者疏漏&誤讀細節&#xff09; 清晰&#xff1a;獲取圖表特征信息的時間越短越好 優雅&…

Gitlab CI/CD筆記-第二天-主機套接字進行構建并push鏡像。

一、安裝gitlab-runner 1.可以是linux也可以是docker的 2.本文說的是docker安裝部署的。 二、直接上.gitlab-ci.yml stages: # List of stages for jobs, and their order of execution - build-image build-image-job: stage: build-image image: harbor.com:543/docke…

企業計算機服務器中了360后綴勒索病毒怎么辦,勒索病毒解密數據恢復

隨著計算機技術的不斷發展&#xff0c;企業的辦公系統得到了很大提升&#xff0c;但是隨之而來的網絡安全威脅也不斷增加&#xff0c;勒索病毒的攻擊事件時有發生。近期&#xff0c;我們收到某地連鎖超市的求助&#xff0c;企業的計算機服務器遭到了360后綴勒索病毒攻擊&#x…

C#四個字節十六進制與單精度浮點數互轉

C#四個字節十六進制與單精度浮點數互轉可以使用自帶的函數,也可以自己寫 實例如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace floatDemo {class Program{//首先設置:項目->屬性…

html練習

html練習 工具代碼運行結果 工具 HBuilder X 代碼 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>圖靈之家</title></head><body><h1>圖靈之家</h1><br><br><h2>我的…

Maxwell 數據同步使用教程

Maxwell 數據同步使用教程 Maxwell 是一個開源的 MySQL 數據同步工具&#xff0c;它可以提供可靠的、實時的數據復制服務。它的特點是將 MySQL 的 binlog 解析成易于理解、易于使用的 JSON 格式&#xff0c;并將其發送到 Kafka 或其他消息隊列&#xff0c;方便消費者進行數據處…

使用幾何和線性代數從單個圖像進行 3D 重建

使用幾何和線性代數從單個圖像進行 3D 重建 薩蒂亞 一、說明 3D重構是一個挑戰性題目&#xff0c;而且這個新穎的題目正處于啟發和膨脹階段&#xff1b;因此&#xff0c;各種各樣的嘗試層出不窮&#xff0c;本篇說明嘗試的一種&#xff0c;至于其它更多的嘗試&#xff0c;我們在…

nlohmann json:通過at讀取及設置object和array

讀取及設置: #include <iostream> #include <nlohmann/json.hpp> using namespace std; using json = nlohmann::json;int main() {json data = R"({"name": "xiaoming","age": 10, "parent": [{"father&qu…

RTT(RT-Thread)IO設備模型

目錄 IO設備模型 模型框架原理 IO設備類型 創建和注冊IO設備 RTT設備管理程序實現原理 訪問IO設備 查找設備 初始化設備 打開設備 關閉設備 控制設備 讀寫設備 數據收發回調 數據接收回調 數據發送回調 設備模型實例 IO設備模型 RT-Thread 提供了一套簡單的 I/O …

網絡編程(TFTP協議實驗)

#include <stdio.h> #include <string.h> #include <stdlib.h> #include <head.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h>#define PORT 69 //端口號&#xf…

網絡安全威脅與防御策略

第一章&#xff1a;引言 隨著數字化時代的快速發展&#xff0c;網絡已經成為人們生活和工作中不可或缺的一部分。然而&#xff0c;網絡的廣泛應用也引發了一系列嚴峻的網絡安全威脅。惡意軟件、網絡攻擊、數據泄露等問題層出不窮&#xff0c;給個人和企業帶來了巨大的風險。本文…

mysql基礎之觸發器的簡單使用

1.建立學生信息表 -- 觸發器 -- 建立學生信息表 create table s1(id int unsigned auto_increment,name varchar(30),score tinyint unsigned,dept varchar(50),primary key(id) );2.建立學生補考信息表 -- 建立學生補考信息表 create table s2 like s1;3.建立觸發器&#xf…

java 自定義xss校驗注解實現

自定義一個注解Xss。名字隨意 import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Targe…