(Java笔记)JDBC连接MySQL数据库8.0.25(原生方式)

本文详细介绍了如何在Maven项目中配置MySQL驱动,创建JDBC测试类,并通过六个步骤演示了从连接、执行SQL到处理结果集的全过程,包括注册驱动、获取连接信息、创建Statement对象等关键环节。
摘要由CSDN通过智能技术生成

目录

  • 1.前言
  • 2.在pom.xml中配置maven下载驱动包
  • 3.创建JDBCTest测试类
  • 4.JDBC连接MySQL六个步骤
    • 1)注册数据库连接驱动
    • (2)获取数据连接信息
    • (3)获取数据库操作对象
    • (4)创建执行SQL语句
    • (5)处理查询结果集
    • (6)关闭连接释放资源
  • 5.完整测试类JDBCTest.java
  • 6.总结


前言

本教程是通过IEDA创建的maven项目,Java语言实现JDBC连接本地MySQL数据库。

开发工具:IDEA2021.1.3

JDK版本:1.8.0_152

MySQL连接驱动包版本:mysql-connector-java  5.1.47

 

 

 


1.在pom.xml中配置maven下载驱动包

        粘贴复制到自己的pom.xml

    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
    </dependencies>

        IDEA自动配置到当前工程项目:


2.创建JDBC测试类


3.JDBC连接MySQL六个步骤

(1)注册驱动

        使用Class.forName获取com.mysql.jdbc.Driver.class。

                获取方式例如:

Class.forName("com.mysql.jdbc.Driver");

(2)  获取连接数据库的信息 

        先创建一个connection对象,再通过DriverManager.java类中的getConnection()方法获取连接数据的信息(url+数据库名称+用户名+密码),并把连接信息传给connection对象。

 connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/dbweb? 
 useSSL=false", "root", "root");

                ———"jdbc:mysql"Sun公司与MySQL数据库公司定义的一个协议,好比http、https。

                (sql server,Oracle在使用JDBC连接数据库时都有自己相应的协议方式)

                ———dbweb是我数据库名称

                ———localhost是我本机ip

                ———root是我安装MySQL设置的用户名

                ———root是我安装MySQL设置的密码

注意:是英文的冒号": "问号"? "以及双引号" "

(3)获取数据库操作对象

        使用Connection接口中createStatement()方法,创建用于向数据库发送SQL语句的对象。

statement = connection.createStatement();

(4)处理查询的结果集

        使用java.sql库下Statement接口中的executeQuery(String sql),该方法返回的是一个

java.sql库下的ResultSet结果集,所以结果集的接收方式如下:

ResultSet对象=Statement对象.executeQuery(sql);

//创建执行SQL语句的对象
Statement statement = null;
ResultSet resultSet = null;
//创建将要执行的sql语句
String sql ="select stu_id,stu_on,stu_name from student";
//statement.executeQuery(sql)执行DML语句(insert、delete、update),返回ResultSet类型
//resultSet创建结果集对象用于结束SQL执行后的结果
resultSet = statement.executeQuery(sql);

//statement.executeUpdate(String sql)执行DQL(select)语句
//返回int类型的结果(int值表示受影响的行数,查询n条数据,int = n;)
//resultSet = statement.executeUpdate(String sql);

(5)遍历结果集

