对查找进行优化实例代码:
DBManager部分:
public static Object find(String sql,Object[] params ,ResultSetHandler rsh) throws SQLException{
//怎样对结果集进行相应的处理————用到反射和元数据对象
Connection con=null;
PreparedStatement st=null;
ResultSet rs=null;
con=DBManager.getConnection();
try {
st=con.prepareStatement(sql);
for(int i=0;i<params.length;i++){
st.setObject(i+1, params[i]);
}
rs=st.executeQuery();
//对结果集的处理
//调用程序员传过来的对结果集进行处理的方法即可(UserDaoImpl)
return rsh.handler(rs);
} finally{
DBManager.release(con, st, rs);
}
}
UserDaoImpl部分:
//(1)查找一个
public void find() throws SQLException{
String sql="select *from users where id=?";
Object[] params={2};
//实行查询
BeanHandler rsh=new BeanHandler(User.class);
User user=(User) DBManager.find(sql, params, rsh);
System.out.println(user.toString());
}
//作为框架的开发者,构建结果集的处理器,将结果集中的第一行记录封装在一个javabean对象中
public class BeanHandler implements ResultSetHandler {
//传递javabean类所对应的class对象
private Class clazz;//代表某种类型
public BeanHandler(Class clazz){
this.clazz=clazz;
}
@Override
public Object handler(ResultSet rs) {
// TODO Auto-generatedmethod stub
try {
if(!rs.next()){
return null;
}
//读取结果集中的各个列封装到javabean中
Object bean=clazz.newInstance();//创建指定的javabean对象
//读取结果集
ResultSetMetaData meta=rs.getMetaData();//结果集中有几行几列,每列的类型,结果集的元数据对象
int count = meta.getColumnCount();//得到列数
for(int i=1;i<=count;i++){
//把结果集中的列读取出来设置到bean对象上
String coumnName=meta.getColumnName(i);//得到第i列的列名
Object value=rs.getObject(coumnName);//从结果集中读取到了指定列的值
//调用set方法设置属性
//通过反射机制得到bean对象中的某一个属性所对应的Field对象
Field f=bean.getClass().getDeclaredField(coumnName);//得到bean所对应的class类型
f.setAccessible(true);
f.set(bean, value);
}
return bean;
} catch (Exception e) {
// TODO Auto-generatedcatch block
throw new RuntimeException(e);//运行时异常
}
}
}
//(2)查找全部
public List findAll() throws SQLException{
List list=null;
String sql="select *from users";
Object[] params={};
BeanListHandler rsh=new BeanListHandler(User.class);
list=(List) DBManager.find(sql, params, rsh);//调用自己编写的框架
return list;
}
//用来得到查询多行多列
public class BeanListHandler implements ResultSetHandler {
private Class clazz;//代表某种类型
public BeanListHandler(Class clazz){
this.clazz=clazz;
}
@Override
public Object handler(ResultSet rs) {
try{
List list=new ArrayList();
while(rs.next()){
//循环的读取一行,把这一行设置到bean 对象中,再把该bean 对象加入到list集合里面去
Object bean=clazz.newInstance();//创建bean对象
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);
}
return list;
}catch(Exception e){
throw new RuntimeException(e);
}
}
}
public interface ResultSetHandler {
//結果集处理器接口
//规定一个方法,让程序员按照规定的方法写
public Object handler(ResultSet rs);
}
MyResultSetHandler部分
public class MyResultSetHandler implements ResultSetHandler {
@Override
public Object handler(ResultSet rs) {
// TODO Auto-generatedmethod stub
User user=new User();
try {
if(rs.next()){
user.setId(rs.getInt(1));
user.setName(rs.getString(2));
user.setPassword(rs.getString(3));
user.setEmail(rs.getString(4));
}
} catch (SQLException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
return user;
}
}
User.java部分:
public class User {
private int id;
private String name;
private String password;
private String email;
private Date birthday;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "User[id=" + id + ", "
+ (name != null ? "name=" + name + ", " : "")
+ (password != null ? "password=" + password + ", " : "")
+ (email != null ? "email=" + email + ", " : "")
+ (birthday != null ? "birthday=" + birthday : "") + "]";
}
}