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

这篇具有很好参考价值的文章主要介绍了开发过程中遇到的问题以及解决方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

巩固基础,砥砺前行 。
只有不断重复,才能做到超越自己。
能坚持把简单的事情做到极致,也是不容易的。

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

简单易用的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仓库

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

<?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两种工具对比

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

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 -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

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

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,spring
开发过程中遇到的问题以及解决方法,java,spring
开发过程中遇到的问题以及解决方法,java,spring

项目的数据返回格式

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 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参数

开发过程中遇到的问题以及解决方法,java,spring
开发过程中遇到的问题以及解决方法,java,spring
开发过程中遇到的问题以及解决方法,java,spring
[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 批量插入

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

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_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简介

<!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,spring

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方法 为啥不能 传对象类型

开发过程中遇到的问题以及解决方法,java,spring
因为这里是一个可变参数。

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 注入攻击
	<dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>mybatis-plus-boot-starter</artifactId>
			<version>3.0.5</version>
		</dependency>
testCase
//查询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修饰,则在使用的时候,需要 类名.属性名

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

【临渊羡鱼不如退而结网】
欢迎大家指点文章来源地址https://www.toymoban.com/news/detail-643836.html

到了这里,关于开发过程中遇到的问题以及解决方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 设计师需要掌握的网站设计相关知识、技巧、工具以及在建站过程中遇到的常见问题和解决方案

    作者:禅与计算机程序设计艺术 “一个设计师的手册:关于网站设计的一切你需要知道”,本文全面系统地介绍了设计师需要掌握的网站设计相关知识、技巧、工具以及在建站过程中遇到的常见问题和解决方案,从基础知识到常用效果、细节调整、模板制作、SEO优化,都有详

    2024年02月06日
    浏览(55)
  • 关于微信小程序原生组件与uniApp混合开发过程遇到的问题与解决方式

    前言: 在实际开发过程中,尤其是小程序的开发,我们常常会遇到一些在文档中解决不了的问题,在这里,我就浅谈一下我遇到的一些问题 1.小程序的构建框架是uni-app,却突然被要求用原生的微信小程序代码来开发,到最后要整合到uni-app里面 这个整合问题,uni-app官网就有

    2024年02月05日
    浏览(75)
  • 使用再生龙镜像备份还原linux,以及遇到的问题和解决方法

    准备工作: rufus镜像刻录软件 再生龙镜像 20G以上的u盘(系统备份文件的大小与系统盘的大小有关。200G的固态备份之后要占用10G左右空间) rufus: 链接:https://pan.baidu.com/s/133wksMYJ8NHaWpXRPKEr_w 提取码:kgrd –来自百度网盘超级会员V2的分享 再生龙镜像文件: 链接:https://pan.bai

    2024年02月03日
    浏览(80)
  • 在matlab中使用PTB时遇到的问题以及解决方法(随时更新)

    目录 问题1:错误使用 Screen methods: 问题2:图片太大,PTB函数无法呈现 methods: See error message printed above. 出错 PsychImaging (line 2470)             [win, winRect] = Screen(\\\'OpenWindow\\\', screenid, clearcolor, winRect, pixelSize,             numbuffers, stereomode, multiSample, imagingMode, specialFlags, clientRec

    2024年02月06日
    浏览(48)
  • 下载安装anaconda和pytorch的详细方法,以及遇到的问题和解决办法

    首先需要下载Anaconda,可以到官网Anaconda官网或者这里提供一个镜像网站去下载anaconda镜像网站 安装步骤可参考该文章:Anaconda安装步骤,本篇不再赘述 注意环境变量的配置,安装好Anaconda之后一定要在环境变量中添加以下内容: 安装好Anaconda后,按下Windows按钮,找到 Anacond

    2024年03月26日
    浏览(50)
  • Jenkins在Linux环境下的安装与配置,包含遇到的问题以及解决方法

    Jenkins是一个开源软件项目,是基于Java开发的一种持续集成(CI)工具,用于解决持续重复的部署、监控工作;它一个开放易用的软件平台,大大简化软件的持续集成。 目前持续集成(CI)已成为许多软件开发团队的常见做法。它是一种实践,旨在缓和和稳固软件的构建过程,并

    2024年02月02日
    浏览(53)
  • Ubuntu20.04安装sql server(内含多个可能遇到的问题以及解决方法)

    这学期的课程有数据库,因此今天(2022.3.6)在ubuntu上安装了sql server2019 即使根据官方指引进行安装也会遇到不少问题,因此为在这里总结了我自己遇到的所有问题,以及给出了相应的解决方案,希望能为后来的人解决一些困惑和麻烦 根据指引,在终端输入第一条语句:(导入

    2024年02月05日
    浏览(63)
  • 使用Swift开发Framework遇到的问题及解决方法

    Cannot load module \\\'xxx\\\' built with SDK \\\'ihphoneos16.4\\\' when using SDK \\\'iphoneos17.0\\\':XXX/xxx.framework/Modules/xxx.swiftmodule/arm64-apple-ios.swiftmodule 在build setting中将BUILD_LIBRARY_FOR_DISTRIBUTION设置为Yes

    2024年02月07日
    浏览(45)
  • STM32使用DMA传输UART空闲中断中接收的数据遇到的问题以及解决方法

    STM32使用DMA传输UART空闲中断中接收的数据遇到的问题以及解决方法 CubeMX配置 串口配置:使用默认配置(传输数据长度为8 Bit,奇偶检验无,停止位为1 Bit, 接收和发送都使能),因为我的是LIN项目所以使用的时串口的LIN模式,一般就是异步通信 打开DMA传输 打开串口接收中断

    2024年02月05日
    浏览(41)
  • 步进电机驱动器开发中遇到的问题和解决方法

    在开发步进电机驱动器的时候经常遇到以下问题 电机在高速启动或停止时候 烧坏驱动芯片 如何解决? 步进电机在低速时候抖动,如何解决? 步进电机长时间运行 发热严重 如何解决? 步进电机驱动芯片很容易烧坏如何解决? 如何降低步进电机驱动芯片的发热量? 如何在开

    2024年02月07日
    浏览(41)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包