Redis安装

6379端口

概念

key-value数据库

5大数据类型

Redis配置文件redis.windows.conf

绑定

1
bind ip地址

端口号

1
port 端口

库大小

1
databases 16

库的索引从0开始

快照

1
save 900 1

save 300 10

1
save 300 10

RDB

内存里面的东西,都写到一个文件里面。

dump.rdb

1
dump.rdb

修改名字

1
dbfilename 文件名

主从机制(哨兵机制)

LIMITS

限制,防止DOS攻击

maxmemory 字节

AOF

启动服务器

1
redis-server.exe redis.windows.conf

启动客户端

参考资料

http://redisdoc.com

看侧边目录树的钱几个

字符串

get

set bb xxxx

setnx bb yyyy

setex cc 10 zzzzz

get cc

get cc

MSET

哈希表

HSET

HSETNX

HGET

列表

LPUSH LPOP 构成栈

RPUSH RPOP 构成队列

队列尾插

LRANGE

列表是可以重复的

集合

集合不能重复

SADD

有序集合

Java如何访问Redis

中孚

事务

同一个库

JDBC事务

Spring AOP切面,管理事务

事务的基本要素(ACID)

原子性
一致性
隔离性
持久性

事务的并发问题

脏读
不可重复读
幻读

image-20210824142711073
mysql的默认隔离级别是可重复读

什么时候锁整张表

image-20210824143137250

Spring事务管理

image-20210824143453437

数据库

  • 视图
  • 触发器
  • 存储过程
  • 自定义函数

常见设置Java Swing LookAndFeel方式

一般使用UIManager.setLookAndFeel()方法来设置外观,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 设置外观
try {
// 跨平台外观
// UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
// 和系统一样的外观
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (UnsupportedLookAndFeelException e) {
e.printStackTrace();
}

经过我的测试,发现这种方式可以设置两种类型的外观。

一种是跨平台的外观,这是默认的外观。如果想使用这种方式,可以不设置。

1
UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());

跨平台的外观如下图所示:

image-20210910092750337

另一种就是和系统一样的外观:

1
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

如下图所示:

image-20210910093214534

这种方式比上面的跨平台外观要好看一些。

如果你想要界面更加美观,可以使用FlatLaf主题。

FlatLaf主题

下载FlatLaf主题

到maven仓库下载:https://mvnrepository.com/artifact/com.formdev/flatlaf/1.5

如何使用

导入jar

Getting started

https://www.formdev.com/flatlaf/
To enable FlatLaf, add following code to your main method before you create any Swing component:

1
2
FlatLightLaf.install();
// create UI here...

or

1
2
3
4
5
6
try {
UIManager.setLookAndFeel( new FlatLightLaf() );
} catch( Exception ex ) {
System.err.println( "Failed to initialize LaF" );
}
// create UI here...

需要注意的是,如果你使用的是第一种方式FlatLightLaf.install();。install方法已经不适用了,应该使用setup()方法.也就是改成:

1
FlatLightLaf.setup();

外观不生效或部分生效的问题

还有就是,如果光写这条语句而已,可能只是部分组件起作用的,有些组件还是原来的外观。还需要给所有的组件都设置上该主题。
这是因为你先创建了组件,然后才使用这条语句来设置外观,造成的。

方案1:先设置外观再创建组件

应该先设置外观,然后再创建组件
FlatLightLaf.setup();写到静态代码块中,并把这个静态代码块定义在类的前面。
因为静态代码块最先加载,从而保证在创建UI组件时,外观已经设置好了,组件将会以我们事先创建好的外观显示。

完美的使用FlatLaf外观方式

如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class MainFrom {
static {
// 先设置外观,再创建UI。
// 为了保证创建UI时,已经实现设置好新外观,
// 最好把设置外观的代码写在静态块中,
// 并且把这个静态块写在类定义的最前面。
FlatLightLaf.setup();
}

private JFrame frame;
private JPanel panel;
private JButton exitButton;
private JTextField textField;
private JTextArea textArea;
private JLabel lable;
private JScrollPane scrollPane;
private JPanel scrollPaneFather;

public MainFrom(JFrame frame) {
// 记下Frame
this.frame = frame;
// 初始化系统托盘
new ToolUiSystemTray(frame);
// 程序刚开始,还没输入内容,不会有输出,隐藏用来显示输出的文本域
// scrollPane.setVisible(false);
scrollPaneFather.setVisible(false);
// 设置退出按钮的功能
exitButtonSetting();
// 窗体功能
frameSetting();
// 文本框功能
textFieldSetting();
// 监听文本域鼠标事件,右键点击文本域,将会清空文本域。
textArea.addMouseListener(new TextAreaMouseListener(frame, textArea));
}
// 省略后续代码
}

