Java基础知识回顾
前言
很久没写博客了,最近在学习网易的高级java工程师的课程,在这儿重新梳理下自己的知识体系。如有纰漏欢迎指正。
Java语言重要特性
Java一种面向对象的高级语言。和其他高级语言一样都有重要的特性,继承、重写/重载、多态是Java重要,也是基本的特性。无论Java怎么发展,这是Java语言的基石。
-
继承extends/implements
继承我们肉眼可见的作用是:可消除重复代码(抽象类的使用),继承我们记住四个特点就行:
1.子类拥有父类非private属性和方法;
2.子类可以扩展父类,即拥有自己的属性和方法;
3.子类可以重写父类的方法;
4.final修饰类和方法时,可以让子类不能继承或重写父类方法; -
重写/重载
1.重写:子类对允许访问的方法重新实现自己的行为,返回值和参数列表不能变
2.重载:在同一类中,允许方法名相同,但是参数列表不同(必须),返回值可以不同,注意返回值不同不能认为是重载的条件。 -
多态
多态具体表现是:重写的方法可以在运行时被调用,不管编译的时候源代码中引用变量(有继承关系)是什么类型。
多态必要条件是:
1.继承或实现接口
2.重写/重载
3.父类(接口)指向子类(实现类)引用
JDK
JDK内容特别多,阅读JDK源码是我们了解知识的重要途径。
最近详细看了java.sql包(JDBC),java.lang.reflect包(反射)、java.lang.annotation包(注解)的内容总结如下:
-
JDBC
JDBC是负责java程序与不同数据库的连接并执行数据操作的API。
1.API使用流程:装载数据库驱动程序、建立数据库连接、创建sql执行语句、执行语句
代码如下:
public class JdbcTest {
static String DBURL = "jdbc:mysql://127.0.0.1:3306/study?characterEncoding=gbk&serverTimezone=Asia/Shanghai";
static String USERNAME = "root";
static String PASSWORD = "";
public static void main(String[] args) {
//1.加载驱动
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
//2.获取数据库连接
Connection connection = DriverManager.getConnection(DBURL, USERNAME, PASSWORD);
connection.setAutoCommit(false);
//3.创建SQL执行语句
String sql = "select * from user";
Statement statement = connection.createStatement();
//4.执行语句
ResultSet resultSet = statement.executeQuery(sql);
while(resultSet.next()){
System.out.println(resultSet.getString(2));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
2.进阶使用
读取数据库数据乱码:数据库字符集和jdbc设置的字符集需要一致;
游标的使用:查询大量数据时,支持分批读取,dburl中设置:useCursorFetch=true;
流式读取:读取一条记录中大字段时,可以读取二进制流,rs.getBinaryStream();
批量处理:插入大量数据时,分批提交,autoCommit关闭,statement.addBatch()/excuteBatch()/clearBatch();
-
反射API
JDK提供了API获取类元信息,可以在运行期获取类信息。
元信息包括:类名、全限定名、属性Field、方法Method、获取注解等
我们还可以执行以下操作:
创建对象:clz.newInstance()
调用方法:method.invoke() -
注解
类或接口、方法、属性等标签;常常作为封装框架的辅助工具
元注解:@Target(标记注解位置),@Retention(生命周期)等;反射+注解+动态代理是实现spring aop的基础
数据库事务
数据库事务作为我们基础知识,常常在面试中遇到。
通俗的说数据库事务就是:包含一系列的数据库操作查询–读,增改删除–写,构成一个逻辑上的整体,这一列操作要么全部成功,要么全部失败,没有中间状态。使用事务的目的是保证系统或者业务结果的一致性,这是根本。我们都知道ACID:
原子性:一系列操作要么全部成功,要么全部失败,没有中间状态;
一致性:具体应用的约束条件决定,转账场景认为两个账户的总金额在转账前后保持不变就可以满足一致性要求
隔离性:多个事务相互影响的程度和保证并发事务的执行
持久性:执行前需要对操作进行记录,保障及时在故障情况下可以恢复数据。
我们都知道事务有四个特征ACID。实际我个人理解应该是
AIDC更符合实际意义。C一致性是我们使用事务的最终目的:A、I、D这些是保证一致性必要手段。一致性概念理解上我们类比隔离性:我们知道不同的应用层对隔离性(四个级别)要求不一样,一致性作为我们事务的目标,也有不同级别:如强一致性(任何时刻保证一致)、最终一致性(消息中间件常常提到这个概念)等,这是个相对的概念。
隔离等级是不同业务或系统对并发事务处理要求,解决脏读、重复读、幻读的问题:
1.读未提交read uncommit
2.读提交read commit
3.重复读repeatable commit
4.串行化serializable
ACID特征和隔离等级实现不同数据库实现有所差异,基本上是通过:
undo log数据库日志、读写锁、版本控制(MVCC)机制实现。具体下次专门文章再讨论。
另外说到事务,我们就会提到传播行为,这里纠正下,传播行为不是数据库本身的特性,其中mysql官方文档表明:数据库不能嵌套,会隐式提交的处理。
Transactions cannot be nested. This is a consequence of the implicit commit performed for any current transaction when you issue a START TRANSACTION statement or one of its synonyms.
传播行为在spring事务中有实现,属于spring自己的特性,它处理了嵌套事务相互影响的程度和方式。
常用框架
学习框架我们有必要了解它的演进路径,在课程学习中,Allen老师提到学习框架的一个概念特别棒:逻辑基点。然后根据这个“逻辑基点”发散、思考整个框架的构成。
比如Spring Core框架的逻辑基点是:把一个对象放进一个集合管理起来,然后从怎么生产对象、怎么存放对象、怎么使用对象等方面进行思考。
回顾过程重点看了数据库连接池、Spring JDBC、ORM、Spring 事务管理相关知识,在这儿也总结下:
-
数据库连接池
数据库连接是比较珍贵的资源,我们使用原生JDBC开发的时候,数据库的连接时自己创建的,并没有进行管理。多线程数据库访问时,数据库连接复用,减少连接创建和销毁的资源非常有必要,数据库连接池就是干这活的。主流的数据库连接池都可以设置最大连接数,进行限流。常用数据库连接池:druid,dbcp(tomcat使用),HikariCP(springboot默认连接池),c3p0。我们需要重点关注高级配置:初始化连接数、最大连接数、最大连接超时时间、空闲最大连接数和最小连接数(自动关闭和创建连接)等,性能优化方面这些参数可以起到很大的作用。 -
Spring JDBC
封装数据库访问操作(JDBC),可以认为是轻量的ORM,利用JdbcTemplate进行数据操作。缺点:结果集映射处理不友好,所以需要更优秀的ORM框架 -
ORM
解决JAVA对象(或者java对象操作)和关系数据库的表(或操作结果)映射关系,主要就是
绑定参数生成SQL,对执行结果进行对象映射。常见成熟的ORM:Hibernate,Mybatis。
Mybatis严格上不算ORM,偏面向关系的,没有Hibernate面向对象映射,但是Mybatis在Sql语句编写方面则更灵活*。
使用Mybatis的配置文件和注解都可以(@Select,@Insert,@Update,@Delete,@Results,@Result,@Many等)。
另外Mybatis内置了数据库连接池(tpye=pooled),小型项目中足够了,也可以结合上面提到的第三方连接池使用。 -
Spring 事务管理
本质是对数据库事务的支持,基于JDBC的Connection对象实现和封装;我们可以用编程式TransactionTemplate对象,也可以使用声明式@Transaction(利用AOP技术实现,cglib动态生成一个代理类,继承原类,重写方法)。隔离等级的实现:基本和数据库事务隔离等级保持一致。
传播行为:属于事务增强特性。解决的是嵌套事务的相互影响的问题,包括:
1.PROPAGATION_REQUIRED:内外层事务按照一个事务处理,内层任意个“事务”(其实只有一个事务)回滚,整个事务回滚。他们属于同一事务。默认方式。
2.PROPAGATION_SUPPORTS:加入外层事务,如果没有外层事务,就以非事务方式执行。
3.PROPAGATION_MANDATORY:加入外层事务,如果没有外层事务,就抛出异常。
4.PROPAGATION_REQUIRES_NEW:内部事务设置该行为,将和外部事务独立,新建一个事务,外部事务和内部事务都可以单独回滚。
5.PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,会挂起外层事务。
6.PROPAGATION_NEVER:不允许嵌套,否则抛异常(数据库常用方式)。
7.外部事务影响内部事务,外部事务回滚内部事务全部回滚;内部事务可以单独回滚。
写在最后
这次回顾,确实起到了查漏补缺的作用,但也有些知识点没有深入,浮于表面,没有关系,已经都设置了“埋点”,有时间的时候继续深挖。最感谢网易云课堂打开了我的学习思路。
上一篇: struct 模块的简单使用