【Java+MySQL】使用JDBC连接MySQL 8.0数据库

一、Java MySQL 8.0连接驱动包

下载链接:https://pan.baidu.com/s/1YFOImz0dCHtzIajSFq9xgg?pwd=boul
提取码:boul

【IDEA】导入方式:

1、在【External Libraries】下右键点击【JDK】,选择【Open Library Settings】。
【Java+MySQL】使用JDBC连接MySQL 8.0数据库_第1张图片

2、点击【+】号将下载的jar包导入进来。
【Java+MySQL】使用JDBC连接MySQL 8.0数据库_第2张图片

二、Java连接MySQL数据库

1、新建一个类用来存放4大常量。

public class Config {
    //驱动,8.0固定为该格式
    public static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
    //数据库地址,修改该数据库名称
    public static final String DB_URL = "jdbc:mysql://localhost:3306/database_name?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";
    //用户名
    public static final String USER = "user_name";
    //密码
    public static final String PASSWORD = "password";
}

2、主类中设置3个全局变量。

    //3个全局变量,Connection连接数据库,创建一个Statement对象,用于向数据库发送SQL语句。
    private static Connection connection;
    //Statement用于执行静态SQL语句并返回其产生的结果的对象。
    private static Statement statement;
    //ResultSet用于存放Statement返回的结果。
    private static ResultSet resultSet;

3、主类中连接数据库。

    static {
        //静态块连接数据库
        try{
            //加载驱动
            Class.forName(Config.JDBC_DRIVER);
            //创建链接
            connection = DriverManager.getConnection(Config.DB_URL, Config.USER, Config.PASSWORD);
            //访问数据库
            statement = connection.createStatement();
        }catch (Exception e){
            e.printStackTrace();
            System.out.println("数据库连接失败!");
        }
    }

4、Statement类。

  • executeQuery方法

    • 执行SQL查询
    • 返回ResultSet对象
  • executeUpdate方法

    • 可执行表、数据的增加、删除、修改操作
    • 返回执行受到影响的行数
  • execute方法

    • 可执行任何SQL语句
    • 返回一个布尔值