美化后的外观如下

image-20210910095538356

这种方式比系统默认的要更加美观一些。

方案2:先创建组件再更改外观 不推荐使用这种方式

https://www.docs4dev.com/docs/zh/java/java8/tutorials/uiswing-lookandfeel-plaf.html
即使程序的 GUI 可见,您也可以使用setLookAndFeel更改 L&F。要使现有组件反映新的 L&F,请对每个顶级容器调用一次SwingUtilities updateComponentTreeUI方法。然后,您可能希望调整每个顶级容器的大小,以反映其包含的组件的新大小。例如:

1
2
3
UIManager.setLookAndFeel(lnfName);
SwingUtilities.updateComponentTreeUI(frame);
frame.pack();

代码示例

我测试有效的方式如下:

在main方法中写上如下代码:

public static void main(String[] args) {
    MainFrom mainFrom = new MainFrom();
    JFrame frame = new JFrame("MainFrom");
    // 设置面板到窗体上
    frame.setContentPane(mainFrom.panel);
    // // 设置关闭按钮功能
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    // frame.setType(Window.Type.NORMAL);
    // frame.setType(Window.Type.POPUP);
    // 不显示任务栏
    frame.setType(Window.Type.UTILITY);
    // 不显示标题栏,最小化,关闭按钮
    frame.setUndecorated(true);
    // 永远置顶
    frame.setAlwaysOnTop(true);
    // 设置初始界面
    mainFromSetting(mainFrom, frame);
    // 设置主题
    // FlatLightLaf.setup();
    FlatDarkLaf.setup();
    // 给所有的组件都使用该主题
    SwingUtilities.updateComponentTreeUI(frame);
    // 最合适的方式显示
    frame.pack();
    // 显示窗体
    frame.setVisible(true);
}

成果示例

使用暗色主题成功效果:
image-20210823220726108

如果你没有写SwingUtilities.updateComponentTreeUI(frame);,虽然你使用的是暗色的主题,但是运行结果不会显示暗色主题,默认使用的是亮色的主题

    public static void main(String[] args) {
        ......
        // 设置主题
        FlatDarkLaf.setup();
        // FlatLightLaf.setup();
        // 给所有的组件都使用该主题
        // SwingUtilities.updateComponentTreeUI(frame);
        // 最合适的方式显示
        frame.pack();
        // 显示窗体
        frame.setVisible(true);
    }

此时显示的效果如下图所示:

image-20210823221038003

为什么不推荐先创建组件再更改外观

先创建组件,然后再更改外观,可能会造成其他的奇奇怪怪的问题。

java.awt.IllegalComponentStateException: component must be showing on the screen to determine its location

这是使用这种方式造成的问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
Exception in thread "AWT-EventQueue-0" java.awt.IllegalComponentStateException: component must be showing on the screen to determine its location
at java.awt.Component.getLocationOnScreen_NoTreeLock(Component.java:2062)
at java.awt.Component.getLocationOnScreen(Component.java:2036)
at javax.swing.JPopupMenu.show(JPopupMenu.java:948)
at javax.swing.plaf.basic.BasicComboPopup.show(BasicComboPopup.java:211)
at javax.swing.plaf.basic.BasicComboBoxUI.setPopupVisible(BasicComboBoxUI.java:877)
at javax.swing.JComboBox.setPopupVisible(JComboBox.java:816)
at blue.commands.ui.event.textfield.TextFieldDocumentListener2.updateList(TextFieldDocumentListener2.java:60)
at blue.commands.ui.event.textfield.TextFieldDocumentListener2.insertUpdate(TextFieldDocumentListener2.java:28)
at javax.swing.text.AbstractDocument.fireInsertUpdate(AbstractDocument.java:201)
at javax.swing.text.AbstractDocument.handleInsertString(AbstractDocument.java:748)
at javax.swing.text.AbstractDocument.insertString(AbstractDocument.java:707)
......

解决方案

使用第一种方案,也就是先设置外观,再创建UI组件,这样就不会有这样的问题。

参考资料

https://www.docs4dev.com/docs/zh/java/java8/tutorials/uiswing-lookandfeel-plaf.html
https://github.com/JFormDesigner/FlatLaf
https://mvnrepository.com/artifact/com.formdev/flatlaf/1.5

问题描述

我的项目中使用了第三方的jar包,在idea中运行正常,但是导出的可执行jar包运行不正常,经过我的查找,发现是因为,导出可执行jar的时候,没有把第三方的jar中内内容解压到可执行jar中。

解决方案

引入第三方jar的时候,不要引入该文件本身,而是引用该第三方jar所在的目录。
这样导出可执行jar的时候,就会解压这些第三方的jar包中的内容到可执行jar中,这样就不会运行出错了。

