MySql8.0的JDBC封装类

Java连接mysql8.0封装类

开发这个封装类的目的:有部分新学习的小伙伴对java连接mysql的不熟悉,同时又有部分朋友想体验开箱即用的快感,特此设计了这个封装类。提供调用的接口,封闭内部连接结构。代码粗糙,仅供参考。
GitHub地址:https://github.com/nicesiri4268/MySQLConnection

MySQL8.0的JDBC简介

新的MySQL8.0使用的JDBC需要在com.mysql.cj.jdbc.Driver中导入,驱动下载地址:菜鸟教程MySQLConnection/J 8.0 jar包下载
在java中载入jdbc的语句

Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test_demo?useSSL=false&serverTimezone=UTC","root","password");

驱动连接信息类

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class MysqlMessage {
    private String DBName = "";
    private String DBUser = "";
    private String DBUserserPasswd = "";
    private String connName = "";
    private String allMessage = "";
    private Connection connection = null;


    public MysqlMessage(String DBName, String DBUser, String DBUserserPasswd) {
        /*
        * 对类进行初始化操作
        * DBName 数据库名称,具体看你的数据库设置名
        * DBUser 数据库用户名称
        * DBUserPasswd 数据库用户密码
        * */
        super();
        this.DBName = DBName;
        this.DBUser = DBUser;
        this.DBUserserPasswd = DBUserserPasswd;//为了安全这里可以更改
        this.connName = getConnName();
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            this.connection = DriverManager.getConnection(this.connName,
                    this.DBUser,
                    this.DBUserserPasswd);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            System.out.println("无法找到类名");
        } catch (SQLException throwable) {
            throwable.printStackTrace();
            //希望下一步可以把异常放置到一个dialog文件里面
            System.out.println("数据库连接失败");
        }
    }

    public MysqlMessage() {
        super();
    }

    //为了重设连接名字需要更改时使用
    public void setDBName(String DBName) {
        this.DBName = DBName;
    }

    public void setDBUser(String DBUser) {
        this.DBUser = DBUser;
    }

    public void setDBUserserPasswd(String DBUserserPasswd) {
        this.DBUserserPasswd = DBUserserPasswd;
    }

    private String getConnName() {
        return "jdbc:mysql://localhost:3306/" + DBName + "?useSSL=false&serverTimezone=UTC";
    }

    public Connection getConnection() {
        return connection;
    }

    public String getAllMessage() {
        allMessage = "数据库名称:" + this.DBName + "/n用户名:" + this.DBUser + "JDBC连接:" + this.connName;
        return allMessage;
    }
}

使用Connection创建PrepareStatement对象预编译SQL

import com.Mysql.Exception.MysqlConnectException;

import java.sql.*;

public class MysqlConnect {
    private Connection connection;
    private PreparedStatement preparedStatement = null;
    private ResultSet resultSet = null;
    private int resultCounts = -1;
    /*
     * 使用MySQLMessage产生的Connection对象,
     * 创建PrepareStatement对象
     * 预编译SQL
     * 对SQL赋值:columnsType数组(int),values数组(String)
     * 使用方法getResultType(), 返回一个ResultType类(封装Result和ResultCount属性)
     * */

    public MysqlConnect(MysqlMessage mysqlMessage) {
        connection = mysqlMessage.getConnection();//从mysqlMessage获取连接
    }

