文章目录
写在前面
本片学习笔记主要补充java的一些基础知识
1、匿名内部类
1.1、匿名内部类的语法糖
jdk1.8以后支持
没使用语法糖
使用语法糖
1.2、通过匿名内部类实现接口
错误写法:
通过匿名内部类实现接口:
2、自己写一个类型转换器(利用反射)
现在用户填入的日期规则只能是yyyy/MM/dd这样的格式,我们想让用户填入yyyy-MM-dd这样的格式也可以
新建一个接口ValueProcessor(接口只定义方法,不负责实现)
新建类TypeConverter,里面封装一个map键值对
在工具类里面判断用户是否注册了转换器,
如果注册了就调用转换器里面的get方法获取map键值对里面的值。
这里valueProcessor能调用process,
是因为TypeConverter.get的返回值是 valueProcessor接口类型,
而接口里面定义了process方法。
valueProcessor.process(value)这里传入的value是用户
(用户)使用日期转换器:
用户先使用TypeConverter类里的注册方法registValueProcessor,传入两个参数,
分别是date的字节码和通过接口实现的匿名内部类,
这个内部类的返回值是Date类型的,用户自定义格式的日期。
执行完ValueProcessor返回一个用户定义的格式的日期,这个日期再被传入registValueProcessor的map中,
2.1、利用反射机制创建数组
2.2、内省操作javabean
用原生的反射代码操作javabean的属性比较麻烦,内省简洁了这些操作
先新建一个javabean
内省操作
获取方法
3、java1.8的接口语法糖default
接口里面可以用default实现方法
4、jdbcUtils封装(增删改)
改之前写的jdbcUtils增删改
dao包修改之前
下面是修改后的代码
修改jdbcUtils,对增删改进行封装
update(增删改都是他)
修改dao包里面的内容
5、jdbcUtils封装(查、加入反射机制)
修改之前的jdbcUtils
修改后的查询
修改后的jdbcUtils
新建一个接口ResultSetHandler
修改jdbcUtils
现在开始修改Dao包
先看看修改前的代码
修改后的Dao
查询一个和所有这样的功能是很常用的,所以我们封装成一个实现类
新建一个类BeanObjectHanlder,专门处理查询一条结果集的
修改dao包
新建一个类BeanListHanlder,专门处理查询所有结果集的
再次修改后的Dao
6、知识点简答
6.1、转发和重定向
转发和重定向的区别
转发:1、服务器跳转(客户端不能感知),浏览器地址不变。2、转发前后的2个资源中所访问的request算同一次请求。
重定向:1、是两次请求(客户端能感知),浏览器地址变动。2、因为是两次请求,所以不能在请求范围内传递参数。
6.2、静态包含和动态包含
静态包含和动态包含的区别
静态包含:
1、先包含后编译(先把代码复制过来,再编译。只有一个字节码),
2、不能给被包含的页面传递参数,
3、不能用变量作为路径。
4、多个静态包含页面不能有相同的变量。
动态包含:
1、先编译后包含(编译后的结果复制过来。多个字节码),
2、可以给被包含页面传递参数,
3、可以用变量作为路径。
4、多个包含页面可以有相同变量。
一般用静态包含比较多,速度快。
6.3、GET和POST
GET:
通过地址栏传递参数,传递数据有大小限制
在REST里面get用于提交查询的请求
POST:
通过表单传参,传递数据无大小限制
在REST里面post用于提交增加的请求
6.4、servlet的生命周期
6.5、请求JSP的原理
7、java中的注解(@XXX)
7.1、java中常用三个注解
7.2、自定义注解(@interface)
自定义注解
使用自定义注解
自定义注解时需要用到两个元注解
第一个元注解@Target:
用于指定新建的注解能用于哪些地方,
例:@Target({ElementType.TYPE, ElementType.PARAMETER})可以用于类、参数上
如果不加@Target,默认可以用于所有地方
第二个元注解@Retention:
控制注解保留在哪里
保留在运行时是最常用的,也只有保留在运行时,通过反射机制才能得到注解信息
7.3、注解属性
注解中只能定义属性,不能定义方法,且属性必须是公共的
如果注解有属性,必须给属性赋值
7.4、反射注解
获取Foo类型的注解
获取方法上的注解
8、mysql事务
(开启事务:开启事务后可以回滚)
开启事务:begain;
插入一条数据
回滚:rollback;
也可以提交
8.1、事务的四大特性
原子性:一系列步骤,那么都执行,要么都不执行。
一致性:在事务执行前后,数据库中的数据在逻辑上保持一致性
隔离性:当多个事务同时操作相同数据时,一个事务对另一个事务的影响,隔离级别有四种。
持久性:一旦事务结束(回滚,提交都结束),就不会影响数据的存储。
8.2、隔离级别
隔离级别要写begin前
1、read uncommitted 未提交读
mysql> set session transaction isolation level read uncommitted;
2、read committed 提交读(也叫不可重复读)
mysql> set session transaction isolation level read committed;
3、repeatable read 可重复读
mysql> set session transaction isolation level repeatable read;
4、serializable 可串行化
mysql> set session transaction isolation level serializable;
示例
不可重复读
A开启事务,B开启事务
A执行语句未提交时,B查询结果是不变
A提交后,B未提交,B查询结果变化。
可重复读
A开启事务,B开启事务
A执行语句未提交时,B查询结果是不变
A提交后,B未提交,B查询结果不变。(查的是快照)
1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。
3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表
每次提交后,都会恢复到默认级别(mysql不同版本的默认级别可能不一样),事务进行中不能更改级别。
简单理解:
第一级:A没提交B没提交,B可以读,
第二级:A提交B没提交,B可以读,
第三级:A提交B没提交,B不可以读,
第四级:AB有一个在改,就查不了
9、jdbc中事务控制
自动提交
手动提交
10、反射+注解,生成创建表的代码
运行结果
11、mysql日期的坑点
日期直接写20200721,这样的不会报错,但是2020-07-21这样的就必须加引号、必须加引号
在java中也一样
12、TreadLocal
实例;创建线程本地变量
13、计算字符个数(面试题)
s.charAt(1);取索引为1的字符。
containsKey() 用于判断Map键中是否包含某个键。
Map.get() 方法返回指定键所映射的值。