开发过程中遇到的问题以及解决方法

巩固基础,砥砺前行 。

只有不断重复,才能做到超越自己。

能坚持把简单的事情做到极致,也是不容易的。

开发过程中遇到的问题以及解决方法

简单易用的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 @UtilityClass
 2 public class TreeUtil {
 3     /**
 4      * 两层循环实现建树
 5      *
 6      * @param treeNodes 传入的树节点列表
 7      * @return
 8      */
 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仓库

java 复制代码
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=jar

pause

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包打到项目中?

java 复制代码
<?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

java 复制代码
/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 命令下载包的路径

java 复制代码
Downloadonly
yum install yum-plugin-downloadonly
rpm -ql libXrender | cat -n

yum 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

java 复制代码
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

java 复制代码
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 mysql

docker 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.6

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=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 按照拼音排序方法

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 命令使用



项目的数据返回格式

java 复制代码
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);

乱码 转码

java 复制代码
	/**
		 * 解决乱码问题  先用  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函数

sql 复制代码
  <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

sql 复制代码
create or replace view view_name 
(
XX,
XX
)
 WITH d as
 (select case
           when to_number(to_char(sysdate, 'hh24')) between 0 and 7 then
            trunc(sysdate, 'DD')
           else
            trunc(sysdate, 'DD') + 1
         end dd
    from 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 -l
	D:\workspace-test\tz\ttzz\src\test\java\ttzz\jvm>jinfo -flag PrintGCDetails 27756
	D:\workspace-test\tz\ttzz\src\test\java\ttzz\jvm>java -XX:+PrintCommandLineFlags -version
	D:\workspace-test\tz\ttzz\src\test\java\ttzz\jvm>java -XX:+PrintFlagsFinal -XX:MetaspaceSize=512m HelloGC_60
	D:\workspace-test\tz\ttzz\src\test\java\ttzz\jvm>java -XX:+PrintFlagsFinal
	D:\workspace-test\tz\ttzz\src\test\java\ttzz\jvm>java -XX:+PrintFlagsInitial
	D:\workspace-test\tz\ttzz\src\test\java\ttzz\jvm>jinfo -flags 33056
	D:\workspace-test\tz\ttzz\src\test\java\ttzz\jvm>jinfo -flag MetaspaceSize 33056
	-XX:MetaspaceSize=21807104
	D:\workspace-test\tz\ttzz\src\test\java\ttzz\jvm>jinfo -flag MaxTenuringThreshold 33056
	-XX:MaxTenuringThreshold=15
	D:\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 类

java 复制代码
	void insertRecordDomain(RecordDomain d);
	RecordDomain selectRecordDomain(String id);

XML文件

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_ID
	then
		@row_number + 1 else 1
	end
) 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简介

javascript 复制代码
<!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

javascript 复制代码
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 转拼音

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 block
			e.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 {
	@Autowired
    private WebApplicationContext webApplicationContext;
    private MockMvc mockMvc;
    @Before
    public void setupMockMvc() {
        mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
    }
    @Autowired
	private MedOperationScheduleMapper medOperationScheduleMapper;
    @Autowired
    private BySurgicalGoodsDictMapper bySurgicalGoodsDictMapper;
    @Test
    public 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 注入攻击
java 复制代码
	<dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>mybatis-plus-boot-starter</artifactId>
			<version>3.0.5</version>
		</dependency>

testCase

java 复制代码
//查询user表所有数据
    @Test
    public void findAll() {
        List<User> users = userMapper.selectList(null);
        System.out.println(users);
    }

    //添加操作
    @Test
    public 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);
    }

    //修改操作
    @Test
    public void updateUser() {

        User user = new User();
        user.setId(5L);
        user.setAge(120);

        int row = userMapper.updateById(user);
        System.out.println(row);
    }

    //测试乐观锁
    /**
     * 主要适用场景:当要更新一条记录的时候,希望这条记录没有被别人更新,也就是说实现线程安全的数据更新
     */
    @Test
    public void testOptimisticLocker() {
        //根据id查询数据
        User user = userMapper.selectById(5);
        //进行修改
        user.setAge(200);
        userMapper.updateById(user);
    }

    //多个id批量查询
    @Test
    public void testSelectDemo1() {
        List<User> users = userMapper.selectBatchIds(Arrays.asList(1L, 2L, 3L));
        System.out.println(users);
    }

    @Test
    public 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);
    }

    //分页查询
    @Test
    public void testPage() {
        //1 创建page对象
        //传入两个参数:当前页 和 每页显示记录数
        Page<User> page = new Page<>(1,3);
        //调用mp分页查询的方法
        //调用mp分页查询过程中,底层封装
        //把分页所有数据封装到page对象里面
        //第二个参数是 QueryWrapper
        userMapper.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()); //上一页

    }

    //删除操作 物理删除
    @Test
    public void testDeleteById(){
        int result = userMapper.deleteById(1L);
        System.out.println(result);
    }

    //批量删除
    @Test
    public void testDeleteBatchIds() {

        int result = userMapper.deleteBatchIds(Arrays.asList(1,2));
        System.out.println(result);
    }

     @Test
    public 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);

    }
    
    @Test
    public 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

  //乐观锁插件
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInterceptor();
    }
	/**
     * 分页插件
     */
    @Bean
    public 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修饰,则在使用的时候,需要 类名.属性名

java 复制代码
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;
	}
}
java 复制代码
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文件中的配置

yaml 复制代码
sendMessUrl: XXX

【临渊羡鱼不如退而结网】

欢迎大家指点

相关推荐
吾日三省吾码2 小时前
JVM 性能调优
java
弗拉唐3 小时前
springBoot,mp,ssm整合案例
java·spring boot·mybatis
oi773 小时前
使用itextpdf进行pdf模版填充中文文本时部分字不显示问题
java·服务器
少说多做3434 小时前
Android 不同情况下使用 runOnUiThread
android·java
知兀4 小时前
Java的方法、基本和引用数据类型
java·笔记·黑马程序员
蓝黑20204 小时前
IntelliJ IDEA常用快捷键
java·ide·intellij-idea
Ysjt | 深4 小时前
C++多线程编程入门教程(优质版)
java·开发语言·jvm·c++
shuangrenlong4 小时前
slice介绍slice查看器
java·ubuntu
牧竹子4 小时前
对原jar包解压后修改原class文件后重新打包为jar
java·jar