    public String setPstmtParam(String SQL, int[] columnsType, String[] values) {
        /*
         * 预编译命令SQL
         * 需要提供一个int类型的类型标识数组,和一个String类型的值数组
         * Types.Integer 为类型标识数组的值
         * 结果集放置在MySQLConnection类中,调用getResultType获取
         * 返回值为String类型,当执行成功时返回”执行成功“
         * 同时有可能出现的错误有,SQL为空,SQL预编译失败,SQL
         */

        if (SQL == null) return "SQL为空";
        try {
            preparedStatement = connection.prepareStatement(SQL);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
            return "预编译失败";
        }
        if (columnsType != null && values != null && columnsType.length == values.length) {
            //分类填入预编译类中
            for (int i = 0; i < columnsType.length; i++) {
                try {
                    switchColumnsType(columnsType, values, i);//预编译后的赋值
                } catch (SQLException throwable) {
                    throwable.printStackTrace();
                    return "第" + i + "个赋值失败";
                } catch (MysqlConnectException throwable) {
                    throwable.printStackTrace();
                    return "赋值失败" + "编号" + i;
                }
            }
        } else if (columnsType == null && values == null) {
            System.out.print("");
            //允许类型数组或者值数组为空
        } else {
            return "类型数组或值数组出现错误";
        }

        try {
            //开始执行SQL预编译命令,并且保存结果集到resultSet
            if (preparedStatement.execute()) {
                //execute()返回的是一个boolean值,代表两种不同的操作啊
                // getResultSet()返回的是结果集,而getUpdateCount()返回的是更新的记数
                resultSet = preparedStatement.executeQuery();
            } else {
                resultCounts = preparedStatement.getUpdateCount();//插入或修改操作
            }

        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return "预编译成功";
    }

    /**
     * @param columns 参数1 int数组存储着有关value的类型
     * @param values  参数2 String数组 存储着预编译后的要赋的值
     * @param i       参数3 循环的次数
     * @apiNote 可以添加Type.的分支以适应更多类型
     */
    private void switchColumnsType(int[] columns, String[] values, int i) throws SQLException {
        switch (columns[i]) {
            case Types.INTEGER: {
                preparedStatement.setInt(i + 1, Integer.parseInt(values[i]));
                break;
            }
            case Types.SMALLINT:{
                preparedStatement.setShort(i+1,Short.parseShort(values[i]));
                break;
            }
            case Types.FLOAT: {
                preparedStatement.setFloat(i + 1, Float.parseFloat(values[i]));
                break;
            }
            case Types.DOUBLE: {
                preparedStatement.setDouble(i + 1, Double.parseDouble(values[i]));
                break;
            }
            case Types.VARCHAR:
            case Types.CHAR: {
                preparedStatement.setString(i + 1, values[i]);
                break;
            }
            default: {
                throw new MysqlConnectException("第" + (i + 1) + "个参数出现问题");
            }
            //可自行添加输入项
        }
    }

    public PreparedStatement getPreparedStatement() {
        if (preparedStatement != null) {
            return preparedStatement;
        } else {
            return null;
        }
    }

    public ResultType getResultType() {
        //返回sql语句结果集
        if (resultSet != null) {
            return new ResultType(resultSet);
        } else if (resultCounts >= 0) {
            return new ResultType(resultCounts);
        } else {
            return null;
        }
    }

    public boolean close() {
        try {
            if (resultSet != null) {
                resultSet.close();
            }
            if (preparedStatement != null) {
                preparedStatement.close();
            }
            if (connection != null) {
                connection.close();
            }
        } catch (SQLException throwables) {
            System.out.println("关闭数据库失败");
            throwables.printStackTrace();
        }
        return false;
    }
}

连接异常类

public class MysqlConnectException extends RuntimeException {
    /**
     * @program: MySql工具类
     * @description:MysqlConnectionException的异常类
     * @author: nicesiri
     * @create: 2020-05-15 00:10
     */
    public MysqlConnectException() {
        super();
    }

    public MysqlConnectException(String string) {
        super(string);
    }

}

ResultType类

import java.sql.ResultSet;

public class ResultType {
    /**
     * @program: MySql工具类
     * @description: 控制返回的是ResultSet还是ResultCount,提供返回方法
     * @author: nicesiri
     * @create: 2020-05-24 20:38
     */

    private ResultSet resultSet = null;
    private int resultCount = -1;
    private boolean resultSetFlag = false;

    public ResultType() {
        super();
    }

    public ResultType(ResultSet resultSet) {
        super();
        if (resultSet != null) {
            this.resultSet = resultSet;
            this.resultSetFlag = true;
        }
    }

    public ResultType(int resultCount) {
        super();
        if (resultCount >= 0) {
            this.resultCount = resultCount;
        }
    }

    public ResultSet getResultSet() {
        if (resultSet != null) {
            return resultSet;
        }
        return null;
    }

    public ResultType setResultSet(ResultSet resultSet) {
        this.resultSet = resultSet;
        return this;
    }

    public int getResultCount() {
        if (resultCount != -1 && resultSetFlag == false) {
            return resultCount;
        }
        return -1;
    }

    public ResultType setResultCount(int resultCount) {
        this.resultCount = resultCount;
        return this;
    }

