编写自己的JDBC框架
用来定义数据的数据叫做元数据
元数据-DataBaseMetaData
l 元数据:数据库、表、列的定义信息。
l Connection.getDatabaseMetaData()
l DataBaseMetaData对象
• getURL():返回一个String类对象,代表数据库的URL。
• getUserName():返回连接当前数据库管理系统的用户名。
• getDatabaseProductName():返回数据库的产品名称。
• getDatabaseProductVersion():返回数据库的版本号。
• getDriverName():返回驱动驱动程序的名称。
• getDriverVersion():返回驱动程序的版本号。
• isReadOnly():返回一个boolean值,指示数据库是否只允许读操作。
元数据- ParameterMetaData
l PreparedStatement . getParameterMetaData()
• 获得代表PreparedStatement元数据的ParameterMetaData对象。
• Select * from user where name=? And password=?
l ParameterMetaData对象
• getParameterCount()
• 获得指定参数的个数
• getParameterType(int param)
• 获得指定参数的sql类型
元数据-ResultSetMetaData
l ResultSet. getMetaData()
• 获得代表ResultSet对象元数据的ResultSetMetaData对象。
l ResultSetMetaData对象
• getColumnCount()
• 返回resultset对象的列数
• getColumnName(int column)
• 获得指定列的名称
• getColumnTypeName(int column)
• 获得指定列的类型
使用元数据简化JDBC代码
l 业务背景:系统中所有实体对象都涉及到基本的CRUD操作:
• 所有实体的CUD操作代码基本相同,仅仅发送给数据库的SQL语句不同而已,因此可以把CUD操作的所有相同代码抽取到工具类的一个update方法中,并定义参数接收变化的SQL语句。
• 实体的R操作,除SQL语句不同之外,根据操作的实体不同,对ResultSet的映射也各不相同,因此可义一个query方法,除以参数形式接收变化的SQL语句外,可以使用策略模式由qurey方法的调用者决定如何把ResultSet中的数据映射到实体对象中。
UserDaoImpl.java部分
public void insert() throws SQLException{
/*Connection con=null;
PreparedStatement st=null;
ResultSet rs=null;
con=DBManager.getConnection();
String sql = "insert into users(id,name,password,email,birthday) values(?,?,?,?,?)";
st=con.prepareStatement(sql);
st.setInt(1,6);
st.setString(2,"xxxx");
st.setString(3,"1111");
st.setString(4,"aa@sina.com");
st.setDate(5,new java.sql.Date(new Date().getTime()));
st.executeUpdate(sql);*/
String sql = "insert into users(id,name,password,email,birth";
Object[] params={2,"xxx","111","xxx@126.com",new Date()};
DBManager.update(sql, params);
}
public void delete() throws SQLException{
/*Connection con=null;
PreparedStatement st=null;
ResultSet rs=null;
con=DBManager.getConnection();
String sql = "delete from users where id=?";
st=con.prepareStatement(sql);
st.setInt(1,1);
st.executeUpdate(sql);*/
String sql = "delete from users where id=?";
Object[] params={4};//删除4号用户
DBManager.update(sql, params);
}
public void update() throws SQLException{
/*Connection con=null;
PreparedStatement st=null;
ResultSet rs=null;
con=DBManager.getConnection();
String sql = "update isers set name=?,password=? where id=?";
st=con.prepareStatement(sql);
st.setString(1,"xxx");
st.setString(2, "111");
st.setInt(3, 5);
st.executeUpdate(sql);*/
String sql = "update isers set name=? password=?,where id=?";
Object[] params={"www","222",1};//把1号用户的名字和密码更新为www和222
DBManager.update(sql, params);
}
public void find() throws SQLException{
Connection con=null;
PreparedStatement st=null;
ResultSet rs=null;
con=DBManager.getConnection();
String sql = "select * from users where id=?";
st=con.prepareStatement(sql);
st.setInt(1,6);
rs=st.executeQuery();
while(rs.next()){
//JavaBean对象rs.getXXX(i)
}
在DBManager.java中写以下此方法,则在UserDaoImpl.java部分可以直接调用
public static void update(String sql,Object[] params){
//包括增删改等方法
Connection con=null;
PreparedStatement st=null;
ResultSet rs=null;
try {
con=DBManager.getConnection();
st=con.prepareStatement(sql);
for(int i=0;i<params.length;i++){
st.setObject(i+1,params[i]);
}
st.executeUpdate(sql);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
DBManager.release(con, st, rs);
}
}
红色部分为在DBManager.java中写update方法之前连接数据库时所需要的代码