1.MyBatis Mapper.xml文件中 $和#的区别
例子中假设参数名为 paramName,类型为 VARCHAR 。
①优先使用#{paramName,jdbcType=VARCHAR} 写法,除了可以防止sql注入以外,它还能在参数里含有单引号的时候自动转义,而${paramName}由于是类似于拼接sql的写法,不具备此功能。
②注意,使用 #{paramName,jdbcType=VARCHAR} 写法的时候,模糊查询的写法为:'%'||#{paramName,jdbcType=VARCHAR}||'%'
2.System.out.println(JsonUtils.toJsonPrettyString(dataList));输出日志
3.git使用基本步骤:③git status 查看此时状态
②git add -A 添加文件
③git commit -am "备注" 提交文件到服务器
④git status 查看此时状态
⑤git remote update 更新本地文件
⑥git status 查看此时状态 如果有冲突,在IDEA中右键项目,选择最后git→最后一个Respository→Merge changes
⑦git push origin HEAD:refs/for/分支名 将本地代码提交 例:git push origin HEAD:refs/for/DEV_190626_X_NS
git rebase 自动处理合并 git rebase --abort 停止合并
abort万能的终止命令,例:git merge --abort
仓库:存放代码的地方。分支:一个仓库可以包含很多分支
切换仓库:git remote -vv查看当前仓库地址
git remote remove origin 移除当前仓库
git remote add origin http://xiaolvyun... 添加仓库
切换分支:git branch -a 查看所有分支
git checkout 分支名,例:git checkout DEV_190417_D_HT
4.IDEA 快捷键
①shift+F8 调到下一断点
②alt+F8 显示变量值
③ctrl+H 替换
5.SQL 查看建表语句 show create table 表名
6.session和cookie的区别
①cookie数据存在客户端浏览器上,session数据存放在服务器端
②cookie不是很安全,session相对安全
③session一段时间内会保存在服务器上,当访问增多,会比较占用服务器性能,考虑到减轻服务器性能,应当使用cookie
④单个cookie保存的数据不能超过4K
7.resources文件夹下db.properties设置连接DB信息
8.main-java-resources-_pofile-A、B、C... 各环境信息,DB不同,服务器IP不同
9.缓存击穿:查询数据库不存在的值
10.缓存血崩:指在某一个时间段,缓存集中过期失效
11.基本数据类型不能用==,包装数据类型不能用equals比较
12.mybatis中判断字符串类型是否为0,0不加'',例:<if test="typeCode != 0">
13.字符串连接用StringBuilder.append
14.类成员方法只对继承类公开,使用protected
15.sum(case when t.FQZ_dealType = 'Reject' then 1 else 0 end) as txn_reject
16.ExecutorService是Java提供的用于管理线程池的类。该类的两个作用:控制线程数量和重用线程。
①Executors.newCacheThreadPool()可缓存线程池,先查看池中有没有以前建立的线程,如果有,就直接使用。如果没有,就建一个新的线程加入池中,缓存型池子通常用于执行一些生存期很短的异步型任务。线程池为无限大,当执行当前任务时上一个任务已经完成,会复用执行上一个任务的线程,而不用每次新建线程。
②Executors.newFixedThreadPool(int n)创建一个可重用固定个数的线程池,以共享的无界队列方式来运行这些线程。
③Executors.newScheduledThreadPool(int n):创建一个定长线程池,支持定时及周期性任务执行
例:ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
//延迟1秒后每3秒执行一次
scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
public void run() {
System.out.println("延迟1秒后每3秒执行一次");
}
}, 1, 3, TimeUnit.SECONDS);
④Executors.newSingleThreadExecutor():创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行
17.缓冲队列BlockingQueue和自定义线程池ThreadPoolExecutor‘
常见的构造函数:ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime,TimeUnit unit, BlockingQueue<Runnable> workQueue)
例: // 创建数组型缓冲等待队列
BlockingQueue<Runnable> bq = new ArrayBlockingQueue<Runnable>(10);
// ThreadPoolExecutor:创建自定义线程池,池中保存的线程数为3,允许最大的线程数为6,如果该线程50秒没用将被收回
ThreadPoolExecutor tpe = new ThreadPoolExecutor(3, 6, 50, TimeUnit.MILLISECONDS, bq);
18.转发forward:请求地址看不到转变,不能跨域,重定向redirect:请求地址发生改变,可以跨域
解释:
转发:为找前台办事,前台办不了,把资料发给别人,我的事办完了,可以访问WEB-INF中的资源
重定向:前台办不了,前台又让找别人办,最后找别人办完了,不可以访问WEB-INF中的资源
如果转到外网:redirect:https://www.baidu.com/
如果转到jsp文件:forward:error 不加.jsp后缀
19. properties配置文件定义变量,建立对应的model文件,引用@Value
例:
配置文件:
smartbiURL=http://10.0.38.208:8080/smartbi
smartbi.username=admin
smartbi.password=manager
requestURL=http://10.0.38.208:8080/smartbi/vision/openresource.jsp?resid={resId}\&user={userName}&password{pwd}&showtoolbar=false&hiddenParamPanel=false&hidetoolbaritems=REFRESH MYFAVORITE PRINT
model文件:
package com.aibank.bigdata.portal.conf;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
@Configuration
@PropertySource(value = {"classpath:smartBIProxy.properties"})
@Data
public class SmartBIProperties {
@Value("${smartbiURL}")
private String smartbiURL;
@Value("${smartbi.username}")
private String username;
@Value("${smartbi.password}")
private String pwd;
@Value("${requestURL}")
private String requestURL;
}
在controller中:
@Autowired
private SmartBIProperties smartBIProperties;
smartBIProperties.getUsername()
如果有参数需传入,用替换方法:
String url = smartBIProperties.getRequestURL();
url = StringUtils.replace(url,"{resId}",resId);
url = StringUtils.replace(url,"{userName}",request.getSession().getAttribute("LOGINNAME").toString());
url = StringUtils.replace(url,"{pwd}",result.toString());
20.单例:全局状态不可变。多例:会更改状态。
21.ThreadLocal:用于保存某个线程共享变量(变量隔离),可能会导致内存泄漏。一个线程只能放入一个ThreadLocal变量。
内存泄漏:由程序申请的一块内存,且没有任何一个指针指向它,那么这块内存就泄露了。
22.Restful是一种原则,规范。符合就叫RestfulURL
23.线程池的好处:减少在创建和销毁线程上所消耗的时间以及系统资源的开销,解决资源不足的问题。
24.springboot:约定大于配置 starter: 帮我们引入开发相关jar包
25.Jedis是Redis官方首选的Java客户端开发包
26.yarn是作业调度和集群资源管理的一个框架
27.rpop和brpop,都是获取列表最后一位的值,但是brpop如果获取的空列表会阻塞线程。
例:brpop list1 list2 list3
就如list1位空的话,list2和list3为非空。
brpop 会返回 list2尾部的一个值。
否则,如何三个都一直为空的话,会一直阻塞。直到有lpush和rpush的操作。
如果设定了timeout的话,在timeout结束的时候,会解除阻塞。
28.对list添加元素:
lpush:从左往右添加元素,在key 对应 list的头部添加字符串元素
rpush:从右到左添加元素,在key 对应 list 的尾部添加字符串元素
29.LPUSH log newest_log
LTRIM log 0 99
模拟了一个日志程序,每次将最新日志 newest_log 放到 log 列表中,并且只保留最新的 100 项。
30.集群与分布式:
分布式:一个业务拆分为多个子业务,部署在多个服务器上
集群:同一业务,部署在多个服务器上
例:123分成1,2,3部署到不同地方,叫分布式;1部署到3台不同机器上,叫集群。
31.Redis是单节点操作,Redis cluster是分布式。
key→根据哈希函数映射到槽(一个节点对应多个分槽)→根据槽和映射表找到槽所对应的节点(槽不存储数据,节点存储数据)→从节点中获取key所对应的value值
master为主节点:集群模式下,首次启动的节点和被分配槽的节点都是主节点
slave节点为从节点:从节点负责复制主节点槽的信息和相关数据
Redis cluster相当于楼,节点相当于房间,槽相当于房间里的桶,key,value存在节点中
32.缓存分析过程:
非关系型(NoSQL)数据库redis,通过自带的jedis或者spring封装好的Redis cluster去连接redis,调用其get,set方法
33.注册中心与代理:
注册中心:将所有服务器信息存储在注册中心,客户端去注册中心查询哪台服务器可以满足其需求的具体信息
代理:类似于明星的经纪人。找不到需要用的服务器,需要代理去联系
34.数据入库过程:有一个大库存放获取的所有数据,每存入一条数据,blog将会多条记录,根据blog记录,通过流的方式获取并处理存放到kafka文件中,订阅卡夫卡(卡夫卡:分布式发布订阅消息系统)消息,获取数据存放到kudu数据库