自定义dbutils

使用jdbc访问数据库,每次建立连接,连接完成进行相应的操作后就对其进行关闭操作。每次访问都需建立对数据库的连接,很耗资源。就像刚建好一栋房子,进去住了几天,就把它拆了重新建立,虽然可以建立,但耗很大资源。为了防止这样的事情发生,于是数据库连接池产生了。

建立数据库连接池是由第三方提供的jar包,C3P0或者DBCP的jar包都可以。

本人使用C3P0jar包自己做了一个C3P0Utils工具类,代码如下:

package com.itheima.utils;

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

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;


public class C3P0Utils {

	private static DataSource ds=new ComboPooledDataSource();
	
	/**
	 * 获取数据库连接
	 * @return 返回Connection
	 * @throws SQLException
	 */
	public static Connection getConnection() throws SQLException{
		return ds.getConnection();
	}
	/**
	 * 获取数据源
	 * @return
	 */
	public static DataSource getDataSource(){
		return ds;
	}
	
	/**
	 * 关闭数据库
	 */
	public static void close(ResultSet rs,Statement ps,Connection con){
		if(rs!=null){
			try {
				rs.close();
				rs=null;
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if(ps!=null){
			try {
				ps.close();
				ps=null;
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if(con!=null){
			try {
				con.close();
				con=null;
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
	
}

有了C3P0Utls工具类,自定义自己的dbutils就方便多了。

首先,在对数据库进行操作时,主要有增删改查,其中,增删改用一个方法update封装就搞定,查询涉及到把数据封装到bean中,也可以用一个方法query搞定。

具体代码如下:


package com.itheima.utils;

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

import javax.sql.DataSource;

import com.itheima.dao.ResultSetHandler;

public class DbUtils {

 private static DataSource ds=null;

 public DbUtils(DataSource ds) {
  super();
  this.ds = ds;
 }
 /**
  * 对数据库进行增删改操作
  * @param sql SQL语句
  * @param params 传入的问号对应的参数
  */
 public static void executeUpdate(String sql,Object...params){
  Connection con=null;
  PreparedStatement ps=null;
  try {
   con=ds.getConnection();
   ps=con.prepareStatement(sql);
   ParameterMetaData pmd=ps.getParameterMetaData();
   int count=pmd.getParameterCount();
   if(count>0){
    if(params==null||params.length==0){
     //参数为空或者为null,都不能匹配需要传入的问号个数,则抛出异常
     throw new IllegalArgumentException("参数不能为null或者空");
    }else if(params.length!=count){
     System.out.println(count+"=="+params.length);
     //参数的长度不匹配问号个数,也要抛出异常
     throw new IllegalArgumentException("参数不匹配");
    }
    for(int i=0;i0){
    if(params==null||params.length==0){
     //参数为空或者为null,都不能匹配需要传入的问号个数,则抛出异常
     throw new IllegalArgumentException("参数不能为null或者空");
    }else if(params.length!=count){
     System.out.println(count+"=="+params.length);
     //参数的长度不匹配问号个数,也要抛出异常
     throw new IllegalArgumentException("参数个数不匹配");
    }
    for(int i=0;i


3.写一个接口

package com.itheima.dao;

import java.sql.ResultSet;

public interface ResultSetHandler {

	Object handler(ResultSet rs);
}


 

4.写几个实现类

1.

package com.itheima.dao.impl;

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

import com.itheima.dao.ResultSetHandler;
/**
 * 自定义封装数据库查询的结果集
 * @author Administrator
 *
 */
public class BeanHeadler implements ResultSetHandler {

	private Class clazz;
	public BeanHeadler(Class clazz){
		this.clazz=clazz;
	}
	public Object handler(ResultSet rs) {
		//定义Object对象
		Object obj=null;
		//分而治之,将rs中的结果集封装到obj对象中
		try {
			if(rs.next()){
				obj=clazz.newInstance();
				//获取结果集元数据
				ResultSetMetaData rsmd=rs.getMetaData();
				int count=rsmd.getColumnCount();
				for(int i=0;i


2.

package com.itheima.dao.impl;

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

import com.itheima.dao.ResultSetHandler;

public class BeanListHeadler implements ResultSetHandler {

 private Class clazz;
 public BeanListHeadler(Class clazz){
  this.clazz=clazz;
 }
 @Override
 public Object handler(ResultSet rs) {
  List list=new ArrayList();
  try {
   ResultSetMetaData rsmd=rs.getMetaData();
   int count=rsmd.getColumnCount();
   while(rs.next()){
    Object obj=clazz.newInstance();
    //获取结果集元数据
    for(int i=0;i


通过以上几个步骤,一个简单的mydbutils大功告成,可以使用其灵活的对数据库进行增删改查了

 

你可能感兴趣的:(自定义mydbutils)