使用 元数据简化JDBC代码
首先了解三种元数据
一.元数据- DataBaseMetaData
元数据:数据库、表、列的定义信息。
Connection.getDatabaseMetaData()
DataBaseMetaData对象
a)getURL():返回一个String类对象,代表数据库的URL。
b)getUserName():返回连接当前数据库管理系统的用户名。
c)getDatabaseProductName():返回数据库的产品名称。
d)getDatabaseProductVersion():返回数据库的版本号。
e)getDriverName():返回驱动驱动程序的名称。
f)getDriverVersion():返回驱动程序的版本号。
g)isReadOnly():返回一个boolean值,指示数据库是否只允许读操作。
元数据-ParameterMetaData
l PreparedStatement . getParameterMetaData()
• 获得代表PreparedStatement元数据的ParameterMetaData对象。
• Select * from user where name=? And password=?
l ParameterMetaData对象
• getParameterCount()
• 获得指定参数的个数
• getParameterType(intparam)
获得指定参数的sql类型
元数据-ResultSetMetaData
l ResultSet. getMetaData()
• 获得代表ResultSet对象元数据的ResultSetMetaData对象。
l ResultSetMetaData对象
• getColumnCount()
• 返回resultset对象的列数
• getColumnName(intcolumn)
• 获得指定列的名称
• getColumnTypeName(intcolumn)
• 获得指定列的类型
使用元数据简化JDBC代码
l 业务背景:系统中所有实体对象都涉及到基本的CRUD操作:
• 所有实体的CUD操作代码基本相同,仅仅发送给数据库的SQL语句不同而已,因此可以把CUD操作的所有相同代码抽取到工具类的一个update方法中,并定义参数接收变化的SQL语句。
• 实体的R操作,除SQL语句不同之外,根据操作的实体不同,对ResultSet的映射也各不相同,因此可义一个query方法,除以参数形式接收变化的SQL语句外,可以使用策略模式由qurey方法的调用者决定如何把ResultSet中的数据映射到实体对象中。
实例分析:实现增删改查的简化代码
DBManager.Java代码
package com.hbsi.utils;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import javax.sql.DataSource;
importorg.apache.commons.dbcp.BasicDataSourceFactory;
public class DBManager {
privatestatic DataSource ds=null;
static{
//返回读取指定资源的输入流
InputStreamis=DBManager.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");
//创建一个无默认值的空属性列表
Propertiesp=new Properties();
try{
//从输入流中读取属性列表(键和元素对)
p.load(is);
//工厂模式
ds=BasicDataSourceFactory.createDataSource(p);
}catch(Exception e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
publicstatic Connection getConnection() throws SQLException{
returnds.getConnection();
}
publicstatic void release(Connection con,Statement st,ResultSet rs){
if(rs!=null){
try{
rs.close();
}catch(Exception e) {e.printStackTrace();}
rs = null;
}
if(st!=null){
try{
st.close();
}catch(Exception e) {e.printStackTrace();}
st= null;
}
if(con!=null){
try{
con.close();
}catch(Exception e) {e.printStackTrace();}
con= null;
}
}
publicstatic void update(String sql,Object[] params){
//
Connectioncon=null;
PreparedStatementst=null;
ResultSetrs=null;
try{
con=DBManager.getConnection();
st=con.prepareStatement(sql);
for(inti=0;i<params.length;i++){
st.setObject(i+1,params[i]);
}
st.executeUpdate();
}catch (SQLException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}finally{
DBManager.release(con,st, rs);
}
}
publicstatic Object find(String sql,Object[] params,ResultSetHandler rsh) throwsSQLException{
//
Connectioncon=null;
PreparedStatementst=null;
ResultSetrs=null;
try{
con=DBManager.getConnection();
st=con.prepareStatement(sql);
for(inti=0;i<params.length;i++){
st.setObject(i+1,params[i]);
}
rs=st.executeQuery();
//对结果集的处理.框架的开发者不知道如何处理,框架开发者制定一个规范
//只需要调用程序员传过来对结果集进行处理方法
returnrsh.handler(rs);
}finally{
DBManager.release(con,st, rs);
}
}
}
BeanListHAndle.java
package com.hbsi.utils;
import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class BeanListHandle implements ResultSetHandler {
//某种类型
private Class clazz;
//传递javaBean类对象Class对象
public BeanListHandle(Classclazz){
this.clazz=clazz;
}
@Override
public Object handler(ResultSet rs) {
List list=new ArrayList();
try {
while(rs.next()){
//读取一行
//封装到bean对象
Object bean=clazz.newInstance();
ResultSetMetaData meta=rs.getMetaData();
int count=meta.getColumnCount();
for(int i=1;i<=count;i++){
String columnName=meta.getColumnName(i);
Object value=rs.getObject(columnName);
Field f=clazz.getDeclaredField(columnName);
f.setAccessible(true);
f.set(bean, value);
}
//该bean对象加入list集合
list.add(bean);
}
} catch (Exception e) {
// TODO Auto-generatedcatch block
throw new RuntimeException(e);
}
return list;
}
}
UserDaoImpl.java
package com.hbsi.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;
import com.hbsi.domain.User;
import com.hbsi.utils.BeanHandler;
import com.hbsi.utils.BeanListHandle;
import com.hbsi.utils.DBManager;
public class UserDaoImpl {
publicvoid insert() throws SQLException{
// Connectioncon=null;
// PreparedStatementst=null;
// ResultSetrs=null;
//
// con=DBManager.getConnection();
// Stringsql = "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,"[email protected]");
// st.setDate(5,newjava.sql.Date(new Date().getTime()));
// st.executeUpdate(sql);
Stringsql = "insert into users(id,name,password,email,birthday)values(?,?,?,?,?)";
Object[]params={9,"xxx","1111","[email protected]",new Date()};
DBManager.update(sql,params);
}
publicvoid delete() throws SQLException{
// Connection con=null;
// PreparedStatementst=null;
// ResultSetrs=null;
// con=DBManager.getConnection();
// Stringsql = "delete from users where id=?";
// st=con.prepareStatement(sql);
// st.setInt(1,1);
// st.executeUpdate();
Stringsql = "delete from users where id=?";
Object[]params={4};
DBManager.update(sql,params);
}
publicvoid update() throws SQLException{
// Connectioncon=null;
// PreparedStatementst=null;
// ResultSetrs=null;
// con=DBManager.getConnection();
// Stringsql="update users set name=? password=? where id=?";
// st.setString(1,"MAKE");
// st.setString(2,"111");
// st.setInt(3,5);
// st.executeUpdate();
Stringsql="update users set name=?,password=? where id=?";
Object[]params={"qqq","1111",5};
DBManager.update(sql,params);
}
//DBManager写一个方法update(Stringsql,Object[] param)
publicvoid find() throws SQLException{
// Connectioncon=null;
// PreparedStatementst=null;
// ResultSetrs=null;
// con=DBManager.getConnection();
// Stringsql="update users set name=? password=? where id=?";
// st.setString(1,"MAKE");
// st.setString(2,"111");
// st.setInt(3,5);
// st.executeUpdate();
Stringsql="select * from user where id=?";
Object[]params={1};
//MyResultsetHAndlerrsh=new MyResultsetHAndler();
BeanHandlerrsh=new BeanHandler(User.class);
Useruser=(User) DBManager.find(sql, params,rsh);
System.out.println(user.getId()+""+user.getName());
}
publicList findAll(){
Listlist=null;
Stringsql="select * from user";
Object[] params={};
BeanListHandlersh=new BeanListHandle(User.class);
try {
list= (List)DBManager.find(sql, params, rsh);
}catch (SQLException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
returnlist;
}
}