由(4)可以知道,结果集为ResulSet对象(resultSet = statement.executeQuery(sql);

这里需要使用ResulSet接口中next()方法,开发文档叙述如下:

返回结果是true或者false,这里表示当我们从结果集中取值之前,光标开始指向的位置是空行数据,如果想要光标继续向下获取第一行的数据,就必须调用next()一次,例如:

//next()一次表示指针指向下一行
// 1,2,3表示取当前行中每一列的数据
if (resultSet.next()) {
    int intId = resultSet.getInt(1);
    String strNo = resultSet.getString(2);
    String strName = resultSet.getString(3);
    System.out.println("id=" + intId + "学号=" + strNo + "姓名="+ strName);
}

        运行结果:

再使用一次if循环取值第二行数据:

//查询第一行
if (resultSet.next()) {
    int intId = resultSet.getInt(1);
    String strNo = resultSet.getString(2);
    String strName = resultSet.getString(3);
    System.out.println("id=" + intId + "学号=" + strNo + "姓名=" + strName);
}
//查询第二行
if (resultSet.next()) {
    int intId = resultSet.getInt(1);
    String strNo = resultSet.getString(2);
    String strName = resultSet.getString(3);
    System.out.println("id=" + intId + "学号=" + strNo + "姓名=" + strName);
}

                运行结果:

        使用wihle(resultSet.next())循环对结果集全部查询——即遍历结果集resultSet

******JDBC中所有的下标从1开始,不是从0开始******

//while循环遍历结果集
//next()光标指向的行没有数据就跳出当前while()循环,然后继续执行while下面的语句(没return时)
while (resultSet.next()){
//getString()方法的特点 :不管数据库中数据的类型是什么,都以String类型取出
//JDBC中所有的下标从1开始,不是从0开始
//getSting()中的1,2,3,4,5,6,7表示从当前行的几列取出数据 这种方式不健壮,不推荐使用
String intId = resultSet.getString(1);
String strNo = resultSet.getString(2);
String strName = resultSet.getString(3);
System.out.println("学生ID==" + intId + ",学号==" + strNo + "," + "姓名==" + strName);
}

                运行结果:我的数据库有6行数据

            还有一种情况是:getString("列名")方式使用wihle(resultSet.next())循环遍历结果集查询数据,而列名指的是将需要执行的sql语句中排列的列名,而不是数据库表中的字段名

//while循环遍历结果集以getSting("列名")查询数据
while (resultSet.next()){
//getString()方法的特点 :不管数据库中数据的类型是什么,都以String类型取出
//JDBC中所有的下标从1开始,不是从0开始
//getString()中的1,2,3,4,5,6,7表示从当前行的几列取出数据 这种方式不健壮,不推荐使用
//而列名指的是将需要执行的sql语句中排列的列名,而不是数据库表中的字段名。"select stu_id as id form student";
    String intId = resultSet.getString("stu_id");
    String strNo = resultSet.getString("stu_no");
    String strName = resultSet.getString("stu_name");
    System.out.println("学生ID==" + intId + ",学号==" + strNo + "," + "姓名==" +strName);
}

                运行结果:查询结果与索引的1,2,3完全一样,推荐使用根据sql列名查询
 

               例:根据列名查询时,

String sql = "select stu_id as id,stu_no,stu_name from student";

while (resultSet.next()) {
    String intId = resultSet.getString("stu_id");
    String strNo = resultSet.getString("stu_no");
    String strName = resultSet.getString("stu_name");
    System.out.println("学生ID==" + intId + ",学号==" + strNo + "," + "姓名==" +strName);
}

        上述代码中:

        resultSet.getString("stu_id");

                               

        String sql = "select stu_id as id,stu_no,stu_name from student";

        stu_id重命名为id

        运行结果出错:java.sql.SQLException: Column 'stuid' not found

 因此,SQL语句中列表与getString(列表);保持一致性。

        改成:getString("id");

while (resultSet.next()) {
    String intId = resultSet.getString("id");
    String strNo = resultSet.getString("stu_no");
    String strName = resultSet.getString("stu_name");
    System.out.println("学生ID==" + intId + ",学号==" + strNo + "," + "姓名==" +strName);
}

        查询成功:

此外,不止getString(),还有很多取数据的类型,如:getInt()getDouble()等。


(6)关闭数据库连接,释放资源

        关闭流的优先级顺序从左往右:1.resultSet>2.statement>3.connection

if (resultSet != null) {//关闭结果集
    try {
            resultSet.close();
    } catch (SQLException sqlException) {
            sqlException.printStackTrace();
        }
    }
if (statement != null) {//关闭数据库操作对象
    try {
            statement.close();
    } catch (SQLException sqlException) {
            sqlException.printStackTrace();
        }
    }
    if (connection != null) {//关数据库连接
    try {
        connection.close();
    } catch (SQLException sqlException) {
            sqlException.printStackTrace();
        }
    }

5.完整测试类JDBCTest.java

import java.sql.*;

/**
 * created by ZSAndroid on 2021/7/6
 * 描述:JDBC连接测试类
 *
 * @author
 * @creat 2021-07-06-16:36:07
 */
public class JDBCTest {
    private static String stringValueOne;
    private static String stringValueTwo;
    private static String stringValueThree;
    private static String stringValueFour;
    private static String stringValueFive;
    private static String stringValueSix;
    private static String stringValueSeven;

    public static void main(String[] args) {
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        try {
            //1.注册数据库驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2.获取数据库连接
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/dbweb?useSSL=false", "root", "root");
            //3.获取数据库操作对象
            statement = connection.createStatement();
            //4.执行SQL
            //String sql = "select * from student";
            String sql = "select stu_id as id,stu_no,stu_name from student";
            // int = statement.executeUpdate(sql);//数据的操作语言:insert delete update
            // ResultSet = statement.executeQuery(sql);//专门执行DQL语句:select
            resultSet = statement.executeQuery(sql);
            //5.处理查询结果集
            //查询第一行
//            if (resultSet.next()) {
//                int intId = resultSet.getInt(1);
//                String strNo = resultSet.getString(2);
//                String strName = resultSet.getString(3);
//                System.out.println("id=" + intId + "学号=" + strNo + "姓名=" + strName);
//            }
//            //查询第二行
//            if (resultSet.next()) {
//                int intId = resultSet.getInt(1);
//                String strNo = resultSet.getString(2);
//                String strName = resultSet.getString(3);
//                System.out.println("id=" + intId + "学号=" + strNo + "姓名=" + strName);
//            }
            //while循环遍历结果集
            //next()光标指向的行没有数据就跳出当前while()循环,然后继续执行while下面的语句(没return时)
//            while (resultSet.next()) {
//                //getString()方法的特点 :不管数据库中数据的类型是什么,都以String类型取出
//                //JDBC中所有的下标从1开始,不是从0开始
//                //getSting()中的1,2,3,4,5,6,7表示从当前行的几列取出数据 这种方式不健壮,不推荐使用
//                String intId = resultSet.getString(1);
//                String strNo = resultSet.getString(2);
//                String strName = resultSet.getString(3);
//                System.out.println("学生ID==" + intId + ",学号==" + strNo + "," + "姓名==" + strName);
//            }
            //while循环遍历结果集以getSting("列名")查询数据
            while (resultSet.next()) {
                //getString()方法的特点 :不管数据库中数据的类型是什么,都以String类型取出
                //JDBC中所有的下标从1开始,不是从0开始
                //getString()中的1,2,3,4,5,6,7表示从当前行的几列取出数据 这种方式不健壮,不推荐使用
                //而列名指的是将需要执行的sql语句中排列的列名,而不是数据库表中的字段名。"select stu_id as id form student";
                String intId = resultSet.getString("id");
                String strNo = resultSet.getString("stu_no");
                String strName = resultSet.getString("stu_name");
                System.out.println("学生ID==" + intId + ",学号==" + strNo + "," + "姓名==" + strName);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //6.关闭连接+释放资源
            if (resultSet != null) {//关闭结果集
                try {
                    resultSet.close();
                } catch (SQLException sqlException) {
                    sqlException.printStackTrace();
                }
            }
            if (statement != null) {//关闭数据库操作对象
                try {
                    statement.close();
                } catch (SQLException sqlException) {
                    sqlException.printStackTrace();
                }
            }
            if (connection != null) {//关数据库连接
                try {
                    connection.close();
                } catch (SQLException sqlException) {
                    sqlException.printStackTrace();
                }
            }
        }
    }
}


6.总结

仅自己学习记录,如有错误,敬请谅解~,谢谢~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

电竞丶小松哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值