5、资源释放。

    public static void release(){
        try{
            if (connection != null)
                connection.close();
            if (statement != null)
                statement.close();
            if (resultSet != null)
                resultSet.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }

三、执行测试语句

1、在数据库中新建一个Tiobe编程语言排行表名为【tioberank】。

CREATE TABLE IF NOT EXISTS `tioberank`(
`id` INT UNSIGNED AUTO_INCREMENT,
`language` CHAR(20) NOT NULL DEFAULT '',
`rank` INT UNSIGNED NOT NULL,
`ratings` FLOAT NOT NULL,
`change` FLOAT NOT NULL,
PRIMARY KEY (`id`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

2、插入几个测试数据。

INSERT INTO `tioberank` VALUES
('1', 'Python', '1', '15.74', '4.07'),
('2', 'C', '2', '13.96', '2.13'),
('3', 'Java', '3', '11.72', '0.6');

四、增删查改接口函数

1、数据表存在与否查询,返回TRUE或FALSE。

    public static boolean tableIsExist(String table){
        boolean result = false;
        int colIndex = 1;
        try{
            resultSet = statement.executeQuery("SHOW TABLES");
            while (resultSet.next()){
                if (resultSet.getString(colIndex).equals(table)){
                    result = true;
                    break;
                }
            }
            if (!result){
                System.out.println("数据表不存在!");
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return result;
    }

2、查询表字段名,返回一个字符串列表。

    public static List<String> descTable(String table){
        List<String> list = new ArrayList<>();
        int colIndex = 1;
        try {
            if (tableIsExist(table)){
                resultSet = statement.executeQuery("DESC " + table);
                while (resultSet.next()){
                    list.add(resultSet.getString(colIndex));
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return list;
    }

3、【查询】根据SQL语句查询数据内容,返回一个哈希表列表。

    private static void dataQuery(String table, String sql, List<Map<String, Object>> list) throws SQLException {
        Map<String, Object> map;
        List<String> headers = descTable(table);
        System.out.println("执行SQL语句:" + sql);
        resultSet = statement.executeQuery(sql);

        while (resultSet.next()){
            map = new HashMap<>();
            for(String header : headers){
                map.put(header, resultSet.getObject(header));
            }
            list.add(map);
        }
    }

根据上面方法衍生:

3.1 查询所有数据内容

    public static List<Map<String, Object>> selectTable(String table){
        List<Map<String, Object>> list = new ArrayList<>();

        try{
            if (tableIsExist(table)){
                //查询所有内容
                String sql = "SELECT * FROM " + table;
                dataQuery(table, sql, list);
            }
        }catch (Exception e){
            e.printStackTrace();
        }

        return list;
    }

3.2 根据具体的SQL语句查询数据内容

    public static List<Map<String, Object>> selectTable(String table, String sql){
        List<Map<String, Object>> list = new ArrayList<>();

        try{
            if (tableIsExist(table)){
                //自定义SQL语句查询内容
                dataQuery(table, sql, list);
            }
        }catch (Exception e){
            e.printStackTrace();
        }

        return list;
    }

或是根据不同的SQL语句自定义不同的接口函数,如根据字段名和数据进行模糊查询(这里只写了一个单条件,多条件可以参照下方删除数据的写法):

    public static List<Map<String, Object>> selectTable(String table, String key, Object value){
        List<Map<String, Object>> list = new ArrayList<>();

        try{
            if (tableIsExist(table)){
                String sql = "SELECT * FROM " + table + " WHERE " + key + " LIKE '" + value + "'";
                dataQuery(table, sql, list);
            }
        }catch (Exception e){
            e.printStackTrace();
        }

        return list;
    }
//调用
selectTable("tioberank", "language", "%a%");

4、【增加、删除、修改】定义一个执行executeUpdate的函数,使其根据是否有数据得到修改为依据返回TRUE或FALSE。

    private static boolean dataUpdate(String sql) throws SQLException {
        System.out.println("执行SQL语句:" + sql);
        int executeResult = statement.executeUpdate(sql);
        return executeResult > 0;
    }

4.1 增加数据操作

    public static String addTable(String table, String[] values){
        String result = "";
        try {
            if (tableIsExist(table)){
                StringBuilder stringBuilder = new StringBuilder();
                //第一个为id自增量,用null表示使其自动增加
                stringBuilder.append("INSERT INTO ").append(table).append(" VALUES(null, ");
                String sql = "";
                for (String value : values){
                    stringBuilder.append("'").append(value).append("', ");
                }
                //去除最后一个逗号
                stringBuilder.delete(stringBuilder.length()-2, stringBuilder.length()-1);
                stringBuilder.append(");");

                sql = stringBuilder.toString();
                if (dataUpdate(sql))
                    result = "添加数据成功!";
                else
                    result = "添加数据失败!";
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return  result;
    }
//调用
String[] data = new String[]{"C++", "4", "9.76", "2.63"};
System.out.println(addTable("tioberank", data));

4.2 删除数据操作。

删除数据后可能会出现自增ID序列混乱的问题,若想解决,需要先删除ID列再重新增加,相当于刷新序列刷新序列SQL语句参照:

ALTER TABLE TABLE_NAME DROP id;
ALTER TABLE TABLE_NAME ADD id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT FIRST;

Java代码参照(这里多条件删除为【与】的关系,【或】的关系参照该方式可以很快写出):

    private static String refreshDataID(String table){
        //刷新数据ID序列
        String sql;
        String result;
        try {
            sql = "ALTER TABLE " + table + " DROP id";
            statement.execute(sql);
            sql = "ALTER TABLE " + table + " ADD id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT FIRST";
            statement.execute(sql);
            result = "刷新ID序列成功!";
        }catch (Exception e){
            e.printStackTrace();
            result = "刷新ID序列失败!";
        }
        return result;
    }
    public static String deleteTable(String table, Map<String, String> conditions){
        //删除数据
        String result = "";
        try {
            if (tableIsExist(table)){
                StringBuilder stringBuilder = new StringBuilder();
                stringBuilder.append("DELETE FROM ").append(table).append(" WHERE ");
                String sql = "";
                conditions.forEach((key, value) -> {
                    stringBuilder.append(key).append("='").append(value).append("' AND ");
                });
                //去除最后一个&及空格
                stringBuilder.delete(stringBuilder.length()-5, stringBuilder.length());

                sql = stringBuilder.toString();
                if (dataUpdate(sql)) {
                    result = "删除数据成功!";
                    System.out.println(refreshDataID(table));
                }
                else
                    result = "删除数据失败!";
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return result;
    }
//调用
HashMap<String, String> deleteConditions = new HashMap<>();
deleteConditions.put("id", "4");
System.out.println(deleteTable("tioberank", deleteConditions));

4.3 数据更新操作

    public static String updateTable(String table, String conditionKey, String conditionValue, String aimKey, String aimValue){
        //更新数据
        String result = "";
        try {
            if (tableIsExist(table)){
                String sql = "UPDATE " + table + " SET `" + aimKey + "`='" + aimValue + "' WHERE " + conditionKey + "='" + conditionValue + "'";
                if (dataUpdate(sql)) {
                    result = "更新数据成功!";
                }
                else
                    result = "更新数据失败!";
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return result;
    }
//调用
	System.out.println(updateTable("tioberank", "language", "Python", "rank", "2"));

以上这些接口函数本质上就是使用statement的executeQuery、executeUpdate和execute方法来执行SQL语句并返回执行结果,我们完全可以按照不同项目的不同需求去进行构建,减少徒手敲SQL语句的次数。

项目码云地址】 https://gitee.com/boulete/MysqlJDBC.git

你可能感兴趣的:(MySQL,Java,数据库,java,mysql)