Java学习总结——JDBC工具类

import java.io.InputStream;
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.sql.Statement;
import java.sql.Types;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 封装DBUtil的目的(1,简化jdbc操作的流程。2保证所有的资源能够正常释放)
 * 
 * @author suicy
 *
 */
public class DBUtil {

	private static final String URL = "jdbc:mysql://localhost:3306/tf63?characterEncoding=UTF8";
	private static final String USERNAME = "root";
	private static final String PASSWORD = "root";

	private DBUtil() {

	}

	/**
	 * 注册驱动 static 只执行一次即可
	 */
	static {
		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.exit(0);
		}
	}

	/**
	 * 数据更新方法可执行insert,update,delete语句
	 * 
	 * @param sql
	 *            SQL语句
	 * @param params
	 *            动态参数
	 * @return Integer 影响的行数
	 * @throws SQLException
	 */
	public static int update(String sql, Object... params) throws SQLException {
		Connection conn = null;
		PreparedStatement pstmt = null;
		try {
			conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
			pstmt = conn.prepareStatement(sql);
			if (params != null) {
				for (int i = 0; i < params.length; i++) {
					if(params[i] instanceof InputStream){
						pstmt.setBinaryStream(i + 1, (InputStream)params[i]);
					}else{
						pstmt.setObject(i + 1, params[i]);
					}
				}
			}
			return pstmt.executeUpdate();
		} finally {
			closeAll(null, pstmt, conn);
		}
	}

	/**
	 * 执行查询的方法
	 * @param sql Select语句
	 * @param params 查询语句动态参数
	 * @return List<Map<String, Object>> 查询结果List<Map<ColunmLabel, ColunmValue>>
	 * @throws SQLException
	 */
	public static List<Map<String, Object>> query(String sql, Object... params) throws SQLException {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet res = null;
		try {
			conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
			pstmt = conn.prepareStatement(sql);
			if (params != null) {
				for (int i = 0; i < params.length; i++) {
					pstmt.setObject(i + 1, params[i]);
				}
			}
			res = pstmt.executeQuery();
			//获取结果集元数据 包含结果集列数,每列类型、标题、字段名称等信息
			ResultSetMetaData rsmd = res.getMetaData();
			List<Map<String, Object>> data = new ArrayList<>();
			int columnCount = rsmd.getColumnCount();//获取结果集列数
			while (res.next()) {
				//每执行一次while循环 证明查询到一条数据 所以创建一个map对象
				Map<String, Object> rowData = new HashMap<>();
				for (int i = 1; i <=columnCount; i++) {
					//字段名称为key,字段值为value
					if(rsmd.getColumnType(i)==Types.LONGVARBINARY){
						rowData.put(rsmd.getColumnLabel(i), res.getBinaryStream(i));
					}else{
						rowData.put(rsmd.getColumnLabel(i), res.getObject(i));
					}
					
				}
				data.add(rowData);
			}
			return data;
		} finally {
			closeAll(res, pstmt, conn);
		}
	}

	private static void closeAll(ResultSet res, Statement stmt, Connection conn) throws SQLException {
		try {
			if (res != null) {
				res.close();
			}
		} catch (SQLException e) {
			throw e;
		}

		try {
			if (stmt != null) {
				stmt.close();
			}
		} catch (SQLException e) {
			throw e;
		}

		try {
			if (conn != null) {
				conn.close();
			}
		} catch (SQLException e) {
			throw e;
		}
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_41577923/article/details/82965278