利用反射机制封装jdbc工具类

1.DB_Utils工具类

package com.sj.utils;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Properties;

import org.junit.Test;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import com.mysql.cj.jdbc.result.ResultSetMetaData;
import com.sj.pojo.User;

public class DB_Utils {
	private static String driver;
	private static String url;
	private static String user;
	private static String password;

	static {
		InputStream in = DB_Utils.class.getResourceAsStream("/db.properties");
		Properties pro = new Properties();

		try {
			pro.load(in);
			driver = pro.getProperty("mysql.driver");
			url = pro.getProperty("mysql.url");
			user = pro.getProperty("mysql.username");
			password = pro.getProperty("mysql.password");

			Class.forName(driver);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public static Connection getCon() throws SQLException, ClassNotFoundException {

		Connection con = DriverManager.getConnection(url, user, password);
		return con;
	}

	public static void close(Connection con, Statement pstmt, ResultSet rs) {
		
		try {
			if (rs != null) {
				rs.close();
				rs = null;
				System.out.println("rs");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			try {
				if (pstmt != null) {
					pstmt.close();
					pstmt = null;
					System.out.println("ps");
				}
			} catch (Exception e2) {
				e2.printStackTrace();
			}
			finally {
				try {
					if (con != null) {
						System.out.println("con");
						con.close();
						con = null;
					}
				} catch (Exception e3) {
					e3.printStackTrace();
				}
			}
		}
	}

	
	
	/** 预处理赋值
	 * @param sql
	 * @param params 预处理?对应的值,必须按顺序存放在params
	 * @param con
	 * @return PreparedStatement
	 * @throws SQLException
	 * @throws ClassNotFoundException
	 */
	public static PreparedStatement prepareSql(String sql,Object[] params, Connection con) throws SQLException, ClassNotFoundException {
	PreparedStatement pstmt = con.prepareStatement(sql);
		if (params != null) {
			for (int i = 0; i < params.length; i++) {
				pstmt.setObject(i + 1, params[i]);
			}
		}
		return pstmt;
	}

	
	/** 单条记录的插入、删除、更新
	 * @param sql
	 * @param params
	 * @param con
	 * @return
	 * @throws SQLException
	 * @throws Exception
	 */
	public static int updateSql(String sql, Object[] params,  Connection con) throws SQLException ,Exception {
		int i = -1;
		PreparedStatement pstmt=null;
		try {
			pstmt = prepareSql(sql, params,con);
			i = pstmt.executeUpdate();
		} catch (SQLException e) {
			throw e;
		} catch (Exception e) {
			throw e;
		}finally {
			close(null, pstmt, null);
		}
	
		return i;
	}

	/**
	 * 根据结果集获取查询结果的别名/id usrname
	 * 
	 * @param rs
	 * @return
	 * @throws SQLException
	 */
	private static String[] getColNames(ResultSet rs) throws SQLException {
		ResultSetMetaData rsmd = (ResultSetMetaData) rs.getMetaData();// 整表属性结果集
		// 获取查询的列数
		int count = rsmd.getColumnCount();
		String[] colNames = new String[count];
		for (int i = 1; i <= count; i++) {
			// 获取查询类的别名
			colNames[i - 1] = rsmd.getColumnLabel(i);
		}
		return colNames;
	}


	/**
	 * 利用Java反射技术将查询结果封装为对象
	 * 必须保证数据库表字段全部是小写,或者首字母大写, id Id
	 * @param sql
	 * @param params
	 * @param clazz
	 * @param con
	 * @return 
	 * @return
	 * @throws SQLException
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public static <T> T queryObjectSql(String sql, Object[] params, Class<T> clazz, Connection con)
			throws SQLException,Exception {
		PreparedStatement pstmt=null;
		Object object = null;
		ResultSet rs=null;
		
		try {
			pstmt = prepareSql(sql, params,con);
			rs = pstmt.executeQuery();
			
			String[] colNames = getColNames(rs);

			while (rs.next()) {
				object = clazz.newInstance();

				for (int i = 0; i < colNames.length; i++) {
					String colName = colNames[i];// 首字母转换成大写 数据库列名与set不同 id setId
					String methodName = "set" + Character.toUpperCase(colName.charAt(0)) + colName.substring(1);

					// 直接根据方法名获取对应的Method对象
					Object value = rs.getObject(colName);
					Method m = clazz.getMethod(methodName, value.getClass());
					if (m != null) {
						m.invoke(object, value);
					}
				}
			}
		
		} catch (SQLException e) {
			throw e;
		} catch (Exception e) {
			throw e;
		}
		finally {
			close(null, pstmt, rs);
		}
		

		return (T)object;
	}


	/**利用Java反射技术将查询结果封装为集合
	 * @param sql
	 * @param params
	 * @param clazz
	 * @param con
	 * @return
	 * @throws SQLException
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public static <T> List<T> queryListSql(String sql, Object[] params, Class<T> clazz,Connection con
			) throws SQLException, Exception  {

		PreparedStatement pstmt=null;
		Object object = null;
		List<T> list=null;
		ResultSet  rs=null;
		try {
			pstmt = prepareSql(sql, params,con);
			rs = pstmt.executeQuery();
			
			String[] colNames = getColNames(rs);

			 list = new ArrayList<T>();

			while (rs.next()) {
				object = clazz.newInstance();

				for (int i = 0; i < colNames.length; i++) {
					String colName = colNames[i];// 首字母转换成大写 数据库列名与set不同 id setId
					String methodName = "set" + Character.toUpperCase(colName.charAt(0)) + colName.substring(1);

					// 直接根据方法名获取对应的Method对象
					Object value = rs.getObject(colName);
					Method m = clazz.getMethod(methodName, value.getClass());
					if (m != null) {
						m.invoke(object, value);
					}
				}
				
				list.add((T) object);

			}
		} catch (SQLException e) {
			throw e;
		} catch (Exception e) {
			throw e;
		}
		finally {
			close(null, pstmt, rs);
		}
		
		return list;
	}


}

 2.测试类

package com.sj.test;

import java.lang.reflect.InvocationTargetException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import org.junit.Test;
import org.w3c.dom.UserDataHandler;

import com.mysql.cj.protocol.Resultset.Concurrency;
import com.sj.pojo.User;
import com.sj.utils.DB_Utils;

public class DBTest {
	private Connection con;
	private PreparedStatement pstmt;
	private ResultSet rs;

	@Test
	public void deleteById() throws Exception {
		String sql = "delete from user where id=?";
		Object[] params = { 2 };
		con = DB_Utils.getCon();
		int i = DB_Utils.updateSql(sql, params, con);
		System.out.println(i);
	}

	@Test
	public void getObject() {
		String sql = "select * from user where id=?";
		Object[] params = { 9 };
		try {
			con = DB_Utils.getCon();
			User u =  DB_Utils.queryObjectSql(sql, params, User.class, con);
			System.out.println(u);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			DB_Utils.close(con, pstmt, rs);
			System.out.println(con);
		}

	}

	@Test
	public void getListObject() {
		String sql = "select * from user";
		Object[] params = null;
		try {
			con = DB_Utils.getCon();
			List<User> u = DB_Utils.queryListSql(sql, params, User.class, con);
			for (User user : u) {
				System.out.println(user);
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			DB_Utils.close(con, pstmt, rs);
		}

	}

	@Test
	public void saveObject() throws Exception {
		String sql = "insert into user (name,money) values(?,?)";
		con = DB_Utils.getCon();
		pstmt = con.prepareStatement(sql);
		for (int i = 0; i < 1; i++) {
			User u = new User("sj" + i, Double.valueOf(i));
			Object[] params = { u.getName(), u.getMoney() };
			int t = DB_Utils.updateSql(sql, params, con);
			System.out.println("success" + (i + 1));

		}

	}
	
	
	


}

猜你喜欢

转载自blog.csdn.net/qq_36472252/article/details/86491064
今日推荐