    public boolean isResultSetFlag() {
        return resultSetFlag;
    }

}

结果集处理类

import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class MysqlResultManage {
    private ResultSet resultSet = null;
    private int resultCount = -1;
    private String[] columnsName = null;
    private DoubleArray[] doubleArrays;
    private Map<String, ArrayList<String>> map;

    /*
     * 从ResultType传入一个ResultSet或者resultCount
     * 调用 manageResult()方法,返回一个DataTable对象
     * 或者直接调用getResultCount()返回一个int值,表示修改了多少行
     * */
    public MysqlResultManage(ResultType resultType) {
        if (resultType.getResultSet() != null) {
            this.resultSet = resultType.getResultSet();
        }
        if (resultType.getResultCount() >= -1) {
            this.resultCount = resultType.getResultCount();
        }
        map = new ConcurrentHashMap<>();//初始化map
    }

    public DataTable manageResult() {
        if (resultSet == null) {
            return null;
        }
        try {
            ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
            //获取结果集的元数据
            int n = resultSetMetaData.getColumnCount();//计算有多少行
            columnsName = new String[n];
            doubleArrays = new DoubleArray[n];
            for (int i = 0; i < n; i++) {
                doubleArrays[i] = new DoubleArray();//初始化doubleArrays类,需要注意java底层编译逻辑
                String valueName = resultSetMetaData.getColumnName(i + 1);//此处应该为i+1,为第一行
                //resultSetMetaData.getColumnName(),该函数返回值从1开始
                columnsName[i] = valueName;
                //保存结果集的列名,初始化doubleArrays类
            }

            while (resultSet.next()) {
                //一个arraylist的数组
                for (int i = 0; i < n; i++) {//循环获取列名,提取表中的数据值
                    String arrayListValue;
                    Object temptest = resultSet.getObject(columnsName[i]);
                    if (temptest != null) {
                        //此处放置返回的是空值,导致出现nullpoint异常
                        arrayListValue = temptest.toString();
                    } else {
                        arrayListValue = null;
                    }
                    //将所有表的信息都转换为String类型
                    doubleArrays[i].add(arrayListValue);//赋值到DoubleArrays内部类的Arraylist里面
                }
            }

            for (int i = 0; i < n; i++) {
                //将结果集封装到Map中
                //有没有可能多线程的同步封装呢?
                ArrayList<String> temp = doubleArrays[i].getArrayList();
                map.put(columnsName[i], temp);

            }
            return new DataTable(columnsName, map);//返回一个DataTable类,包含完整信息
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return null;
    }

    public int getResultCount() {
        if (resultCount > -1)
            return this.resultCount;
        else {
            return -1;
        }
    }

    //需要处理查询单行,多行
    class DoubleArray {
        //内部类,实现的是DoubleArray内部封装ArrayList<String>
        //作用:ArrayList类的数组
        private final ArrayList<String> arrayList;

        public DoubleArray() {
            arrayList = new ArrayList<>();
        }

        public void add(String value) {
            arrayList.add(value);
        }

        public ArrayList<String> getArrayList() {
            return arrayList;
        }
    }
}

数据表类

import java.util.*;

public class DataTable {
    /**
     * @program: MySql工具类
     * @description:
     * @author: nicesiri
     * @create: 2020-05-22 19:56
     */
    private String[] column;
    private String[][] row;
    private int columnCount;
    private int rowCount;
    private Map<String, ArrayList<String>> map;

    public DataTable() {
        super();
    }

    public DataTable(String[] column, Map<String, ArrayList<String>> map) {
        super();
        this.column = column;
        this.map = map;
        this.setDataTable();
    }

    public DataTable(String[] column, String[][] row, int columnCount, int rowCount) {
        super();
        this.column = column;
        this.row = row;
        this.columnCount = columnCount;
        this.rowCount = rowCount;
    }

    public void setDataTable() {
        /**
         * 设置结果集的表列,无论是一行还是多行,无论一列还是多列
         **/
        columnCount = map.size();
        //System.out.println(map.get(0));
        //需要使用迭代器的方式来提取出 map中的值,或者返回一个列名回来获取存储在map中的值

        ArrayList<String> temp = map.get(column[0]);
        rowCount = temp.size();//行数
        row = new String[rowCount][columnCount];
        //此处断点查看是否获取到了map中ArrayList的值
        for (int i = 0; i < rowCount; i++) {
            //二维数组的定义与用法
            //这里是第一行
            for (int j = 0; j < columnCount; j++) {
                temp = map.get(column[j]);//获取储存在map中的ArrayList数组,也就是一列值
                row[i][j] = temp.get(i);
            }
        }
    }

    public String[] getColumn() {
        return column;
    }

    public DataTable setColumn(String[] column) {
        this.column = column;
        return this;
    }

    public String[][] getRow() {
        return row;
    }

    public DataTable setRow(String[][] row) {
        this.row = row;
        return this;
    }

    public int getColumnCount() {
        return columnCount;
    }

    public DataTable setColumnCount(int columnCount) {
        this.columnCount = columnCount;
        return this;
    }

    public int getRowCount() {
        return rowCount;
    }

    public DataTable setRowCount(int rowCount) {
        this.rowCount = rowCount;
        return this;
    }

    public Map<String, ArrayList<String>> getMap() {
        return map;
    }

    public DataTable setMap(Map<String, ArrayList<String>> map) {
        this.map = map;
        return this;
    }

}

测试模板

import com.Mysql.DataTable;
import com.Mysql.MysqlConnect;
import com.Mysql.MysqlMessage;
import com.Mysql.MysqlResultManage;
import java.sql.Types;
import java.util.Scanner;

public class Demo {
    /**
     * @program: MySql工具类
     * @description: MySQL8.0封装类测试
     * @author: nicesiri
     * @create: 2020-05-27 11:39
     */
    public Demo() {
        super();
    }

    public static void main(String[] args) {
        Demo demo = new Demo();
        demo.insertSQL();
        demo.SearchSQL();
        demo.updateSQL();
        demo.SearchSQL();
        demo.deleteSQL();
    }

    private static void showRowValues(DataTable dataTable) {
        int m = dataTable.getColumnCount();
        int n = dataTable.getRowCount();
        String[][] row = dataTable.getRow();
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                System.out.print(row[i][j] + "  ");
                if (j == m - 1) {
                    System.out.print("\n");
                }
            }
        }
    }

