Jdbc封装(MySql)

大体步骤:
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();
        }
    }
}

关键:反射+泛型。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值