本文共 3018 字,大约阅读时间需要 10 分钟。
java基础准备
继承(extends)
public class XXX(子类) extends XXX(父类) { }
父类中private的,只有父类自己可以用。
若需要子类访问:
- 可以改为 protexted(同一个包内),但是尽量不要。
- 在父类中为对象建立构造器做初始化,然后在子类中用**super(XXX);**调用父类中的构造器。
执行顺序:父类的定义初始化 —> 构造器 —> 子类的定义初始化 —> 构造器
子父类同名成员变量时,两者之间没有任何联系,子类的就是自己的,父类的也是。
多态
函数调用的绑定(技术基础)
- 当通过对象变量调用函数的时候,调用哪个函数这件事情叫绑定。
- 静态绑定:根据变量的声明类型来决定。
- 动态绑定:根据变量的动态类型来决定。
- 在成员函数中调用其他成员函数也是通过this这个对象变量来调用的。
覆盖(override)
- 子类和父类中存在名称和参数表完全相同的函数,这一对函数构成覆盖关系。
- 通过父类的变量调用存在覆盖关系的函数时,会调用变量当时所管理的对象所属的类的函数。
造型(cast)
把一个类型的对象,赋给另外一个类型的变量,这个过程叫作造型。
- 子类的对象可以赋值给父类的变量。
- 父类的对象不能赋值给子类的变量。
- java中不存在对象对对象的赋值。
注意事项:
- 用括号圈起类型放在值得前面
- 对象本身并没有发生任何变化,所以不是"类型转换"。
- 运行时有机制来检查这样的转化是否合理 ClassCastException。
封装(可扩展性)
Java——单根结构(Object)
用封装来降低耦合,消除代码复制,重复的代码写在一个方法中,需要使用时可以调用。类和类之间的关系称作耦合,耦合越低越好,保持距离是形成良好代码的关键。
Sring和StringBuffer和StringBuilder
string
Sring的值是不可变的,这就是导致每次对String的操作都会生成新的String对象。不仅效率低下,而且浪费大量优先的内存空间。
StringBuffer**(线程安全,多线程操作字符串)**
可变类和线程安全的字符串操作类。任何对它指向的字符串的操作都不会产生新的对象。每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量;当字符串大小超过容量时,会自动增加容量
StringBuilder(线程不安全,单线程操作字符串)
可变类,速度更快
小结
- 如果操作少量的数据,使用String。
- 多线程下操作字符串缓冲区下操作大量数据 ,用StringBuffer。
- 单线程下操作字符串缓冲区下操作大量数据。用StringBuilder。
用接口来实现聚合,用容器来实现灵活性,不要用成员变量做"硬编码"。
JDBC相关
JDBC应用程序的编写
构建步骤:
- 搭载驱动程序
- 建立数据库连接
- 执行SQL语句
- 获取执行结果
- 清理环境
注意:
- 应捕获异常,进行异常处理。
- 应清理资源(放在finally中)。
JDBC——数据库操作
业务场景一:海量数据读取
**问题:内存溢出异常。**因为java程序运行在JVM中,JVM是有内存大小限制的,内存放不下。
**解决方法:游标。**提供一种客户端读取部分服务器端结果集的机制(Fetch Size)
业务场景二:读取大对象
**问题:**内存溢出。
**方式:**二进制流方式(ResultSet.getBinaryStream() )
业务场景三:大量数据插入操作
**问题:**运行速度过慢,效率低下。**原因:**每次执行都要发送一次。
**方法:**批处理。
Statement
- addBatch()——把sql打包成一个执行单元
- executeBatch()——执行
- clearBatch()——清空sql语句,准备下次执行
连接池
DBCP(应用最广泛的阿帕奇开源连接池)
- commons-dbcp.jar
- commmons-pool.jar
- commons-logging.jar
BasicDataSource
- .setInitialSzie() ——创建预置连接,加快启动速度
- .setMaxTotal()——设置最大线程数,超出的进入等待队列
- .setMaxWaitMillis()——设立最大等待时长,超过抛出异常
- .setMaxIdle()——设立最大空闲连接数,超过该值就销毁
- .setMinIdle()——设立最小空闲连接数,小于该值就创建空闲连接
死锁
多个事物因争夺锁资源而造成的一种互相等待的现象。
产生条件:
- 互斥
- 并发执行的事物为了进行必要的隔离保持执行正确,在事务结束前,需要对修改的数据库记录持锁,保证多个事物对相同数据库记录串行修改。
- 对于大型并发系统无法避免。
- 请求和保持
- 已经持有一个资源锁,等待另外一个资源锁。
- 死锁仅发生在请求两个或者两个以上的锁对象。
- 由于应用需要,难以消除。
- 不剥夺
- 已经获得锁资源的事务,在未执行前,不能被强制剥夺,只能使用完时,由事务自己释放。
- 一般用于已经出现死锁时,通过破坏该条件达到解除死锁的目的。
- 数据库系统通过一定的死锁检测机制发现死锁,强制回滚代价相对小的事务,达到解除死锁的目的。
- 环路等待
Spring JDBC
事务管理(Spring)
- 统一的事务编程模型。
- 编程式事务及声明式事务(AOP)。
隔离级别
事务并发操作同一批数据的时候所导致的问题可以通过设置隔离级别来解决
- ISOLATION_READ_UNCOMMITTED(读未提交)
- ISOLATION_READ_UOMMITTED(读提交)–Oracle默认级别
- ISOLATION_READ_REPEATABLE_READ(重复读)–MySQL默认级别
- ISOLATION_READ_SERIALIZABLE(串行化)
- ISOLATION_READ_DEFAULT(默认)
配置<tx:method/>
- name:匹配的函数名称,支持*匹配
- propagation:事务传播行为
- isolation:事务隔离级别
- timeout:超时
- read-only:是否只读事务
- rollback-for:触发回滚的异常,逗号分隔
- no-rollback-for:不触发回归的异常,逗号隔开
@Transactional
- value:使用的TransactionManager
- propagation:事务传播行为
- isolation:事务隔离级别
- time out:超时
- readOnly:是否只读事务
- rollbackFor:触发回滚的异常类对象数组
- rollbackForClassName:触发回滚的异常类名称数组
- noRollbackFor:不触发回滚的异常类对象数组
- noRollbackForClassName:不触发回滚的异常类名称数组
转载地址:http://bmugn.baihongyu.com/