    private static void showColumnName(DataTable dataTable) {
        int n = dataTable.getColumnCount();
        String[] column = dataTable.getColumn();
        for (int i = 0; i < n; i++) {
            System.out.print(column[i] + "  ");
            if (i == n - 1) {
                System.out.println("");
            }
        }
    }

    public void SearchSQL() {
        Scanner input = new Scanner(System.in);
        System.out.print("请输入用户名:");
        String user = input.nextLine();
        System.out.print("请输入密码: ");
        String passwd = input.nextLine();
        String searchSQL = "select * from studenttest";
        MysqlMessage mysqlMessage = new MysqlMessage("test", user, passwd);
        //设置访问的数据库,用户名,密码
        MysqlConnect mysqlConnect = new MysqlConnect(mysqlMessage);
        //构建连接类
        mysqlConnect.setPstmtParam(searchSQL, null, null);
        //预编译
        MysqlResultManage mysqlResultManage = new MysqlResultManage(mysqlConnect.getResultType());
        //构建结果类
        DataTable dataTable = mysqlResultManage.manageResult();
        //返回赋好值的结果表
        showColumnName(dataTable);
        showRowValues(dataTable);
    }

    public void insertSQL() {
        Scanner input = new Scanner(System.in);
        System.out.print("请输入用户名:");
        String user = input.nextLine();
        System.out.print("请输入密码: ");
        String passwd = input.nextLine();
        String insertSQL = "insert into studenttest(Sno, Sname, Ssex, Sage, Sdept)values(?,?,?,?,?)";
        MysqlMessage mysqlMessage = new MysqlMessage("test", user, passwd);
        MysqlConnect mysqlConnect = new MysqlConnect(mysqlMessage);
        mysqlConnect.setPstmtParam(insertSQL,
                new int[]{Types.CHAR, Types.CHAR, Types.CHAR, Types.SMALLINT, Types.CHAR},
                new String[]{"201215128", "张三", "男", "20", "MS"});
        MysqlResultManage mysqlResultManage = new MysqlResultManage(mysqlConnect.getResultType());
        //调用结果集的getresultCount方法返回修改的行数
        System.out.println(mysqlResultManage.getResultCount());


    }
    public void deleteSQL(){
        Scanner input = new Scanner(System.in);
        System.out.print("请输入用户名:");
        String user = input.nextLine();
        System.out.print("请输入密码: ");
        String passwd = input.nextLine();
        String deleteSQL = "delete from Studenttest where Sno = ?";
        MysqlMessage mysqlMessage = new MysqlMessage("test", user, passwd);
        MysqlConnect mysqlConnect = new MysqlConnect(mysqlMessage);
        mysqlConnect.setPstmtParam(deleteSQL,
                new int[]{Types.CHAR},
                new String[]{"201215127"});
        MysqlResultManage mysqlResultManage = new MysqlResultManage(mysqlConnect.getResultType());
        System.out.println(mysqlResultManage.getResultCount());
    }
    public void updateSQL(){
        Scanner input = new Scanner(System.in);
        System.out.print("请输入用户名:");
        String user = input.nextLine();
        System.out.print("请输入密码: ");
        String passwd = input.nextLine();
        String updateSQL = "update Studenttest set Sname = ? where Sno = ?";
        MysqlMessage mysqlMessage = new MysqlMessage("test", user, passwd);
        MysqlConnect mysqlConnect = new MysqlConnect(mysqlMessage);
        mysqlConnect.setPstmtParam(updateSQL,
                new int[]{Types.CHAR,Types.CHAR},
                new String[]{"张三","201215127"});
        MysqlResultManage mysqlResultManage = new MysqlResultManage(mysqlConnect.getResultType());
        System.out.println(mysqlResultManage.getResultCount());
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值