java 知识点 10(匿名内部类、反射、自写类型转换器、jdbcUtils封装、注解、事务)

写在前面

本片学习笔记主要补充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() 方法返回指定键所映射的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值