这篇文章可能不是常规的笔记风格,而更偏向于随记,我会将听课过程中觉得是我不了解的或者是很有意思的点记录下来,启发思维
本文很多地方都指出某一款开源项目体现出了标准化的优点,那么在我的认知中,标准化究竟包括哪些方面?
- 结构标准化:某一个项目或者说某一个插件除实现自身设计目的外,应该确保Java程序设计核心思路:代码体现框架思路,配置文件完成实现,也就是:(1)代码仅完成思路的框架搭建,不涉及硬编码;(2)各类实例化所需信息都由配置文件完成
除标准化外,本文还提出了一个切合框架编程的,体现某开源项目优势的另一角度——简洁化,这里也需要说明我所认为的简洁化包括哪些方面?
- 调用简洁化:某一个项目被调用时,应存在一个高维度的接口,封装了本项目的功能,从而让调用者在完成框架设计时,只需要知道一个通用形的入口,而具体实例化谁则完全由配置文件决定
- 功能简洁化:某一个项目之所以被实现,其目的就是对某一类繁琐的功能需求进行包装和简化,功能简洁化存在于每一个有意义的项目中
反射机制我想讲的不多,主要是理清反射的优势所在,我们在写代码的时候,不是非要全都选择反射来实现,只有在所提到的需求产生时,反射才会更加有效:
需求1:当项目需要在不改变外部jar包源码的前提下,调用其中的private方法或是修改private变量
在需求1下,我们可以使用反射机制的setAccessible方法来将private对象处理为可访问对象
需求2:当项目需要在不指定类名和方法名的前提下,完成程序框架的搭建
需求2也是反射的核心作用——搭建框架。反射通过名称完成调用,而名称是可以通过String对象赋值和修改的,这就保证了反射机制的灵活性(C++留下了羡慕的泪水),可以说,这个功能是Java最具吸引力的功能之一,它意味着可以用几段简短的的框架代码+配置文件完成一个复杂的项目实现。
2. JDBC 2.1 ConnectionConnection接口除了完成连接数据库的工作外,还有一个很有意义的职能:控制事务处理。Mysql的事务处理分为三类:开启事务、提交事务、回滚事务。对应的Connection中也有相关方法实现:
//开启事务: setAutoCommit(boolean autoCommit) //将此连接的自动提交模式设置为给定状态。 true为自动提交;false为手动提交 //提交事务: commit() //使自上次提交/回滚以来所做的所有更改成为永久更改,并释放此Connection对象当前持有的所有数据库锁。 //回滚事务: rollback() //撤消当前事务中所做的所有更改,并释放此 Connection对象当前持有的所有数据库锁。
之所以专门提出这个职能,是因为它的回滚机制可以保证数据复写的安全性,再结合Java的异常处理,可以保证只有在需求数据均处理成功,才对数据库做永久修改,否则取消修改,回滚,样例代码如下:
try(){
//1. 注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接对象,设置开启事务
conn = DriverManager.getConnection("jdbc:mysql:///db3", "root", "root");
conn.setAutoCommit(false);
//3.定义sql
String sql = "update account set balance = 1500 where id = 3";
//4.获取执行sql对象
stmt = conn.createStatement();
//5.提交事务
conn.commit();
}catch(Exception throwables){
//回滚事务
conn.rollback();
throwables.printStackTrace();
}
2.2 SQL注入与解决
SQL注入问题是一个很有意思的“攻击手段”,它启示了我们:
如果单纯使用字符串拼接来组建操作者的输入和我们想要设置的句柄,很可能让操作者通过一些特殊输入来达到篡改句柄的目的。这不只是数据库存在的问题,也可能出现在任何有特殊String字段的项目里。
此外,PreparedStatement解决问题的方式也带给我们新的启示,启示1:
想要解决SQL注入这一类字符串拼接问题,重要的就是去识别可能产生影响的特殊String字段,并把它们标识为转义字符,这样就保证了拼接进来的输入的纯粹性,即纯粹是一段String字符串,而不会和我们设置的句柄产生互动
启示2:
3. MavenPreparedStatement所提出的预编译思路,是一种通用的性能提升思路,它不仅适用于MySql,也可以用于任何需要提前准备解析与加载资源的情况,预编译意味着只要操作者对资源的需求没有变化,而只是输入参数发生改变,我们就不需要重复进行解析与加载资源的操作
Maven的设计思路是特别有参考意义的,它具有标准化和简洁化两个极具吸引力的特征
标准化:
Maven的标准化体现在标准化项目结构与标准化项目生命周期两个方面,这使得一个Maven项目可以跨IDE运行,这也是Java的核心思想:一套代码,任何情况,任意运行
标准化的项目结构,既包括其设立的标准化文件结构,也包括其对Jar包的导入标准化(标准化的字段:GroupID, ArtifactId, Version)
简洁化:
4. MyBatisMaven的简洁化则体现在两个方面:一是通过仓库的设计,将Jar包的管理简洁化,设计者不需要去考虑Jar包的管理,只需要配置仓库,然后按规定调用;二是通过pom.xml配置文件,将Jar包的导入简洁化,设计者只需要标准化的几个字段,然后刷新配置文件,就可以实现Jar包的自动导入
MyBatis的设计思路仍然体现出了标准化和简洁化的思路
标准化:
连接数据库与Sql语句硬编码被抽取到配置文件中实现,实际代码只需要定义Mapper接口,调用方法就可以完成不同的数据库操作(体现对结构的标准化)
简洁化:
1)操作数据库被封装为由设计者自己决定的一个Mapper映射接口,通过一行调用代码完成实现,大大简化了JDBC操作流程
2)读取表的一列,将一列值统一赋值给一个自定义的类,这一原本繁琐的返回值工作也由MyBatis自动实现,简化了返回流程



