MyBatis
1. ${} 和 #{} 的区别
特性
#{}
${}
底层实现
PreparedStatement(预编译)
字符串拼接
占位符
? 占位符,参数值安全转义
直接替换变量内容到 SQL 中
SQL 注入风险
无(安全)
有(需谨慎使用)
适用场景
传递参数值(如 where 条件、insert 值)
动态表名、列名、ORDER BY / GROUP BY
示例
SELECT * FROM user WHERE id = #{id}
SELECT * FROM ${tableName}
详细说明
**#{}**:MyBatis 会创建 PreparedStatement,将参数安全地设置到占位符中。例如:
1234SELECT * FROM user WHERE name = #{name}-- 实际执行(假设 name = "Tom")SELECT * FROM us ...
Linux和Shell命令
Linux 基础与 Shell 编程笔记环境变量
PATH 环境变量:用于指定命令搜索路径,值为冒号分隔的目录列表。
配置文件位置:
系统级:/etc/bashrc(或 /etc/bash.bashrc)、/etc/profile、/etc/profile.d/*.sh
用户级:~/.bashrc、~/.bash_profile(或 ~/.profile)
临时生效(仅当前终端):
bash
1export PATH="/usr/local/bin:$PATH"
永久生效:将 export 语句写入上述配置文件后,执行 source ~/.bashrc(或重新登录)。
查看变量值:
bash
1echo $PATH
示例:将自定义路径添加到 PATH(以 zsh 为例)
bash
12echo 'export PATH="/usr/local/scripts:$PATH"' >> ~/.zshrcsource ~/.zshrc
目录操作
命令
说明
ls
列出目录内容(常用选项:-l 详细 ...
集合
继承关系图蓝色实线:类继承类
绿色实线:接口继承接口
绿色虚线:类实现接口
ListArrayList
底层结构:普通数组(Object[])
特点:
随机访问快(通过下标)
增删慢(尤其是中间位置,需移动元素)
扩容机制(JDK 1.8+):
无参构造:初始为空数组,第一次添加元素时,数量不超过10,扩容至 10,超过10,则添加多少扩容至多少
每次扩容为 原容量的 1.5 倍:newCapacity = oldCapacity + (oldCapacity >> 1)
扩容通过 Arrays.copyOf() 复制原数组到新数组
LinkedList
底层结构:双向链表(JDK 1.6 前为循环链表,之后改为非循环)
特点:
插入、删除两端效率高(只需改指针)
随机访问慢(需要遍历查找)
实际开发:绝大多数场景 ArrayList 更优,因为缓存局部性好且内存连续
CopyOnWriteArrayList==适合读多写少的场景==
底层结构:volatile transient Object[] array
核 ...
常用数据结构
树二叉树满二叉树每个节点都有0个或2个子节点
完全二叉树除最后一层外,其他层都是满的 最后一层节点从左到右连续排列
完美二叉树所有叶子节点在同一层,且每个非叶子节点都有两个子节点
二叉搜索树BST对于任意节点:
左子树所有节点值 < 节点值
右子树所有节点值 > 节点值
左右子树也都是二叉搜索树
AVL树平衡因子:左右子树高度差绝对值不超过1,==搜索效率最高==
红黑树
节点是红色或黑色
根节点是黑色
叶子节点(NIL)是黑色
红色节点的子节点都是黑色
从任一节点到其所有叶子节点的路径包含相同数量的黑色节点
==口诀:根页黑,不红红==
非二叉树B树m阶B树性质:
每个节点最多m个子节点
非根节点至少有⌈m/2⌉个子节点
根节点至少有2个子节点(除非是叶子)
所有叶子节点在同一层
节点有k个关键字,则有k+1个子节点
B+树内部节点只存储索引,不存数据
叶子节点存储所有数据,并有指针连接
查询效率更稳定
范围查询效率高
==应用:MySQL的索引结构 ...
Java基础
编码与存储单位
ASCII:一个字符通常占 1 字节(8 位),只能表示英文、数字和少量符号。
UTF-8:变长编码,英文字符占 1 字节,汉字通常占 3 字节(部分生僻字占 4 字节)。
单位换算
1 M = 1024 KB
1 KB = 1024 Byte(字节)
1 Byte = 8 bit(比特)
值传递Java 中只有值传递,没有引用传递。
基本类型:传递的是值的副本,方法内修改不影响原变量。
引用类型(数组、对象):传递的是引用的副本(即对象地址的拷贝)。方法内可以通过引用修改对象的字段,但重新指向新对象不会影响原引用。
1234public void test(Person p) { p.setName("new"); // 会影响原对象 p = new Person(); // 不影响原引用}
Object 类
==:比较两个对象的内存地址是否相同(基本类型比较值)。
equals():默认行为同 ==,通常需要重写以实现内容相等判断(如 String、Intege ...
