1.每个DAO中都有连接数据库的过程,如果每次连接的话 都要重写驱动和用户名的话将是一个繁琐的过程
我们可以通过一个DAO父类来解决这个问题
package day01pm.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
* DAO父类
*
* 基础类
* 提供所有的DAO 都需要兼备的特性
*
* @author ssd
*
*/
public class BaseDAO {
private static String diver = "oracle.jdbc.driver.OracleDriver";
private static String url = "jdbc:oracle:thin:@localhost:1521:orcl";
private static String user = "scott";
private static String pwd = "Shen2014";
/**
* 在静态初始化中注册驱动
* 驱动不需要重复注册,所以静态初始化最适合注册驱动
* @return
*/
static {
try{
Class.forName(diver);
/**
* oracle.jdbc.driver.OracleDriver类
* 在Class.froName()的时候被载入JVM
* OracleDriver 是JDBC中的Driver 的子类
* 他被要求在静态初始化的时候要将自身驱动的信息
* 通过DriverManager 的静态方法注册进去,这样DriverManager就
* 知道应该如何通过OracleDriver去连接数据库了。
* 所以之后就可以公国DriverManager 的另一个静态方法:
* getConnection()来根据之前的注册的驱动信息来获取连接了。
*/
Connection conn = DriverManager.getConnection(url,user,pwd);
}catch (Exception e){
e.printStackTrace();
//若注册失败,我们要通知调用者
throw new RuntimeException(e);
}
}
/**
* 获取数据库连接对象Connection
* @return
* @throws SQLException 当连接失败时抛出异常
*/
protected static Connection getConnection() throws SQLException{
return DriverManager.getConnection(url,user,pwd);
}
protected static void closeConnection (Connection conn){
if(conn != null){
try{
conn.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}
}
这样的话 上次的StudentDAO就可以通过继承BaseDAO的方法
测试结果相同
package day01pm.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import day01pm.entity.Student;
/**
* DAO 数据连接对象
*
* StudentDAO 用于操作数据库Student表
*
* @author ssd
*
*/
public class StudentDAO extends BaseDAO{
/**
* 根据学生的姓名查询学生的信息
* @param name
* @return
*/
public Student findStudentByName(String name){
Connection conn = null;
try {
//通过父类的BaseDAO的getConnection()方法获取数据库连接
conn = getConnection();
Statement state = conn.createStatement();
String sql = "SELECT * FROM student WHERE name = '"+name+"'";
/**
*根据用户名查询该用户的信息
*并将这条数据转化为一个Student对象返回
*/
ResultSet rs = state.executeQuery(sql);
if(rs.next()){
Student student = new Student();
student.setId(rs.getString("id"));
student.setName(rs.getString("name"));
student.setAge(rs.getInt("age"));
student.setSex(rs.getString("sex"));
return student;
}
}catch (Exception e){
e.printStackTrace();
}finally{
closeConnection(conn);
}
return null;
}
}
通过原来的Test程序 得到的结果是相同的