mysql with as 递归用法示例
场景:有一张雇员表,需要选择名字为张三的所有手下(注意:张三的直接手下为李四,李四的直接手下为王五,以此类推)
WITH recursive temp as -- with字句如果要做递归则需要添加recursive关键字
(
SELECT id,name from employe where fid = 1 -- 选择雇员中的上司记录
UNION all
SELECT A.id,A.name from employe A,temp B where A.fid = B.id -- 再将with生成的temp表做递归查询
)
SELECT * from temp -- 从递归生成的临时表选择记录
tip:with as 生成的临时表可以被后面的语句多次调用,如果频繁需要在sql字句中创建同样的临时表可以使用此方法进行替换
mysql with as 递归示例二
场景:有一张汽车配件表,如下图。假设每生产一辆汽车要四个车门,一个发动机,两个支架,一百个螺丝。但是生产一个车门需要两个支架,二十个螺丝。以此类推。算出生产一辆汽车需要的配件及个数
WITH recursive temp AS
(
SELECT subpart,number FROM component where part = '汽车'
UNION ALL
SELECT A.subpart,B.number*A.number FROM component A,temp B WHERE A.part = B.subpart -- 注意递归数量的算术表达
)
SELECT subpart,sum(number) FROM temp GROUP BY subpart
运算结果:
mysql with as 递归示例三
场景:算坐车的最优路线,假设有一张客运站排班表,记录起点、终点和价格。相邻车站可以来回发车。计算起点到终点最多几次换乘的坐法。
这里我计算北京到九江最多三次换乘的不同坐法和对应总票价
WITH recursive temp as(
SELECT end destination,start route,1 time,monney totalmoney from bus where start='北京' -- time记录换乘数
UNION ALL
SELECT bus.end,CONCAT_WS(',',temp.route,bus.start),temp.time+1,temp.totalmoney + bus.monney FROM
temp,bus WHERE temp.destination = bus.start
AND bus.end != '北京' AND temp.destination != '九江' and time <= 3 -- 终点不能为北京,起点不能为九江。避免无限递归需要指定最多换乘次数
)
SELECT * FROM temp WHERE destination = '九江' ORDER BY totalmoney
注意需要指定time数量,否则会无限递归
使用nio读取文件
package com.jtzx.test;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class FileNioTest {
public static void main(String[] args) throws Exception {
//创建文件输入流
FileInputStream fileInputStream = new FileInputStream("1.jpg");
//创建文件输出流
FileOutputStream fileOutputStream = new FileOutputStream("2.jpg");
//创建文件的输入通道
FileChannel inChannel = fileInputStream.getChannel();
//输出文件的输出通道
FileChannel outChannel = fileOutputStream.getChannel();
//分配指定大小的缓冲区
ByteBuffer buf = ByteBuffer.allocate(1024);
//从输入通道读取文件
while(inChannel.read(buf) != -1) {
//缓冲区切换为写模式
buf.flip();
//从输出通道写文件
outChannel.write(buf);
//清空缓冲区
buf.clear();
}
}
}
使用nio读取文件
直接缓存区的方式读取
package com.jtzx.test;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileChannel.MapMode;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
public class FileNioTest {
//使用直接缓冲区完成文件的复制
public static void main(String[] args) throws Exception {
//获取文件输入通道(读模式)
FileChannel inChannel = FileChannel.open(Paths.get("/Users/luowei/Desktop/documents/1.jpg"), StandardOpenOption.READ);
//获取文件输出通道(写模式),CREATE代表,不管我文件是否存在都创建
FileChannel outChannel = FileChannel.open(Paths.get("/Users/luowei/Desktop/documents/2.jpg"),StandardOpenOption.READ, StandardOpenOption.CREATE,StandardOpenOption.WRITE);
//内存直接缓冲区
MappedByteBuffer inMapBuf = inChannel.map(MapMode.READ_ONLY, 0, inChannel.size());
MappedByteBuffer outMapBuf = outChannel.map(MapMode.READ_WRITE, 0, inChannel.size());
//直接对缓冲区对数据进行读写
byte[] buff = new byte[inMapBuf.limit()];
inMapBuf.get(buff);
outMapBuf.put(buff);
inChannel.close();
outChannel.close();
}
}
nio读取文件
使用通道直接传输,这种方法最简单。
package com.jtzx.test;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileChannel.MapMode;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
public class FileNioTest {
//通道之间的数据传输
public static void main(String[] args) throws Exception {
//获取文件输入通道(读模式)
FileChannel inChannel = FileChannel.open(Paths.get("/Users/luowei/Desktop/documents/1.jpg"), StandardOpenOption.READ);
//获取文件输出通道(写模式),CREATE代表,不管我文件是否存在都创建
FileChannel outChannel = FileChannel.open(Paths.get("/Users/luowei/Desktop/documents/2.jpg"),StandardOpenOption.READ, StandardOpenOption.CREATE,StandardOpenOption.WRITE);
//输入通道的内容传输到输出通道,这种方式也是使用直接缓冲区的模式
inChannel.transferTo(0, inChannel.size(), outChannel);
//关闭通道
inChannel.close();
outChannel.close();
}
}
nio阻塞模式socket传输数据
客户端:
package com.jtzx.test;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.SocketChannel;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
public class NioSocket {
public static void main(String[] args) throws Exception {
//创建SocketChannel
SocketChannel sChannel = SocketChannel.open(new InetSocketAddress("127.0.0.1", 8880));
//创建缓冲区
ByteBuffer buffer = ByteBuffer.allocate(1024);
//创建文件输入通道
FileChannel inChannel = FileChannel.open(Paths.get("/Users/luowei/Desktop/documents/1.jpg"), StandardOpenOption.READ);
//将文件发送到服务端
while(inChannel.read(buffer) != -1) {
//切换写模式
buffer.flip();
//写入数据
sChannel.write(buffer);
//清空缓冲区
buffer.clear();
}
//关闭通道
inChannel.close();
sChannel.close();
}
}
服务端:
package com.jtzx.test;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
public class NioServerScoket {
public static void main(String[] args) throws Exception {
//创建服务端socket通道
ServerSocketChannel ssChannel = ServerSocketChannel.open();
//绑定端口
ssChannel.bind(new InetSocketAddress(8880));
//接受请求创建socket
SocketChannel sChannel = ssChannel.accept();
//创建文件输出通道
FileChannel outChannel = FileChannel.open(Paths.get("/Users/luowei/Desktop/documents/2.jpg"),StandardOpenOption.READ, StandardOpenOption.CREATE,StandardOpenOption.WRITE);
//创建缓冲区
ByteBuffer buffer = ByteBuffer.allocate(1024);
//读取数据
while (sChannel.read(buffer) != -1) {
//通道切换模式
buffer.flip();
//将数据写入到文件输出通道
outChannel.write(buffer);
//清空缓冲区
buffer.clear();
}
//关闭通道
sChannel.close();
outChannel.close();
ssChannel.close();
}
}
nio非阻塞模式socket传输数据
客户端:
package com.jtzx.test;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.SocketChannel;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.Date;
public class NioSocket {
public static void main(String[] args) throws Exception {
//创建SocketChannel
SocketChannel sChannel = SocketChannel.open(new InetSocketAddress("127.0.0.1", 8880));
//切换为非阻塞模式
sChannel.configureBlocking(false);
//创建缓冲区
ByteBuffer buffer = ByteBuffer.allocate(1024);
//写入数据到缓冲区
buffer.put(new Date().toString().getBytes());
buffer.flip();
//写入数据到通道
sChannel.write(buffer);
buffer.clear();
sChannel.close();
}
}
服务端
package com.jtzx.test;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.Iterator;
public class NioServerScoket {
public static void main(String[] args) throws Exception {
//创建服务端socket通道
ServerSocketChannel ssChannel = ServerSocketChannel.open();
//因为获取客户端连接是阻塞状态,所以切换为非阻塞模式
ssChannel.configureBlocking(false);
//绑定端口
ssChannel.bind(new InetSocketAddress(8880));
//获取选择器
Selector selector = Selector.open();
//将通道注册到选择器上,并且指定监听接受事件
ssChannel.register(selector, SelectionKey.OP_ACCEPT);
//轮询式的获取选择器上已经准备就绪的事件
while(selector.select() > 0) {
//获取当前选择器所有已经注册的选择键(已经就绪的监听事件)
Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
while(iterator.hasNext()) {
//获取准备就绪的事件
SelectionKey sk = iterator.next();
//判断具体是什么事件准备就绪
if(sk.isAcceptable()) {
//如果是接受准备就绪,获取客户端连接
SocketChannel sChannel = ssChannel.accept();
//因为接受数据是阻塞状态,所以切换为非阻塞状态
sChannel.configureBlocking(false);
//将该通道注册到选择器上
sChannel.register(selector, SelectionKey.OP_READ);
}else if(sk.isReadable()) {
//获取当前选择器读就绪的通道
SocketChannel sChannel = (SocketChannel) sk.channel();
//创建缓冲区
ByteBuffer buffer = ByteBuffer.allocate(1024);
//读取数据
int len = 0;
while((len = sChannel.read(buffer)) > 0) {
buffer.flip();
System.out.println(new String(buffer.array(),0,len));
buffer.clear();
}
}
iterator.remove();
}
}
}
}
html tab选项卡的demo
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>tab</title>
<style>
*{
margin: 0px;
padding: 0px;
}
.current{
background: #cccccc;
}
ul{
list-style: none;
}
.nav{
width: 300px;
height: 40px;
background-color: orange;
}
.nav li{
float: left;
text-align: center;
width: 100px;
line-height: 40px;
}
.content div{
width: 300px;
}
.content li{
display: none;
}
.content img{
width: 300px;
}
.content .show{
display: block;
}
</style>
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
</head>
<body>
<ul class="nav">
<li class="current">图片一</li>
<li>图片二</li>
<li>图片三</li>
</ul>
<ul class="content">
<li class="show">
<div><img src="1.jpg"></div>
</li>
<li>
<div><img src="2.jpg"></div>
</li>
<li>
<div><img src="3.jpg"></div>
</li>
</ul>
<script>
$(".nav li").mouseenter(function () {
// 选中的li添加激活属性,siblings()方法找到其余的兄弟元素,再将兄弟元素的current的class移除
$(this).addClass('current').siblings().removeClass('current')
//获取当前选中li的索引
const index = $(this).index()
//因为tab的索引和图片div个数相同,所以根据选中li找到对应的图片div添加show的class移除兄弟元素的show
$('.content li').eq(index).addClass('show').siblings().removeClass('show')
})
</script>
</body>
</html>
jdbc获取字段名称
//将数据库当前选择的表切换为目标表
PreparedStatement ps = con.prepareStatement("SELECT * FROM tb_user where 1 = 0");
ResultSet rs = ps.executeQuery();
//获取列的元信息
ResultSetMetaData metaData = rs.getMetaData();
//获取所有列的总数
for (int i = 1; i <= metaData.getColumnCount(); i++) {
//获取列的名称
System.out.println(metaData.getColumnName(i));
}
利用数据库获取md5加密后的值
//使用SELECT MD5()方法获取,数据更具MD5加密后的值
SELECT MD5('111')
结果: 698d51a19d8a121ce581499d7b701668
spring boot使用thymeleaf更新页面,重新编译页面不刷新
//将thymeleaf缓存关闭重启应用
spring:
thymeleaf:
cache: false
chrome截屏
打开chrome控制台(f12)后,输入,ctrl+shift+p,输入命令:
Capture full size screenshot : 网页长截图
Capture screenshot : 截取网页可视区域
Capture area screenshot : 截取选择部分区域
Capture node screenshot : 截取手机版网页长图
Spring BeanPostProcessor的应用案例
在shiro的ShiroFilterFactoryBean工厂bean中,可以在简化自定义过滤器的注册,就是直接将FIlter注入到容器中。这样工厂bean自动注入。
参考该类文档:https://shiro.apache.org/static/1.5.0/apidocs/org/apache/shiro/spring/web/ShiroFilterFactoryBean.html
实现源码:
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
// 判断该类是否为过滤器
if (bean instanceof Filter) {
log.debug("Found filter chain candidate filter '{}'", beanName);
Filter filter = (Filter)bean;
this.applyGlobalPropertiesIfNecessary(filter);
//如果是过滤器,这将过滤器注册
this.getFilters().put(beanName, filter);
} else {
log.trace("Ignoring non-Filter bean '{}'", beanName);
}
return bean;
}
被引入js获取当前所在路径
var src = document.scripts[document.scripts.length - 1].src;
console.log(src);
js获取元素内敛、嵌入、外部样式中的所有css值
var dt = document.getElementById("dt")
//getComputedStyle返回一个可以获取内敛、嵌入、外部样式中的所有css值
var style = window.getComputedStyle(dt,null)
console.log(style.height)
js函数自执行与settimeout结合实现有条件递归调用
<script>
var flag = false;
(function say() {
flag ? console.log("hello") : setTimeout(say,3000)
flag = true
})()
</script>
eclipse目录结构和编译后项目的结构对比图
eclipse中的WebContent中的内容会存在于编译后的根目录下,而classes目录则存在于WEB-INF下,该目录下还存导入的jar包
使用private关键字使类不能实例化
java.lang包下的System类有这样一句代码
/** Don't let anyone instantiate this class */
private System() {
}
将无参构造方法使用private进行权限控制,则该类无法进行实例化。
springboot项目中maven编译成功,但是ideal build时报找不到依赖的类
这个问题原因是因为IDEA的Build编译操作是其自身自带的环境,与Maven的compile编译是不同的环境
解决方案连接:https://blog.csdn.net/qq_38628046/article/details/107404403
ideal启动springboot项目按钮不可用或者ideal不能识别项目为maven项目
解决方法:右键pom.xml文件,选择” add as maven project”,即可自动导入pom所依赖的jar包
参考连接:https://yuchi.blog.csdn.net/article/details/106811232
ideal上传项目到码云一直登录账号密码正确一直提示登录
登录的时候填入码云项目链接,账号输入框自动填入邮箱账号,输入密码后一直登录失败。搜索后账号不应该是邮箱账号而是码云的用户名。
参考文章:https://blog.csdn.net/CQWNB/article/details/103826648
mysql8.0以上修改root密码
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY'XXXXX';
参考连接:https://blog.csdn.net/yi247630676/article/details/80352655