代码缺陷:
1 Class.forName("oracle.jdbc.driver.OracleDriver");
*数据库的相关信息硬编码在程序中
*代码冗余,效率低
*应该整个系统执行一次,系统启动则执行
2 Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:orcl", "system", "sinojava");
*数据库的相关信息硬编码在程序中
*数据库的相关信息不安全
*代码冗余,
尽量减少跨越JVM的IO操作(Connection多个方法公用)
*3 Statement stm = conn.createStatement();
int i = stm.executeUpdate(sql);
==============================================
要求必须是一条sql语句对应一个语句执行体对象
==============================================
sql语句要求程序员拼接,应该将sql语句的拼接、数据库和java中类型转换等跟程序员解耦合
4 stmt.close(); conn.close();
*代码冗余
*资源不能保证正常释放
*5 主键的值必须由系统自动生成
insert into student values(student_seq.nextval,...)
*6 JDBC中默认是一条sql语句提交一次
无法保证事务的完整性
JVM DB
dao执行之前 student没有主键 没有当前记录 --临时对象
dao执行之后 student有主键 有当前记录 --持久化对象
接口中:
方法默认是公开抽象方法(public abstract)
属性默认是公开静态常量(public static final)
工厂模式:
屏蔽底层产品的实现细节,对外只公开获取产品的公共方法。
生产单一产品的工厂
生产不同种类产品的工厂
静态工厂
方法是static的
实例工厂
方法是普通方法,要产品必须先建工厂
原理代码:
public class AnimalFactory {
//公开的对外调用的获取产品的方法
public static Animal getAnimal(String type,String animalName) throws Exception{
Animal a = null;
if(type.equalsIgnoreCase("dog")){
a = new Dog(animalName);
}
if(type.equalsIgnoreCase("cat")){
a = new Cat(animalName);
}
return a;
}
}
单例模式:
要求:
注册驱动、获取连接两个步骤,应该只执行一次
连接对象应该给所有的人共用
解决:
单例模式:针对一个类,永远只能获取一个对象
实现:
1 new 方式对外屏蔽
2 提供一个获取唯一对象的公共方法
代码:
private Dog() {
}
public static Dog getInstance(){
if(dog == null){
dog = new Dog();
}
return dog;
}
注意:
单例模式中,connection对象不能关闭