Skip to content

Commit a6d9c2f

Browse files
committed
Update Java Notes
1 parent b102ea2 commit a6d9c2f

5 files changed

Lines changed: 401 additions & 361 deletions

File tree

DB.md

Lines changed: 74 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -573,7 +573,7 @@ LIMIT:分页限定
573573
SELECT NAME,IFNULL(stock,0)+10 FROM product;
574574
```
575575

576-
* 起别名
576+
* **起别名**
577577

578578
```mysql
579579
SELECT 列名1,列名2,... AS 别名 FROM 表名;
@@ -587,7 +587,16 @@ LIMIT:分页限定
587587
SELECT NAME,IFNULL(stock,0)+10 getsum FROM product;
588588
```
589589

590+
* **CONCAT()**:用于连接两个字段
590591

592+
```sql
593+
SELECT CONCAT(TRIM(col1), '(', TRIM(col2), ')') AS concat_col FROM mytable
594+
-- 许多数据库会使用空格把一个值填充为列宽,连接的结果出现一些不必要的空格,使用TRIM()可以去除首尾空格
595+
```
596+
597+
598+
599+
***
591600

592601

593602

@@ -601,22 +610,22 @@ LIMIT:分页限定
601610

602611
* 条件分类
603612

604-
| 符号 | 功能 |
605-
| ------------------- | -------------------------------------- |
606-
| > | 大于 |
607-
| < | 小于 |
608-
| >= | 大于等于 |
609-
| <= | 小于等于 |
610-
| = | 等于 |
611-
| <>!= | 不等于 |
612-
| BETWEEN ... AND ... | 在某个范围之内(都包含) |
613-
| IN(...) | 多选一 |
614-
| LIKE 占位符 | 模糊查询 _单个任意字符 %多个任意字符 |
615-
| IS NULL | 是NULL |
616-
| IS NOT NULL | 不是NULL |
617-
| AND 或 && | 并且 |
618-
| OR 或 \|\| | 或者 |
619-
| NOT 或 ! | 非,不是 |
613+
| 符号 | 功能 |
614+
| ------------------- | ------------------------------------------------------------ |
615+
| > | 大于 |
616+
| < | 小于 |
617+
| >= | 大于等于 |
618+
| <= | 小于等于 |
619+
| = | 等于 |
620+
| <>!= | 不等于 |
621+
| BETWEEN ... AND ... | 在某个范围之内(都包含) |
622+
| **IN(...)** | 多选一 |
623+
| **LIKE 占位符** | 模糊查询 _单个任意字符 %多个任意字符,[] 匹配集合内的字符<br/>`LIKE '[^AB]%' `:不以 A 和 B 开头的任意文本 |
624+
| IS NULL | 是NULL |
625+
| IS NOT NULL | 不是NULL |
626+
| AND 或 && | 并且 |
627+
| OR 或 \|\| | 或者 |
628+
| NOT 或 ! | 非,不是 |
620629

621630
* 例如:
622631

@@ -659,7 +668,9 @@ LIMIT:分页限定
659668

660669

661670

662-
#### 聚合函数
671+
#### 函数查询
672+
673+
##### 聚合函数
663674

664675
* 聚合函数:将一列数据作为一个整体,进行纵向的计算
665676

@@ -671,13 +682,13 @@ LIMIT:分页限定
671682

672683
* 聚合函数分类
673684

674-
| 函数名 | 功能 |
675-
| ----------- | ------------------------------ |
676-
| count(列名) | 统计数量(一般选用不为null的列) |
677-
| max(列名) | 最大值 |
678-
| min(列名) | 最小值 |
679-
| sum(列名) | 求和 |
680-
| avg(列名) | 平均值 |
685+
| 函数名 | 功能 |
686+
| ----------- | -------------------------------- |
687+
| COUNT(列名) | 统计数量一般选用不为null的列 |
688+
| MAX(列名) | 最大值 |
689+
| MIN(列名) | 最小值 |
690+
| SUM(列名) | 求和 |
691+
| AVG(列名) | 平均值AVG() 会忽略 NULL 行) |
681692

682693
* 例如
683694

@@ -703,6 +714,25 @@ LIMIT:分页限定
703714

704715

705716

717+
##### 文本处理
718+
719+
| 函数名 | 功能 |
720+
| --------- | ------------------ |
721+
| LEFT() | 左边的字符 |
722+
| RIGHT() | 右边的字符 |
723+
| LOWER() | 转换为小写字符 |
724+
| UPPER() | 转换为大写字符 |
725+
| LTRIM() | 去除左边的空格 |
726+
| RTRIM() | 去除右边的空格 |
727+
| LENGTH() | 长度去除右边的空格 |
728+
| SOUNDEX() | 转换为语音值 |
729+
730+
731+
732+
733+
734+
***
735+
706736

707737

708738
#### 排序查询
@@ -737,6 +767,8 @@ LIMIT:分页限定
737767

738768

739769

770+
***
771+
740772

741773

742774
#### 分组查询
@@ -747,6 +779,14 @@ LIMIT:分页限定
747779
SELECT 列名 FROM 表名 [WHERE 条件] GROUP BY 分组列名 [HAVING 分组后条件过滤] [ORDER BY 排序列名 排序方式];
748780
````
749781

782+
WHERE 过滤行,HAVING 过滤分组,行过滤应当先于分组过滤
783+
784+
分组规定:
785+
786+
* GROUP BY 子句出现在 WHERE 子句之后,ORDER BY 子句之前
787+
* NULL 的行会单独分为一组
788+
* 大多数 SQL 实现不支持 GROUP BY 列具有可变长度的数据类型
789+
750790
* 例如
751791

752792
```mysql
@@ -763,7 +803,12 @@ LIMIT:分页限定
763803
SELECT brand,SUM(price) AS getSum FROM product WHERE price > 4000 GROUP BY brand HAVING getSum > 7000 ORDER BY getSum DESC;
764804
```
765805

766-
806+
807+
808+
809+
***
810+
811+
767812

768813
#### 分页查询
769814

@@ -1246,7 +1291,7 @@ SELECT 列名 FROM 表名1,表名2,...;
12461291

12471292
#### 子查询
12481293

1249-
* 子查询概念:查询语句中嵌套了查询语句。我们就将嵌套查询称为子查询
1294+
* 子查询概念:查询语句中嵌套了查询语句**将嵌套查询称为子查询**
12501295

12511296
* 结果是单行单列:可以将查询的结果作为另一条语句的查询条件,使用运算符判断
12521297

@@ -3650,6 +3695,7 @@ public class JDBCDemo01 {
36503695
close(con,stat,null);
36513696
}
36523697
}
3698+
```
36533699
```
36543700

36553701

@@ -3675,7 +3721,7 @@ public class JDBCDemo01 {
36753721
private Integer age;
36763722
private Date birthday;
36773723
........
3678-
```
3724+
```
36793725

36803726
- 数据准备
36813727

Frame.md

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1920,7 +1920,7 @@ Mapper 接口开发需要遵循以下规范:
19201920

19211921
* 动态代理对象如何生成的?
19221922

1923-
通过动态代理开发模式,我们只编写一个接口,不写实现类,我们通过 **getMapper()** 方法最终获取到 org.apache.ibatis.binding.MapperProxy 代理对象,然后执行功能,而这个代理对象正是 MyBatis 使用了 JDK 的动态代理技术,帮助我们生成了代理实现类对象。从而可以进行相关持久化操作
1923+
通过动态代理开发模式,我们只编写一个接口,不写实现类,我们通过 **getMapper()** 方法最终获取到 org.apache.ibatis.binding.MapperProxy 代理对象,然后执行功能,而这个代理对象正是 MyBatis 使用了 JDK 的动态代理技术,帮助我们生成了代理实现类对象。从而可以进行相关持久化操作
19241924

19251925
* 方法是如何执行的?
19261926

@@ -5218,6 +5218,8 @@ public class ClassName {
52185218

52195219
#### Mybatis
52205220

5221+
**原理**:DAO接口不需要去创建实现类,因为MyBatis-Spring提供了一个动态代理的实现**MapperFactoryBean**,这个类可以让你直接注入数据映射器接口到service层 bean 中,底层将会为你创建JDK代理
5222+
52215223
![](https://gitee.com/seazean/images/raw/master/Frame/IoC注解整合MyBatis图解.png)
52225224

52235225
* pom.xml
@@ -5484,36 +5486,35 @@ ApplicationContext:
54845486
**ApplicationContext和BeanFactory对比:**
54855487

54865488
* BeanFactory和ApplicationContext是Spring的两大核心接口,都可以当做Spring的容器
5487-
54885489
* BeanFactory是Spring里面最底层的接口,是IoC的核心,定义了IoC的基本功能,包含了各种Bean的定义、加载、实例化,依赖注入和生命周期管理。ApplicationContext接口作为BeanFactory的子类,除了提供BeanFactory所具有的功能外,还提供了更完整的框架功能:
54895490

5490-
* 继承MessageSource,因此支持国际化
5491+
* 继承MessageSource,因此支持国际化
54915492
* 资源文件访问,如URL和文件(ResourceLoader)。
5492-
* 载入多个(有继承关系)上下文(即同时加载多个配置文件) ,使得每一个上下文都专注于一个特定的层次,比如应用的web层。
5493-
* 提供在监听器中注册bean的事件。
5494-
5493+
* 载入多个(有继承关系)上下文(即同时加载多个配置文件) ,使得每一个上下文都专注于一个特定的层次,比如应用的web层
5494+
* 提供在监听器中注册bean的事件
54955495
* BeanFactory创建的bean采用延迟加载形式,只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化(Spring早期使用该方法获取bean),这样就不能提前发现一些存在的Spring的配置问题;ApplicationContext是在容器启动时,一次性创建了所有的Bean,容器启动时,就可以发现Spring中存在的配置错误,这样有利于检查所依赖属性是否注入
54965496
* ApplicationContext启动后预载入所有的单实例Bean,所以程序启动慢,运行时速度快
54975497
* 两者都支持BeanPostProcessor、BeanFactoryPostProcessor的使用,但两者之间的区别是:BeanFactory需要手动注册,而ApplicationContext则是自动注册
5498-
* BeanFactory通常以编程的方式被创建,ApplicationContext还能以声明的方式创建
5498+
5499+
54995500

55005501
FileSystemXmlApplicationContext:
55015502

5502-
1. 加载文件系统中任意位置的配置文件,而ClassPathXmlApplicationContext只能加载类路径下的配置文件
5503+
* 加载文件系统中任意位置的配置文件,而ClassPathXmlApplicationContext只能加载类路径下的配置文件
55035504

55045505
![](https://gitee.com/seazean/images/raw/master/Frame/ApplicationContext层级结构图.png)
55055506

5506-
* BeanFactory的基本使用
5507+
**BeanFactory的基本使用**:
55075508

5508-
```java
5509-
String FACTORY_BEAN_PREFIX = "&";//获取工厂Bean本身,在Bean的id前加此符号
5510-
```
5511-
5512-
```java
5513-
Resource res = new ClassPathResource("applicationContext.xml");
5514-
BeanFactory bf = new XmlBeanFactory(res);
5515-
UserService userService = (UserService)bf.getBean("userService");
5516-
```
5509+
```java
5510+
String FACTORY_BEAN_PREFIX = "&";//获取工厂Bean本身,在Bean的id前加此符号
5511+
```
5512+
5513+
```java
5514+
Resource res = new ClassPathResource("applicationContext.xml");
5515+
BeanFactory bf = new XmlBeanFactory(res);
5516+
UserService userService = (UserService)bf.getBean("userService");
5517+
```
55175518

55185519

55195520

@@ -8339,10 +8340,10 @@ ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.
83398340
* 获取依赖:根据autowire类型 (Type/Name)提取依赖,存入 PropertyValues,并给bean注册依赖
83408341
* 后置处理:判断是否需要进行 BeanPostProcessor 和 依赖检查
83418342
8342-
* `postProcessProperties`:转入**AutowiredAnnotationBeanPostProcessor**(**注解**)
8343+
* `postProcessProperties`:转入**AutowiredAnnotationBeanPostProcessor注解**)
83438344
83448345
* `findAutowiringMetadata()`:找到需要注入的元数据
8345-
* `InjectionMetadata.InjectedElement.inject()`:注入数据(底层重写了方法
8346+
* `InjectionMetadata.InjectedElement.inject()`:注入数据(重写实现,注入变量或方法
83468347
* `DefaultListableBeanFactory.resolveDependency()`:解决依赖
83478348
* `doResolveDependency().resolveCandidate()`:通过工厂获取Bean对象
83488349
* `registerDependentBeans()`:将Bean注册为Autowired自动装配的Bean

0 commit comments

Comments
 (0)