一、数据库元信息的获取(编写JDBC框架)
1、什么数据库元信息
指数据库、表等的定义信息
2、元信息:
l 数据库的元信息:DatabaseMetaData dmd = conn.getMetaData();//数据库的元信息。全部都是getter方法
l 参数元信息:执行的SQL语句中的占位符元信息
l 结果集元信息:
二、编写属于自己的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);
}
}
}