天天看点

策略设计模式(编写属于自己的JDBC框架)一、数据库元信息的获取(编写JDBC框架)二、编写属于自己的JDBC框架(策略设计模式)

一、数据库元信息的获取(编写JDBC框架)

1、什么数据库元信息

指数据库、表等的定义信息

2、元信息:

l  数据库的元信息:DatabaseMetaData dmd = conn.getMetaData();//数据库的元信息。全部都是getter方法

l  参数元信息:执行的SQL语句中的占位符元信息

l  结果集元信息:

策略设计模式(编写属于自己的JDBC框架)一、数据库元信息的获取(编写JDBC框架)二、编写属于自己的JDBC框架(策略设计模式)

二、编写属于自己的JDBC框架(策略设计模式)

ResultSetHandler接口:

package com.leaf.day17.dbassist;

import java.sql.ResultSet;

//抽象策略
public interface ResultSetHandler {
/**
 * 把结果集中的数据封装到对象中
 * @param rs
 * @return
 */
	Object handle(ResultSet rs);
}
           
package com.leaf.day17.dbassist;

import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;

//策略的具体实现
/**
 * 专门用于封装结果中只有一条的记录的情况
 */
public class BeanHandler implements ResultSetHandler {

	private Class clazz;
	public BeanHandler(Class clazz){
		this.clazz = clazz;
	}
	@Override
	public Object handle(ResultSet rs) {
		
		try {
			if(rs.next()){
				Object bean = clazz.newInstance();
				ResultSetMetaData rsmd = rs.getMetaData();
				int colCount = rs.getMetaData().getColumnCount();
				for(int i=0;i<colCount;i++){
					String colName = rsmd.getColumnName(i+1);//拿到javabean中的列名
					Object colValue = rs.getObject(colName);//由列名拿到对应的列值
					//得到javabean中对应的字段
					
					Field fieldName = clazz.getDeclaredField(colName);
					fieldName.setAccessible(true);
					fieldName.set(bean, colValue);
				}
				return bean;
			}
			return null;
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

}
           
package com.leaf.day17.dbassist;

import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List;

import com.leaf.day17.dbassist.domain.User;

/**
 * 适合有多条结果记录的数据封装
 * 返回的是一个List
 *
 */
public class BeanListHandler implements ResultSetHandler{

	private Class clazz;
	public BeanListHandler(Class clazz){
		this.clazz = clazz;
	}
	
	public Object handle(ResultSet rs){
		
		try {
			List list = new ArrayList();
			while(rs.next()){
				Object bean = clazz.newInstance();
				//封装数据:书写JavaBean的前提,类中的字段名或属性名与数据库表的字段名保持一致
				ResultSetMetaData rsmd = rs.getMetaData();
				int colCount = rsmd.getColumnCount();
				for(int i=0;i<colCount;i++){
					String colName = rsmd.getColumnName(i+1);//与JavaBean的字段名一致
					Object colValue = rs.getObject(colName);//列值
					//得到JavaBean的对应字段
					Field field = clazz.getDeclaredField(colName);
					field.setAccessible(true);
					field.set(bean, colValue);
				}
				list.add(bean);
			}
			return list;
		} catch (Exception e) {
			throw new RuntimeException("封装数据失败!");
		}
	}
}
           
package com.leaf.day17.dbassist.utils;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSourceFactory;

public class DBCPUtil {

	private static DataSource dataSource;
	static{
		try {
			InputStream in = DBCPUtil.class.getClassLoader().getResourceAsStream("DBDriver2.properties");
			Properties props = new Properties();
			props.load(in);
			in.close();
			dataSource = BasicDataSourceFactory.createDataSource(props);
		} catch (Exception e) {
			throw new ExceptionInInitializerError("初始化加载配置文件异常");
		}
	}
	
	public static Connection getConnection(){
		try {
			return dataSource.getConnection();
		} catch (SQLException e) {
			throw new RuntimeException("获取数据源异常");
		}
	}
	
	public static DataSource getDataSource(){
			return dataSource;
	}
}
           
package com.leaf.day17.dbassist.dao.impl;

import java.util.List;

import org.junit.Test;

import com.leaf.day17.dbassist.BeanHandler;
import com.leaf.day17.dbassist.BeanListHandler;
import com.leaf.day17.dbassist.DBAssist;
import com.leaf.day17.dbassist.domain.User;
import com.leaf.day17.dbassist.utils.DBCPUtil;

public class UserDaoImpl {

	private DBAssist dba = new DBAssist(DBCPUtil.getDataSource());
	@Test
	public void add(){
		dba.update("insert into user1(id,username,password,nick) values(?,?,?,?)", 1,"xiaozhang","123","大王");
	}
	@Test
	public void query(){
		dba.query("select * from user1 where username=? and password=?",new BeanHandler(User.class),"xiaozhang","123");
	}
	
	@Test
	public void query1(){
		User user = (User) dba.query("select * from user1 where id=?", new BeanListHandler(User.class), 1);
		System.out.println(user);
	}
	
	@Test
	public void query2(){
		List<User> list = (List<User>) dba.query("select * from user1 ", new BeanListHandler(User.class));
		for(User l : list){
			System.out.println(l);
		}
	}
}