手写JDBC工具类 实现数据库增删改查操作

废话不都说,直接上源码:

代码中实现了以下方法:

方法名 实现功能
getConnection 获取数据库连接
executeUpdate 增删改通用方法
queryForList 根据查询结果返回List 类型
queryForMap 根据查询结果返回Map类型
queryForBean 根据查询结果映射成对象
queryForBeanList 根据查询结果映射成多个对象
close 统一关闭数据库资源
package untils;

import java.lang.reflect.Field;
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.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * JDBC工具类
 */
public class HgJdbcUtils {
    //加载驱动
    static {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    //获得连接
    public static Connection getConnection(){
        try {
            DriverManager.getConnection("jdbc:mysql://localhost:3306/qy97?characterEnconding=utf-8","root","root");
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
    /** 增删改的通用方法
     * @param String sql  要执行的sql
     * @param Object[] obj    对象类型的数组  里面存放着 sql执行的占位符参数
     *              【name,age,id】
     *                【id】
     *               【name,age】
     *         Object... 可变参数
     * */
    public static boolean executeUpdate(String sql,Object... args){
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            conn = getConnection();
            ps = conn.prepareStatement(sql);
            //有参数
            for(int i=0;i0;
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            //关闭资源
            close(conn,ps,null);
        }
        return false;
    }
    /**
     *  查询的通用方法
     * @param sql;
     * @param args;
     * @return
     * */
    public static List> queryForList(String sql,Object... args){
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            conn = getConnection();
            ps = conn.prepareStatement(sql);
            //有可能有参数
            for(int i=0;i> list = new ArrayList<>();
            //获取本次查询结果集有多少列
            int count = rs.getMetaData().getColumnCount();
            //while循环
            while(rs.next()){
                //创建Map集合   获取一个数据封装成一个Map集合
                Map map = new HashMap<>();
                //for循环  遍历所有的列
                for(int i=0;i queryForMap(String sql,Object... args){
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            conn = getConnection();
            ps = conn.prepareStatement(sql);
            //有可能有参数
            for(int i=0;i map = new HashMap<>();
            //获取本次查询结果集有多少列
            int count = rs.getMetaData().getColumnCount();
            if(count>1) {
            	throw new RuntimeException("the query result is greater than one column");
            }
            //while循环
            while(rs.next()){
                //获取本次查询结果集的列名
                String name = rs.getMetaData().getColumnLabel(1);
                map.put(name,rs.getObject(name));
            }
            //返回值
            return map;
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            //关闭资源
            close(conn,ps,rs);
        }
        return null;
    }
    
    
    /**
	 * @Function commonQueryOne
	 * @Description 查找单条记录
	 * @param sql 执行的SQL语句
	 * @param cls 实体类对象
	 * @param objects SQL语句中的限制条件
	 */
	public static  E queryForBean(String sql, Class cls, Object...args) {
	    Connection conn = getConnection();
        PreparedStatement ps = null;
        ResultSet rs = null;
		E entity = null;
		try {
			ps = conn.prepareStatement(sql);
			if(args != null && args.length > 0) {
				for(int i = 0; i < args.length; i++) {
					ps.setObject(i+1, args[i]);
				}
			}
			//获取结果集
			rs = ps.executeQuery();  
			
			/**
			 * 以下通过数据库表中字段去查找实体类中的属性名
			 */
			//获取结果集中对象的数量、列名等
			ResultSetMetaData rsmd = rs.getMetaData();  
			//获取字段数
			int columnCount = rsmd.getColumnCount();  
			while(rs.next()) {
				//ͨ通过反射获取实体类对象
				entity = cls.newInstance();  
				for(int i = 0; i < columnCount; i++) {
					//获取字段名称
					String columnName = rsmd.getColumnName(i+1); 
					//获取该字段对应的值ֵ
					Object columnValue = rs.getObject(columnName);  
					//通过字段名获取属性,try{名称不匹配}catch{到配置文件查找对应属性名}
					Field field = null;
					try{
						field = cls.getDeclaredField(columnName); 
					}catch (Exception e){
						throw new RuntimeException("The column name does not match the field name");
					}
					//将私有属性非可访问设置为可访问
					field.setAccessible(true);  
					//给实体类中的属性赋值ֵ
					field.set(entity, columnValue);  
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			 close(conn,ps,rs);
		}
		return entity;
	}
	
	
	//selectAll
		/**
		 * @Function commonQueryList
		 * @Description 查找多条记录
		 * @param sql 执行的SQL语句
		 * @param cls 实体类对象
		 * @param objects SQL语句中的限制条件
		 */
		public static  List queryForBeanList(String sql,  Class cls, Object...objects) {
		    Connection conn = getConnection();
	        PreparedStatement ps = null;
	        ResultSet rs = null;
			E entity = null;
			List list = new ArrayList();
			try {
				ps = conn.prepareStatement(sql);
				if(objects != null && objects.length > 0) {
					for(int i = 0; i < objects.length; i++) {
						ps.setObject(i+1, objects[i]);
					}
				}
				rs = ps.executeQuery();  
				
				ResultSetMetaData rsmd = rs.getMetaData();
				int columnCount = rsmd.getColumnCount();
				while(rs.next()) {
					entity = cls.newInstance();
					for(int i = 0; i < columnCount; i++) {
						String columnName = rsmd.getColumnName(i+1);
						Object columnValue = rs.getObject(columnName);
						//通过字段名获取属性,try{名称不匹配}catch{到配置文件查找对应名称}
						Field field = null;
						try{
							field = cls.getDeclaredField(columnName); 
						}catch (Exception e){
							throw new RuntimeException("The column name does not match the field name");
						}
						field.setAccessible(true);
						field.set(entity, columnValue);
					}
					list.add(entity);
				}
			} catch (SQLException e) {
				e.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				 close(conn,ps,rs);
			}
			return list;
		}
	
    
    
    /**
     *  关闭资源的通用方法
     * */
    public static void close(Connection conn,Statement stat,ResultSet rs){
        try{
            if(rs!=null){
                rs.close();
            }
            if(stat!=null){
                stat.close();
            }
            if(conn!=null){
                conn.close();
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

你可能感兴趣的:(数据库)