首页>代码>db与pojo交互java工具类>/1387456327402496.java
package com.wenqier.dao;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
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 java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import com.wenqier.dbcon.DBConnection;

/**
 * 数据库操作Dao层
 * 
 * @author wenqier
 * 
 */
public abstract class Dao {

	protected Connection conn = null;
	protected Statement stmt = null;
	protected PreparedStatement pstmt = null;
	protected ResultSet rs = null;

	public abstract Class getObjectClass();

	/**
	 * 据sql获取数据
	 * 
	 * @param sql
	 * @return data查询结果集
	 */
	public List queryInfoBySql(String sql) {
		// 用于接收返回
		List data = new ArrayList();
		Class cls = this.getObjectClass();

		conn = DBConnection.getConnection();
		try {
			pstmt = conn.prepareStatement(sql);
			rs = pstmt.executeQuery();
			// rs存储结果集类
			ResultSetMetaData rsmd = rs.getMetaData();
			Class rscls = rs.getClass();
			int cols = rsmd.getColumnCount();// rs中数据列数
			while (rs.next()) {
				Object obj = cls.newInstance();
				for (int i = 1; i <= cols; i++) {
					// 据列名拼属性名
					String fieldName = this.underlineToUpper(rsmd
							.getColumnName(i).toLowerCase());
					// 据属性名获得属性对象
					Field field = cls.getDeclaredField(fieldName);
					// 据属性名拼该属性的set方法名
					String setStr = "set"
							+ Character.toUpperCase(fieldName.charAt(0))
							+ fieldName.substring(1);
					// 据set方法名获取set方法对象
					Method setMethod = cls.getDeclaredMethod(setStr,
							field.getType());
					// 据属性类型拼rs的get方法名
					String rsget = "get"
							+ Character.toUpperCase(field.getType()
									.getSimpleName().charAt(0))
							+ field.getType().getSimpleName().substring(1);
					// 据rs的get方法名获取get方法
					Method rsgetMethod = rscls.getDeclaredMethod(rsget,
							int.class);

					setMethod.invoke(obj, rsgetMethod.invoke(rs, i));
				}
				data.add((Object) obj);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (NoSuchFieldException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} finally {
			DBConnection.closeConnStmtRs(conn, pstmt, rs);
		}
		return data;
	}
	
	/**
	 * 向数据库添加数据
	 * 
	 * @param pojo
	 *            传入要添加的对象
	 */
	public void saveInfo(Object obj) {
		Class cls = this.getObjectClass();
		conn = DBConnection.getConnection();
		try {
			pstmt = conn.prepareStatement(this.getSaveSql(obj));
			// 获取pstmt的类对象
			Class pstmtCls = pstmt.getClass();
			// 获取实体类的属性
			Field[] field = this.getObjectClass().getDeclaredFields();
			for (int i = 0; i < field.length; i++) {
				// 获取属性名
				String fieldName = field[i].getName();
				// 获取属性类型名
				String fieldTypeName = field[i].getType().getSimpleName();
				// 拼接get和set方法
				String fieldGetName = "get"
						+ Character.toUpperCase(fieldName.charAt(0))
						+ fieldName.substring(1);
				String pstmtSetName = "set"
						+ Character.toUpperCase(fieldTypeName.charAt(0))
						+ fieldTypeName.substring(1);
				// 获取方法对象
				Method fieldGetMethod = cls.getDeclaredMethod(fieldGetName,
						null);
				Method pstmtSetMethod = pstmtCls.getDeclaredMethod(
						pstmtSetName, int.class, field[i].getType());
				// 调用方法
				pstmtSetMethod.invoke(pstmt, i + 1,
						fieldGetMethod.invoke(obj, null));
			}
			pstmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} finally {
			DBConnection.closeConnPstmt(conn, pstmt);
		}
	}

	/**
	 * 保存多组信息 批处理
	 * 
	 * @param list
	 */
	public void saveListInfo(List list) {
		Class cls = this.getObjectClass();
		conn = DBConnection.getConnection();
		// 获取类中个属性
		Field[] field = cls.getDeclaredFields();
		try {
			pstmt = conn.prepareStatement(this.getSaveSql(cls.newInstance()));
			Class pstmtCls = pstmt.getClass();
			for (int i = 0; i < list.size(); i++) {
				for (int j = 0; j < field.length; j++) {
					// 获取属性名字和类型名
					String fieldName = field[j].getName();
					String fieldTypeName = field[j].getType().getSimpleName();
					// 拼接get和set方法名以便获取相应的方法对象
					String fieldGetName = "get"
							+ Character.toUpperCase(fieldName.charAt(0))
							+ fieldName.substring(1);
					String pstmtSetName = "set"
							+ Character.toUpperCase(fieldTypeName.charAt(0))
							+ fieldTypeName.substring(1);
					// 据get和set的名称获取相应的方法对象
					Method fieldGetMethod = cls.getDeclaredMethod(fieldGetName,
							null);
					Method pstmtSetMethod = pstmtCls.getDeclaredMethod(
							pstmtSetName, int.class, field[j].getType());
					// 调用方法
					pstmtSetMethod.invoke(pstmt, j + 1,
							fieldGetMethod.invoke(list.get(i), null));
				}
				// 加入缓冲池
				pstmt.addBatch();
			}
			// 缓冲池提交
			pstmt.executeBatch();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} finally {
			DBConnection.closeConnPstmt(conn, pstmt);
		}
	}

	/**
	 * 删除数据库数据
	 * 
	 * @param id
	 */
	public void deleteInfo(String sql) {
		this.daoBySql(sql);
	}

	/**
	 * 修改数据库信息
	 * 
	 * @param obj
	 *            传入要修改的对象
	 * @param no
	 */
	public void updateInfo(String sql) {
		this.daoBySql(sql);
	}

	/**
	 * dao层由sql语句访问数据库,注意只可以增删改,返回值为void
	 * 
	 * @param sql
	 */
	public void daoBySql(String sql) {
		conn = DBConnection.getConnection();
		try {
			stmt = conn.createStatement();
			stmt.executeUpdate(sql);
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DBConnection.closeConnStmt(conn, stmt);
		}
	}

	/**
	 * 把第二个单词首字母大写字符串转换为以下划线分隔各单词字符串
	 * 
	 * @param 第二个单词首字母大写的字符串upper
	 * @return 下划线字符串
	 */
	private String upperToUnderline(String upper) {
		StringBuffer buff = new StringBuffer();
		buff.append(Character.toLowerCase(upper.charAt(0)));
		for (int i = 1; i < upper.length(); i++) {
			char c = upper.charAt(i);
			// 判断是否为大写,true需要buff加“_”后,字母小写加在buff后,false直接加在buff后
			if (Character.isUpperCase(c)) {
				buff.append("_" + Character.toLowerCase(c));
			} else {
				buff.append(c);
			}
		}
		return buff.toString();
	}

	/**
	 * 把下滑线的字符串转换为第二单词首字母大写的字符串
	 * 
	 * @param underline
	 * @return 第二单词大写的字符串
	 */
	private String underlineToUpper(String underline) {
		// 据”_“拆分列名
		String[] st = underline.split("_");
		StringBuffer sb = new StringBuffer();
		sb.append(st[0]);
		for (int i = 1; i < st.length; i++) {
			sb.append(Character.toUpperCase(st[i].charAt(0))).append(
					st[i].substring(1));
		}
		return sb.toString();
	}

	/**
	 * 获取保存数据的sql语句
	 * 
	 * @param obj
	 *            保存的对象
	 * @return 数据库保存数据的sql
	 */
	protected String getSaveSql(Object obj) {
		Class cls = this.getObjectClass();
		Field[] fields = cls.getDeclaredFields();
		StringBuffer sb = new StringBuffer();
		sb.append("insert into " + this.upperToUnderline(cls.getSimpleName())
				+ " values(");
		for (int i = 0; i < fields.length; i++) {
			sb.append("?,");
		}
		sb.delete(sb.length() - 1, sb.length());
		sb.append(")");
		return sb.toString();
	}

}
最近下载更多
1358849392  LV21 2022年11月11日
dongzhan  LV12 2020年12月9日
情绪在北方  LV7 2018年9月7日
yt_mf1  LV9 2014年12月23日
lalalalala  LV13 2014年12月3日
annoby  LV23 2014年3月23日
Space  LV29 2014年1月22日
最代码官方  LV168 2013年7月11日
菜鸟战斗  LV23 2013年7月11日
矿泉水  LV30 2013年7月11日
最近浏览更多
1358849392  LV21 2022年11月11日
crosa_Don  LV18 2022年3月31日
Killah  LV9 2021年4月16日
kinggode  LV14 2020年7月28日
hfk2020  LV2 2020年5月22日
jaonsang  LV25 2019年11月3日
c_bacel  LV1 2019年8月6日
SevenLover  LV3 2019年7月22日
dongzhan  LV12 2019年5月6日
mixiansheng  LV6 2018年10月23日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友