大体步骤:
1.加载Jdbc驱动(Class.forName("com.mysql.jdbc.Driver");)
2.创建Jdbc连接(conn = DriverManager.getConnection("","","");)
3.创建statement(

statement=conn.prepareStatemnet(sql);
statement.setObject(i,objects[i-1]);

)
4.执行增删改 或 执行查询操作。
5.增删改返回boolean值,判断是否操作成功。
6.查询操作可分为 返回一条数据,或返回多条数据。
7.释放资源。

代码示例:

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.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Jdbc {
    private Connection        conn;      // 加载数据库驱动后,进行数据库连接
    private PreparedStatement statement; // 连接之后构建sql语句,并执行
    private ResultSet         resultSet; // 结果集,执行sql语句后,返回的结果

    private static Jdbc       instance;

    // 私有构造,记载jdbc驱动
    private Jdbc() {
        try {
            Class.forName("com.mysql.jdbc.Driver");// 加载jdbc驱动
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    // 单例模式
    public static Jdbc getInstance() {
        if (instance == null) {
            instance = new Jdbc();
        }
        return instance;
    }

    // 创建jdbc连接
    private void createConnection() {
        try {
            if (conn == null || conn.isClosed()) {
                // Gsonadmin:工程名, root:数据库账号密码
                conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/Gsonadmin", "root", "root");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    // 创建statement
    private void createStatement(String sql, Object... objects) throws SQLException {
        this.createConnection();
        /** * 可以通过调用 Connection 对象的 preparedStatement() 方法获取 PreparedStatement 对象 * PreparedStatement 接口是 Statement 的子接口,它表示一条预编译过的 SQL 语句 * PreparedStatement 对象所代表的 SQL 语句中的参数用问号(?)来表示 */
        statement = conn.prepareStatement(sql);
        // 统一绑定参数
        if (objects != null && objects.length > 0) {
            for (int i = 1; i <= objects.length; i++) {
                // 第一个参数是要设置的 SQL 语句中的参数的索引(从 1 开始),第二个是设置的 SQL 语句中的参数的值.
                statement.setObject(i, objects[i - 1]);
            }
        }

    }

    /** * 执行所有增、删、改的sql操作 * * @throws SQLException */
    public boolean executeUpdate(String sql, Object... objects) throws SQLException {
        boolean flag = false;
        try {
            this.createStatement(sql, objects);
            flag = statement.executeUpdate() > 0;
        } finally {
            // 释放资源
            this.release();
        }

        return flag;
    }

    /** * 返回一条记录的sql * * @throws SQLException */
    public Map<String, Object> executeQuery(String sql, Object... objects) throws SQLException {
        Map<String, Object> row = null;
        try {
            this.createStatement(sql, objects); // 创建statement
            resultSet = statement.executeQuery(); // 执行query操作,返回结果赋给resultSet
            // 遍历resultSet
            if (resultSet.next()) {
                row = new HashMap<>();
                ResultSetMetaData meta = resultSet.getMetaData(); // 得到结果集的结构信息,比如字段数、字段名等。
                for (int i = 1; i < meta.getColumnCount(); i++) { // 得到结果集的列数
                    String lable = meta.getColumnLabel(i); // 得到每列的字段名
                    row.put(lable, resultSet.getObject(lable));
                }
            }
        } finally {
            this.release();
        }
        return row;
    }

    /** * 返回多条记录的sql * * @throws SQLException */
    public List<Map<String, Object>> executeQueryForList(String sql, Object... objects) throws SQLException {
        List<Map<String, Object>> rows = null;
        try {
            this.createStatement(sql, objects); // 创建statement
            resultSet = statement.executeQuery(); // 执行query操作,返回结果赋给resultSet
            rows = new ArrayList<>();
            Map<String, Object> row;
            // 遍历resultSet
            while (resultSet.next()) {
                row = new HashMap<>();
                ResultSetMetaData meta = resultSet.getMetaData(); // 得到结果集的结构信息,比如字段数、字段名等。
                for (int i = 1; i < meta.getColumnCount(); i++) { // 得到结果集的列数
                    String lable = meta.getColumnLabel(i); // 得到每列的字段名
                    row.put(lable, resultSet.getObject(lable));
                }
                rows.add(row);
            }
        } finally {
            this.release();
        }
        return rows;
    }

    /** * 释放资源 */
    private void release() {
        try {
            if (resultSet != null) {
                resultSet.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            if (statement != null) {
                statement.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            if (conn != null) {
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

关键:反射+泛型。