自定义JDBC框架

原创 2017年01月03日 19:19:27

自定义JDBC框架

连接数据库的工具类(数据源):
DBCPUtils:
package com.heima.utils;

import java.awt.image.DataBuffer;
import java.io.IOException;
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 DBCPUtils {

	private static DataSource ds ;
	
	static {
		//将配置文件加载进来
		InputStream in = DBCPUtils.class.getClassLoader().getResourceAsStream("dbcpconfig.properties") ;
		Properties props = new Properties() ;
		try {
			props.load(in) ;
			ds = BasicDataSourceFactory.createDataSource(props) ;
		} catch (Exception e) {
			throw new RuntimeException("服务器忙") ;
		}
	}
	
	//提供获取连接的方法
	public static Connection getConnection(){
		try {
			return ds.getConnection() ;
		} catch (SQLException e) {
			throw new RuntimeException("服务器忙") ;
		}
	}
}
dbcpconfig.properties:
自定义连接数据库的框架:
package com.heima.DBAssist;

import java.sql.Connection;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import com.heima.handler.ResultHandler;
import com.heima.handler.impl.ResultSetHandlerImpl;
import com.heima.handler.impl.ResultSetListenerHandlerImpl;
import com.heima.utils.DBCPUtils;

//自定义框架
public class DBAsssist {

	
	// 执行添改删语句
	public boolean update(String sql, Object... params) {//sql:要执行的sql语句,params:sql语句中的参数(即?的值)
		// 拿到连接对象
		Connection conn = DBCPUtils.getConnection();
		int t = 0;
		try {
			// 创建预处理命令对象
			PreparedStatement pstmt = conn.prepareStatement(sql);
			// 对?进行赋值
			// 获取ParameterMetaData对象
			ParameterMetaData pmd = pstmt.getParameterMetaData();
			// 拿到?的个数
			int n = pmd.getParameterCount();
			if (n > 0) {
				// sql语句里有?号
				if (params == null || params.length != n) {
					throw new RuntimeException("参数的个数不匹配");
				}
				// 依次给每个?赋值
				for (int i = 0; i < n; i++) {
					pstmt.setObject(i + 1, params[i]);
				}
			}

			t = pstmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				conn.close(); // 还回池中了
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return t > 0 ? true : false;
	}

	// 执行查询语句
	public Object query(String sql,Class clazz, Object... params) {
		// 拿到连接对象
		Connection conn = DBCPUtils.getConnection();
		try {
			// 创建预处理命令对象
			PreparedStatement pstmt = conn.prepareStatement(sql);
			// 对?进行赋值
			// 获取ParameterMetaData对象
			ParameterMetaData pmd = pstmt.getParameterMetaData();
			// 拿到?的个数
			int n = pmd.getParameterCount();
			if (n > 0) {
				// sql语句里有?号
				if (params == null || params.length != n) {
					throw new RuntimeException("参数的个数不匹配");
				}
				// 依次给每个?赋值
				for (int i = 0; i < n; i++) {
					pstmt.setObject(i + 1, params[i]);
				}
			}

			ResultSet rs = pstmt.executeQuery();
			return new ResultSetListenerHandlerImpl().handler(rs, clazz) ;
		} catch (SQLException e) {
			throw new RuntimeException() ;
		} finally {
			try {
				conn.close(); // 还回池中了
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}
在执行查询功能时,查询到的结果应该封装到一个javabean中,编写一个类,实现把结果集中的数据封装到bean中:
ResultHandler.java:
package com.heima.handler;

import java.sql.ResultSet;
//此时的需求是把结果集封装到javabean中,用该接口来完成此功能
public interface ResultHandler {

	//返回封装的对象(结果集)
	/**
	 * 
	 * @param rs 要封装的结果集
	 * @param clazz  封装到的那个对象
	 * @return  封装的对象
	 */
	public Object handler(ResultSet rs,Class clazz) ;
}
handler.impl:
ResultSetHandlerImpl.java(只针对一条记录的):
package com.heima.handler.impl;

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

import com.heima.handler.ResultHandler;

//只适用于结果集只有一条记录的情况
//对象的属性名和表中的字段名应当一致
public class ResultSetHandlerImpl implements ResultHandler {

	@Override
	public Object handler(ResultSet rs, Class clazz) {
//结果集的属性名字要和封装到的那个对象的bean里面的属性名字一样
		//拿到结果集的元数据对象
		try {
			if(rs.next()){
				ResultSetMetaData rsmd = rs.getMetaData() ;
				//拿到共有多少列,即拿到列名,找到对应的类当中的对象,依次调用set方法,把值设进去
				int columnCount = rsmd.getColumnCount() ;
				//先创建对象
				Object obj = clazz.newInstance() ;
				for (int i = 0; i < columnCount; i++) {
					//拿到列名
					String columnName = rsmd.getColumnName(i+1) ;		
					//拿到对象对应的属性    列名就是属性的名字 
					Field field = clazz.getDeclaredField(columnName) ;
					//设置私有属性可以访问
					field.setAccessible(true) ;
					//拿到此列对应的值
					Object objectValue = rs.getObject(i+1) ;
					//给属性赋值
					field.set(obj, objectValue) ;
				}
				return obj ;
			}else
				return null ;
		} catch (Exception e) {
			throw new RuntimeException() ;
		}
	}

}
ResultSetListenerHandlerImpl.java(针对多条记录)
package com.heima.handler.impl;

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

import com.heima.handler.ResultHandler;

//只适用于结果集有多条记录的情况
//对象的属性名和表中的字段名应当一致
public class ResultSetListenerHandlerImpl implements ResultHandler {

	@Override
	public Object handler(ResultSet rs, Class clazz) {
		
		List<Object> list = new ArrayList<Object>() ;
		//拿到结果集的元数据对象
		try {
			while(rs.next()){
				ResultSetMetaData rsmd = rs.getMetaData() ;
				//拿到公有多少列
				int columnCount = rsmd.getColumnCount() ;
				//先创建对象
				Object obj = clazz.newInstance() ;
				for (int i = 0; i < columnCount; i++) {
					//拿到列名
					String columnName = rsmd.getColumnName(i+1) ;		
					//拿到对象对应的属性
					Field field = clazz.getDeclaredField(columnName) ;
					//设置私有属性可以访问
					field.setAccessible(true) ;
					//拿到此列对应的值
					Object objectValue = rs.getObject(i+1) ;
					//给属性赋值
					field.set(obj, objectValue) ;
				}
				list.add(obj) ;
			}
			return list ;
		} catch (Exception e) {
			throw new RuntimeException() ;
		}
	}

}
bean:
package com.heima.bean;

import java.io.Serializable;

public class Account implements Serializable{

	private int id ;
	
	private String name ;
	
	private float money ;

	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 float getMoney() {
		return money;
	}

	public void setMoney(float money) {
		this.money = money;
	}

	@Override
	public String toString() {
		return "Account [id=" + id + ", name=" + name + ", money=" + money
				+ "]";
	}
	
	
	
}

Test:
package com.heima.test;

/**
 * use day16
 * create table account
 * (
 * 	   id int primary key,
 * 	   name varchar(30) ,
 * 	   money float
 * )
 */
import java.util.List;

import org.junit.Test;

import com.heima.DBAssist.DBAsssist;
import com.heima.bean.Account;

//测试自定义框架
public class Test2 {

	// 测试添加
	@Test
	public void test() {
		DBAsssist db = new DBAsssist();
		db.update("insert into account(id,name,money) values(?,?,?)", 2, "乔峰",
				2000);
	}

	// 测试更新
	@Test
	public void test1() {
		DBAsssist db = new DBAsssist();
		db.update("update account set money = money + ? where id = ?", 500, 1);
	}

	// 测试更新
	@Test
	public void test2() {
		DBAsssist db = new DBAsssist();
		db.update("delete from account where id = ?", 1);
	}

	// 测试查询
	@Test
	public void test3() {
		DBAsssist db = new DBAsssist();
		List<Account> list = (List<Account>)db.query("select * from account", Account.class) ;
		for (int i = 0; i < list.size(); i++) {
			System.out.println(list.get(i));
		}
	}

}


版权声明:本文为博主原创文章,未经博主允许不得转载。

自定义框架之JDBC的简要封装

一、简要介绍一下自己封装一个jdbc的思路 封装是什么,为什么要封装封装:是面向对象的一种表现形式,主要是面对可相信的对象提供方便,让这类对象具有使用的权利,对其它对象进行拦截,在没有相应权限的情况下...
  • renfng
  • renfng
  • 2017年05月18日 16:13
  • 1031

自定义JDBC框架

自定义JDBC框架 连接数据库的工具类(数据源): DBCPUtils: package com.heima.utils; import java.awt.image.DataBuffer; ...
  • CSDN_GIA
  • CSDN_GIA
  • 2017年01月03日 19:19
  • 432

非SpringJdbcTemplate(自定义JDBC)框架

  • 2009年10月08日 14:20
  • 1.45MB
  • 下载

自定义一个jdbc框架

一、数据库连接池:    在一般用JDBC 进行连接数据库进行CRUD操作时,每一次都会:     通过:java.sql.Connection conn = DriverManager....
  • u013850857
  • u013850857
  • 2014年08月15日 19:13
  • 464

JDBC自定义框架

使用元信息结合Java的反射机制,自定义一个JDBC的框架
  • fullStackChenZF
  • fullStackChenZF
  • 2017年06月01日 05:45
  • 217

Java 自定义JDBC类库

import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sq...
  • ACMore_Xiong
  • ACMore_Xiong
  • 2016年05月02日 00:27
  • 1180

Spring学习笔记 Spring JDBC框架

Spring JDBC简介先来看看一个JDBC的例子。我们可以看到为了执行一条SQL语句,我们需要创建连接,创建语句对象,然后执行SQL,然后操纵结果集获取数据。try(Connection conn...
  • u011054333
  • u011054333
  • 2017年01月29日 03:09
  • 894

javaweb之自定义JDBC框架

1. 数据库元数据 DataBaseMetaData元数据 //能查看数据库及产品信息 Connection.getDatabaseMetaData() Resul...
  • z_h_j_
  • z_h_j_
  • 2017年09月03日 14:13
  • 57

自定义JDBC框架(仿DBUtils)

1. 编写DBAssist类  该类简单化了SQL查询(package com.itheima.dbassist; import java.sql.Connection; import java....
  • t12x3456
  • t12x3456
  • 2012年06月01日 22:09
  • 1981

SSM框架之JDBC配置

学习SSM框架那些事儿作者 Wwwwei转载请注明原创出处,谢谢! 前言   之前搭建SSM框架的时候我们曾经配置过jdbc.properties文件,那么这个文件主要是干什么的呢?在本文中会进行相...
  • Wwwwei_csdn
  • Wwwwei_csdn
  • 2017年10月09日 11:57
  • 150
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:自定义JDBC框架
举报原因:
原因补充:

(最多只允许输入30个字)