`
qiangshao
  • 浏览: 11253 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类

今天,在百度知道 ,一位网友问到jdbc代码简化,今天花了2个小时间给他写了个。。

阅读更多
代码如下:
用法是:传入一个类名 ,sql语句,参数是可变的
package org.ywq.common.utils;

import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.ywq.entity.User;

/**
 * @author ai5qiangshao E-mail:ai5qiangshao@163.com
 * @version 创建时间:Aug 22, 2009 5:44:43 PM
 * @Package org.ywq.common.utils
 * @Description 类说明
 */
public class DBUtis<T> {

	private PreparedStatement psmt;

	private Connection conn;

	public DBUtis() {
		this.getConnection();
	}

	public Connection getConnection() {
		Connection conn = null;
		String className = "com.mysql.jdbc.Driver";
		String url = "jdbc:mysql://localhost:3306/hibernate";
		try {
			Class.forName(className);
			conn = DriverManager.getConnection(url, "root", "root");

		} catch (Exception e) {
			e.printStackTrace();
		}

		return conn;
	}

	public static void main(String[] args) throws Exception {
		DBUtis<User> db = new DBUtis<User>();
		List<User> usList = db.executeQuery(User.class,
				"select * from user limit 10");
		for (User user : usList) {
			 System.out.println(user.getUname());
		}

		DBUtis<User> db2 = new DBUtis<User>();
		User u = db2.executeQueryByPk(User.class,
				"select * from user where uid=?", 33);
		System.out.println(u.getUname());

	}

	public List<T> executeQuery(Class<T> clazz, String sql, Object... params) {
		List<T> list = new ArrayList<T>();
		ResultSet rs = null;
		try {
			this.preparedStatement(sql, params);
			rs = this.psmt.executeQuery();
			while (rs.next()) {
				ResultSetMetaData table = rs.getMetaData();
				T o = clazz.newInstance();
				invokeSetter(clazz, rs, table, o);
				list.add(o);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			close(rs);
		}
		return list;
	}

	/***************************************************************************
	 * 根据主键查询
	 * 
	 * @param clazz
	 * @param sql
	 * @param params
	 *            查询参数
	 * @return
	 */
	public T executeQueryByPk(Class<T> clazz, String sql, Object... params) {
		T o = null;
		ResultSet rs = null;
		try {
			this.preparedStatement(sql, params);
			rs = this.psmt.executeQuery();
			o = null;
			if (rs.next()) {
				ResultSetMetaData table = rs.getMetaData();
				o = clazz.newInstance();
				invokeSetter(clazz, rs, table, o);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			this.close(rs);
		}
		return o;
	}

	public Integer exucuteUpdate(String sql, Object... params) {
		Integer result = 0;
		try {
			this.preparedStatement(sql, params);
			result = this.psmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			this.close();
		}
		return result;
	}

	private void close(ResultSet rs) {
		try {
			if (rs != null)
				rs.close();
			if (this.psmt != null)
				psmt.close();
			if (this.conn != null)
				conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	private void close() {
		this.close(null);
	}

	private void preparedStatement(String sql, Object... params)
			throws SQLException {
		this.psmt = this.getConnection().prepareStatement(sql);
		setParams(params);
	}

	private void setParams(Object[] params) throws SQLException {
		if (params != null) {
			for (int i = 0; i < params.length; i++) {
				this.psmt.setObject(i + 1, params[i]);
			}
		}
	}

	/***************************************************************************
	 * 核心代码
	 * 
	 * @param clazz
	 * @param rs
	 * @param table
	 *            //表结构
	 * @param o
	 * @throws Exception
	 */
	private void invokeSetter(Class<?> clazz, ResultSet rs,
			ResultSetMetaData table, Object o) throws Exception {
		for (int i = 0; i < table.getColumnCount(); i++) {
			String column = table.getColumnName(i + 1);
			String setter = "set" + column.substring(0, 1).toUpperCase()
					+ column.substring(1);
			String getter = "get" + column.substring(0, 1).toUpperCase()
					+ column.substring(1);
			Method getterM = clazz.getDeclaredMethod(getter);
			Method setterM = clazz.getDeclaredMethod(setter,
					new Class[] { getterM.getReturnType() });
			setterM.invoke(o, rs.getObject(column));
		}
	}

}

分享到:
评论
3 楼 qiangshao 2009-08-23  
javazeke 写道
JDBC的简化代码,我前几个月也写过,和楼主的大同小异,同样我也是用的reflect,不过我的方式除了模型的字段和表的列名要相同。反射的需要。


这个方式 效率有点问题。。
2 楼 javazeke 2009-08-22  
JDBC的简化代码,我前几个月也写过,和楼主的大同小异,同样我也是用的reflect,不过我的方式除了模型的字段和表的列名要相同。反射的需要。
1 楼 qiangshao 2009-08-22  
忘了一点 :实体类基本数据类型必须是包装类

相关推荐

Global site tag (gtag.js) - Google Analytics