正确的导入第三方jar方式

也就是引入第三方jar的时候使用如下形式:
image-20210823222915600

错误的导入第三方jar方式

image-20210823223519983

查看导入的jar是否解压到可执行jar中

image-20210823223835983

操作注册表,添加内容

备份注册表

Win+R打开运行,输入如下命令打开注册表:

1
regedit

然后按文件,导出,

image-20210823200124636

导出范围选择全部:

image-20210823200153678

管理员身份打开CMD

输入如下命令,来添加信息:

1
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\SynTP\Parameters\Debug /v DumpKernel /d 00000000 /t REG_DWORD /f

重启电脑

输入上述命令后会提示添加成功,然后此时按Alt+Shift+L依然有问题。要重启后才不会有问题。

操作成功效果

重启电脑之后,按下ALT+Shift+L就可以很方便的提取变量了,也不会有那个烦人的弹窗。

可以打开注册表查看效果:

image-20210823200429194

如果你怕上述命令有问题,也可以在注册表编辑区里面,手动创建上述内容。

参考资料

https://blog.csdn.net/lzxomg/article/details/53230871
https://jitwxs.blog.csdn.net/article/details/78774156
https://blog.csdn.net/yuanlaijike/article/details/78774156
https://demo.tc/post/820
http://www.pipimp3.com/jiaocheng/11925.html

Navicat执行sql命令

Navicat中有两个地方可以输入sql命令,一个是命令列界面,一个是查询功能。命令列界面是不再自动补全(自动提示)功能的。

命令列界面

如何打开命令列界面

image-20210822161219842

这个命令列界面,和再cmd中使用的mysql界面是类似的:

image-20210822161429544

在命令列界面中输入的命令,是没有提示信息的,如上图所示。

打开查询功能

image-20210822160826221

在查询界面中输入的命令有提示信息,并且右侧有提示列表

image-20210822162016734

image-20210822161033909

显示折叠的编辑器列表

一个项目中有许多文件,当你在eclipse中打开多个文件之后,编辑区只会显示几个文件,其他的文件则会折叠起来。
那么如何显示这些被折叠的文件(编辑器)呢?

通过编辑区顶部的展开按钮打开

1

这样要切换到其他文件时,就很不方便,要命的是,如果你打开的是两个项目,这两个项目中有同名文件,此时折叠列表中会显示同名文件,此时你是无法判断这些同名文件到底是那个项目的:

image-20210822101918905

这样的话,你需要把鼠标放到文件上方,eclipse才会提示你该文件属于哪个项目:

image-20210822102310359

这样的话操作就比较慢。

快捷键Ctrl+E打开被折叠的编辑器

可以按下Crtl+E快捷键,快速展开被折叠的编辑器,如果有同名文件,还是需要通过悬停鼠标来查看,这种方式的确定是:悬停显示文件路径时,响应有延迟,需要等待一会。浪费时间。

image-20210822102603228

image-20210822102754828

快捷键Shift+Ctrl+E打开被折叠的编辑器

Ctrl+E快捷键显示的文件列表中没有显示文件的具体地址,如果想显示文件所在的项目可以谁用Shift+Ctrl+E快捷键:

image-20210822103427329

OpenEdtiors插件

插件路径:

eclipse应用市场:https://marketplace.eclipse.org/content/open-editors

项目地址:
https://github.com/dbickley/OpenEditors

如何安装

打开Eclipse Markplace

Help,Eclipse Markplace…

image-20210822103901941

进入Eclipse插件网站 拖动安装

在Install按钮上按下鼠标左键,然后拖动到Eclipse Markplace中,等待加载安装程序,然后即可进入安装界面。

image-20210822104201152

如何使用Open Editor插件

Window,Show View,Other…

image-20210822104459330

然后在Show View对话框的搜索框中,输入关键字open,查找插件,然后选择找到的插件,点击下方的按钮打开插件:

image-20210822104737998

Open Editors插件会显示在侧边栏,在该插件中就可以看到所有已经打开的文件了,上面会显示文件所在的项目,这样切换文件的时候就比较方便:

image-20210822105044287

AOP

Java中如何调用别人的代码

  • 接口回调
  • 动态调用(反射)

JDK动态代理
代理对象,实现了接口

字节码增强技术
代理对象,没有实现接口
创建一个子类,重写父类方法,在调用父类方法,的前面和后面,加入字节的切片。

爬虫

Web接口

就是URL,

WebView

Web网站优化(重要)加分点

异地登录判断
https
登录安全问题,前端发的请求要加密
后端数据库保存的密码要加密

验证码生成

请求登录的时候,后端生成一个随机数,作为验证码,