1.如何灵活定义函数参数数量
List<String> properties;
public PageSet(int page, int size, int direction, String... properties){
this.page = page;
this.size = size;
this.direction = direction;
this.properties = null == properties ? new ArrayList<String>() : Arrays.asList(properties);
}
String... properties
this.properties = null == properties ? new ArrayList<String>() : Arrays.asList(properties);
2.thymleaf 标签属性引用model变量
例如 th:include :模版路径要加入变量,则用 ' 分隔其该属性他的内容
model.addAttribute("modelName", modelName);
th:include="'model/'+${modelName}+'/contents' :: contentList"
3.sql脚本创建表时用变量名代替表名
SET @tb='表名';
SET @sql = CONCAT('SELECT * FROM ', @tb);
PREPARE st FROM @sql;
EXECUTE st;
DEALLOCATE PREPARE st;
4. nio
http://ifeve.com/selectors/
5.树形结构节点的基本判断
(1)id 不能等于 parentid
(2)根的Parentid不能是其某个子节点的id(只能是一个固定的默认id)
6.centos 开放端口
vim /etc/sysconfig/iptables
-A INPUT -p tcp -m state --state NEW -m tcp --dport 9002 -j ACCEPT
service iptables restart
7.spring 获取服务的ip地址和端口号
public IBaseResult insertExternalFile(MultipartFile[] files,HttpServletRequest requset) {
String ip = requset.getRemoteAddr();
int port = requset.getServerPort();
8.
1.创建一个tomcat
docker run -d -p 9001:8080 --restart=always -v /usr/local/dev/dockerTomcatFile/webapps/merchant:/usr/local/tomcat/webapps -v /etc/localtime:/etc/localtime:ro --name=merchant docker.io/tomcat:latest
2.创建一个mysql
docker run --name mysqlContainerTest --restart=always -e MYSQL_ROOT_PASSWORD=12345 -e TZ="Asia/Shanghai" -p 3310:3306 docker.io/mysql:5.7
3,创建一个redis
docker run --name redisTest -p 6379:6379 -v $PWD/usr/local/dev/webapp/rabbitmqData:/data -d redis:3.2 redis-server --appendonly yes
-p 6379:6379 : 将容器的6379端口映射到主机的6379端口
-v $PWD/usr/local/dev/webapp/rabbitmqData:/data : 将主机中当前目录下的/usr/local/dev/webapp/rabbitmqData挂载到容器的/data
redis-server --appendonly yes : 在容器执行redis-server启动命令,并打开redis持久化配置
进入redis
docker exec -it 26049fa0a9e9 redis-cli
9 mybatis collection list<String>注入
- <resultMap id="peopleResultMap" type="People">
- <id property="id" column="id" />
- <result property="name" column="name" />
- <collection property="qqs" ofType="string" javaType="list">
- <result column="qq" />
- </collection>
- </resultMap>
10,获取接口所在进程的 httpservletrequest对象
HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
11.mysql 手动指定排序顺序 举例
select *
from merchant_image_pool t
#where id in (121,122,123,124,125)
order by field(id,121,123,122,187)
12 List操作
Java中List集合去除重复数据的方法
1. 循环list中的所有元素然后删除重复
public static List removeDuplicate(List list) {
for ( int i = 0 ; i < list.size() - 1 ; i ++ ) {
for ( int j = list.size() - 1 ; j > i; j -- ) {
if (list.get(j).equals(list.get(i))) {
list.remove(j);
}
}
}
return list;
}
2. 通过HashSet踢除重复元素
public static List removeDuplicate(List list) {
HashSet h = new HashSet(list);
list.clear();
list.addAll(h);
return list;
}
3. 删除ArrayList中重复元素,保持顺序
// 删除ArrayList中重复元素,保持顺序
public static void removeDuplicateWithOrder(List list) {
Set set = new HashSet();
List newList = new ArrayList();
for (Iterator iter = list.iterator(); iter.hasNext();) {
Object element = iter.next();
if (set.add(element))
newList.add(element);
}
list.clear();
list.addAll(newList);
System.out.println( " remove duplicate " + list);
}
4.把list里的对象遍历一遍,用list.contain(),如果不存在就放入到另外一个list集合中
public static List removeDuplicate(List list){
List listTemp = new ArrayList();
for(int i=0;i<list.size();i++){
if(!listTemp.contains(list.get(i))){
listTemp.add(list.get(i));
}
}
return listTemp;
}
13.spring 统一拦截异常
https://www.cnblogs.com/magicalSam/p/7198420.html
1.4 两个注解
@ExceptionHandler
https://blog.csdn.net/kinginblue/article/details/70186586
@responseBody
https://www.cnblogs.com/qiankun-site/p/5774325.html
1.5 spring boot 设置失误回滚
// @Bean
// public DataSourceTransactionManager makeDataSourceTransactionManager(DruidDataSource dataSource) {
// DataSourceTransactionManager manager = new DataSourceTransactionManager();
// manager.setDataSource(dataSource);
// return manager;
// }
https://blog.csdn.net/Jamie_Jiang/article/details/78227422?locationNum=5&fps=1
https://blog.csdn.net/sylrain/article/details/49887633
https://blog.csdn.net/lgd200008/article/details/79056645
https://blog.csdn.net/github_25679381/article/details/54176950
1.6 mysql 获取毫秒微秒
--毫秒
SELECT REPLACE(UNIX_TIMESTAMP(CURRENT_TIMESTAMP(3)), '.', '');
--微秒
SELECT REPLACE(UNIX_TIMESTAMP(CURRENT_TIMESTAMP(3)), '.', '');
1.7 mybatis 条件判断
<if test="findStat != null">
<choose>
<when test="findStat == 1">
and t1.end_date >= now() and t1.was_online = 1
</when>
<when test="findStat == 2">
and t1.was_online = 0
</when>
<when test="findStat == 3">
and now() > t1.end_date
</when>
</choose>
</if>
1.8 maven单独引入jar包
<dependency>
<groupId>jna</groupId>
<artifactId>jna</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${basedir}/lib/jna.jar</systemPath> <!--项目根目录下的lib文件夹下-->
</dependency>
<dependency>
<groupId>jna</groupId>
<artifactId>jna_platform_4.1.0</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${basedir}/lib/jna-platform-4.1.0.jar</systemPath> <!--项目根目录下的lib文件夹下-->
</dependency>
注意:groupId可以重复,但是不能artifactId同时重复,否则会被识别为同一个jar包而只引用第一个。
遍历ConcurrentHashMap非阻塞
//方法三:使用Iterator遍历,使用并发集合不会报异常,性能类似于方法二
//使用泛型
Iterator<Map.Entry<String, String>> entries = map.entrySet().iterator();
System.out.println("使用Iterator遍历,并且使用泛型:");
while (entries.hasNext()) {
Map.Entry<String, String> entry = entries.next();
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
//注意这里操作了集合,下面的的遍历不会再打印0
if("0".equals(entry.getKey())) {
map.remove(entry.getKey());
}
}
遍历list 线程安全
https://blog.csdn.net/Somhu/article/details/78874634
https://blog.csdn.net/asdfsadfasdfsa/article/details/73294142
https://www.cnblogs.com/wl0000-03/p/5973039.html
https://www.cnblogs.com/wucao/p/5350461.html
map 线程安全
https://blog.csdn.net/cnhk1225/article/details/52413201
给互斥资源加锁
boolean msgCircleCheckLock = false;
ArrayList<ConfirmMessage> messageQueue = new ArrayList<ConfirmMessage>();
try {
if(this.msgCircleCheckLock){
this.wait();
}
msgCircleCheckLock = true;
for(Object obj : messageQueue){
ConfirmMessage confirm = (ConfirmMessage)obj;
if(null != confirm){
confirm.resend();
}
}
} catch (Exception e) {
logger.error(e.getMessage(),e);
}
finally {
msgCircleCheckLock = false;
this.notify();
}
Eureka的自我保护模式
如果在Eureka Server的首页看到以下这段提示,则说明Eureka已经进入了保护模式。
1 | EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE. |
保护模式主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护。一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。
一些参考
https://blog.csdn.net/tianyaleixiaowu/article/details/78184793
阿里云申请免费SSL证书,并配置到Tomcat,实现https访问
https://blog.csdn.net/binglong_world/article/details/80728230
maven打包时引入别的文件夹里的配置文件
<resources>
<resource>
<directory>src/main/resource</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
</resources>