Java数据库简单增删查改通用类(二)

在后来的开发中,发现了以前的那个类还是有点不足之处,比如不好控制数据的commit方式(false/true),该类是将数据库连接对象传入到该增删查改通用类中,其优点在于提交方式可以在外面控制,新增返回结果集方法(ResultSet)。

DBHelper类:

package org.tips.dao;

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

public class DBHelper {

	private Connection conn = null;

	public DBHelper(Connection conn) {
		this.conn = conn;
	}

	public <T> List<T> findBySql(String sql, List<String> params, Class<T> c)
			throws Exception {
		List<T> list = new ArrayList<T>();
		// 取出c的这个对象中有多少个方法
		Method[] ms = c.getMethods();

		PreparedStatement ps = conn.prepareStatement(sql);
		this.doParams(ps, params);
		ResultSet rs = ps.executeQuery();
		// 得到db中的表的列
		ResultSetMetaData rsmd = rs.getMetaData();
		// 存储全部的列名
		String[] columnname = new String[rsmd.getColumnCount()];
		for (int i = 0; i < columnname.length; i++) {
			columnname[i] = rsmd.getColumnName(i + 1);
		}
		// id=> "set"+"I"+d=> "setId()" =>对应数据库表的字段
		while (rs.next()) {
			// new对象
			T t = c.newInstance(); // Topic t=new Topic();
			// t.setId(rs.getInt("id"));
			for (int i = 0; i < columnname.length; i++) {
				String cn = columnname[i]; // id title contents
				cn = "set" + cn.substring(0, 1).toUpperCase()
						+ cn.substring(1).toLowerCase(); // "setId"
				for (Method m : ms) {
					if (m.getName().equals(cn)) {
						if (rs.getObject(columnname[i]) != null) {
							if ("java.sql.Timestamp".equals(rs
									.getObject(columnname[i]).getClass()
									.getName())) {
								m.invoke(t, rs.getString(columnname[i]));
							} else if ("java.math.BigDecimal".equals(rs
									.getObject(columnname[i]).getClass()
									.getName())) {
								m.invoke(t, rs.getBigDecimal(columnname[i]));
							} else if ("java.sql.Date".equals(rs
									.getObject(columnname[i]).getClass()
									.getName())) {
								m.invoke(t, rs.getDate(columnname[i]));
							} else {
								m.invoke(t, rs.getObject(columnname[i]));
							}
						} else {
							m.invoke(t, rs.getObject(columnname[i]));
						}
						break;
					}
				}

			}
			list.add(t);
		}

		return list;
	}

	// insert into xx values(?,?); params={"tip","whx"};
	public <T> int doUpdate(String sql, List<T> params) throws SQLException {

		int i = 0;
		PreparedStatement ps = conn.prepareStatement(sql);
		doParams(ps, params);
		i = ps.executeUpdate();

		return i;
	}

	// 设置预编译对象参数
	public <T> void doParams(PreparedStatement pstmt, List<T> params)
			throws SQLException {
		if (pstmt != null && params != null && params.size() > 0) {
			for (int i = 0; i < params.size(); i++) {
				if (params.get(i) != null) {
					if (params.get(i).getClass().getName()
							.equals("java.lang.String")) {
						pstmt.setString(i + 1, (String) params.get(i));
					} else if (params.get(i).getClass().getName()
							.equals("java.math.BigDecimal")) {
						pstmt.setBigDecimal(i + 1, (BigDecimal) params.get(i));
					} else if (params.get(i).getClass().getName()
							.equals("java.sql.Timestamp")) {
						pstmt.setString(i + 1, (String) params.get(i));
					} else {
						pstmt.setObject(i + 1, params.get(i));
					}
				} else {
					pstmt.setString(i + 1, "");
				}

			}
		}
	}
	
	/**
	 * 
	 * @param sql
	 * @param params
	 * @return 数据集
	 * @throws SQLException
	 */
	public ResultSet RsBySql(String sql, List<String> params) throws SQLException{
		PreparedStatement ps = conn.prepareStatement(sql);
		this.doParams(ps, params);
		ResultSet rs = ps.executeQuery();
		return rs;
	}
}

实例化的时候将数据库连接对象传入。

 

 

----

---

 

你可能感兴趣的:(java,数据库增删查改)