前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布

JDBC

作者头像
闲花手札
发布2021-08-24 14:43:10
1.5K0
发布2021-08-24 14:43:10
举报
文章被收录于专栏:闲花手札

JDBC

通过 JDBC 连接 MySQL 数据库

前提条件
代码语言:javascript
复制
1、jar包:连接驱动包 【mysql-connector-java-5.1.47.jar】

2、url:确定连接的数据库所在网络地址和对应操作哪一个数据库,由协议名+子协议名+数据源名构成,即
        jdbc:mysql://主机地址:端口号/数据库名

        【例】jdbc:mysql://localhost:3306/islu

3、user:用户名 【root】

4、password:密码 【root】
步骤
代码语言:javascript
复制
1、加载驱动
2、准备必要的连接参数
3、获取数据库连接
4、关闭资源!!!
案例代码【测试连接】
代码语言:javascript
复制
package JDBC;

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

public class Demo1 {
    /**
     * 1、加载驱动
     * 2、准备必要的连接参数
     * 3、获取数据库连接
     * 4、关闭资源!!!
     */
    public static void main(String[] args) {

        Connection connection = null;
        //加载驱动
        try {
            Class.forName("com.mysql.jdbc.Driver");
            //准备必要的连接参数
            //声明连接数据库所需要的参数,包括但不限于IP地址、端口号、连接到哪个数据库以及相关参数、用户名、密码
            String url = "jdbc:mysql://localhost:3306/islu?useSSL=true&characterEncoding=utf8";
            String user = "root";
            String password = "root";
            connection = DriverManager.getConnection(url, user, password);
            System.out.println(connection);
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

}

【注意】连接数据库可以配置一些相关的参数,数据库名与参数之间用 ? 进行分隔,参数之间通过 & 分隔,常用参数及格式如下 参数描述characterEncoding=utf8设置字符集为UTF8serverTimezone=Asia/Shanghai设置时区(JDBC8.0以上必备)useSSL=true使用SSL(JDBC8.0以上要改为false)jdbc:mysql://localhost:3306/FC2020?useSSL=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai

数据库驱动加载过程

代码语言:javascript
复制
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    /*
     * Register ourselves with the DriverManager
     * 在.class文件加载到内存时运行,并且有且只执行一次
     * 代码初始化过程!!!
     */ 
    static {
        try {
            // DriverManager驱动管理器注册了当前com.mysql.jdbc.Driver
            // 相对于当前Java程序拥有了连接MySQL数据库的必要的驱动条件
            java.sql.DriverManager.registerDriver(new Driver());
        } catch (SQLException E) {
            throw new RuntimeException("Can't register driver!");
        }
    }

    /**
     * Construct a new driver and register it with DriverManager
     * 
     * @throws SQLException
     *             if a database error occurs.
     */
    public Driver() throws SQLException {
        // Required for Class.forName().newInstance()
    }
}

【注意】后续会用到静态代码块去完成一些初始化的操作

JDBC 核心API

代码语言:javascript
复制
// 驱动管理类
class java.sql.DriverManager

/*
 * 这里是根据数据库连接URL,对应的user用户名和password密码,获取数据库连接对象
 */
static java.sql.Connection getConnection(String url, String user, String password);

// 数据库连接接口
interface java.sql.Connection 

/*
 * 获取数据库SQL语句搬运工对象,从Java程序搬运SQL语句到数据库中,同时Statement也是一个资源对象。
 */
java.sql.Statement createStatement();

/*
 * 获取数据库SQL语句【预处理】搬运工对象,Java程序的SQL语句,在创建PreparedStatement对象时,将SQL语句交给数据库预处理操作,可以解决一定的【SQL语句注入问题】,同时提高一定的效率,PreparedStatement也是一个资源对象
 */
java.sql.PreparedStatement prepareStatement(String sql);

// 数据库SQL语句搬运工对象接口
interface java.sql.Statement 

/*
 * 执行数据库修改数据,insert,update,delete...,返回值类型是int类型,是当前SQL语句搬运到数据库执行之后,数据库运行对于当前操作受到影响的行数
 * 2 rows affected in 5 ms
 */
int executeUpdate(String sql);

/*
 * 执行数据库查询语句,select操作,执行的结果是一个java.sql.ResultSet,结果集对象,当前操作返回值never null
 */
java.sql.ResultSet executeQuery(String sql);

// 数据库SQL语句【预处理】搬运工对象接口
public interface java.sql.PreparedStatement extends java.sql.Statement

/*
 * 执行数据库修改操作,insert,update,delete...处理的SQL语句是在创建PreparedStatement对象过程预处理的SQL语句,并且返回值是int类型,为当前操作对于数据表中收到影响的行数
 */
int executeUpdate();

/*
 * 执行数据库查询语句,select操作,的SQL语句是在创建PreparedStatement对象过程预处理的SQL语句,执行的结果是一个java.sql.ResultSet,结果集对象,当前操作返回值never null
 */
java.sql.ResultSet executeQuery();

/*
 * PreparedStatement预处理的SQL语句是可以带有参数的,这里是对于SQL语句参数进行赋值操作,这里有指定的操作下标,和对应的数据,数据类型繁多
 */
setXXX(int index, XXX value)

// 数据库结果集接口
interface java.sql.ResultSet 

/*
 * 根据查询结果中,字段所处的位置下标获取对应数据,XXX是指定类型(int、String用的最多)
 */
XXX getXXX(int columnIndex);

/*
 * 根据查询结果中,字段所处的字段名获取对应数据,XXX是指定类型(int、String用的最多)
 * 例int getInt(String columnLabel)
 */
XXX getXXX(String columnLabel);

/*
 * 判断当前查询结果集中是否还有数据可以继续遍历,如果没有。或则当前结果集中是无数据情况 Empty Set,直接返回fasle
 */
boolean next();

Statement 操作 SQL 语句

增删改操作步骤【重点】
代码语言:javascript
复制
1、加载驱动
2、准备连接数据库所需要的参数
3、获取数据库连接
4、获取Statement搬运工对象
5、准备SQL语句
6、执行SQL语句获取受影响的行数
Statement 插入 SQL 数据操作
代码语言:javascript
复制
package JDBC;

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

public class Demo2 {
    /**
     * 1、加载驱动
     * 2、准备连接数据库所需要的参数
     * 3、获取数据库连接
     * 4、获取Statement搬运工对象
     * 5、准备SQL语句
     * 6、执行SQL语句获取受影响的行数
     */
    public static void main(String[] args) {
        Connection connection = null;
        Statement statement = null;
        //加载驱动
        try {
            Class.forName("com.mysql.jdbc.Driver");
            //准备连接所需参数
            String url = "jdbc:mysql://localhost:3306/islu?useSSL=true&characterEncoding=utf8";
            String user = "root";
            String password = "root";
            //获取数据库连接
            connection = DriverManager.getConnection(url, user, password);
            // 获取Statement对象
            statement = connection.createStatement();
            //准备SQL语句
            String sql = "insert into user(uname,upassword) values('islu','islu.cn');";
            //执行SQL语句
            int affectedRows = statement.executeUpdate(sql);
            System.out.println("受影响的行数" + affectedRows);
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (statement != null) {
                    statement.close();
                }
                if (connection != null) {
                    connection.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}
Statement 修改 SQL 数据操作
代码语言:javascript
复制
package JDBC;

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

public class Demo3 {
    /**
     * 1、加载驱动
     * 2、准备连接数据库所需要的参数
     * 3、获取数据库连接
     * 4、获取Statement搬运工对象
     * 5、准备SQL语句
     * 6、执行SQL语句获取受影响的行数
     */
    public static void main(String[] args) {
        Connection connection=null;
        Statement statement=null;
        //加载驱动
        try {
            Class.forName("com.mysql.jdbc.Driver");
            //获取连接数据库所需要的参数
            String url="jdbc:mysql://localhost:3306/islu?useSSL=true&characterEncoding=utf8";
            String user="root";
            String password="root";
            //获取数据库连接
            connection = DriverManager.getConnection(url, user, password);
            //获取Statement搬运工对象
            statement = connection.createStatement();
            //准备SQL语句
            String sql="update user set uname = '彭于晏' where uid = 1;";
            //执行SQL语句
            int affectedRows = statement.executeUpdate(sql);
            System.out.println(affectedRows);
        } catch (ClassNotFoundException| SQLException e) {
            e.printStackTrace();
        }finally {
            try {
                if (connection!=null){
                connection.close();
                }
                if (statement!=null){
                    statement.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}
Statement 删除 SQL 数据操作
代码语言:javascript
复制
public class Demo4 {
    public static void main(String[] args) {
        Connection connection = null;
        Statement statement = null;

        try {
            // 加载驱动
            Class.forName("com.mysql.jdbc.Driver");

            // 声明连接数据库所需要的参数,包括但不限于IP地址、端口号、连接到哪个数据库、用户名、密码
            String url = "jdbc:mysql://localhost:3306/FC2020?useSSL=true&characterEncoding=utf8";
            String user = "root";
            String password = "root";

            // 通过参数获取数据库连接
            connection = DriverManager.getConnection(url, user, password);

            // 获取Statement对象
            statement = connection.createStatement();

            // 准备SQL语句
            String sql = "delete from student where id = 1;";

            // 执行SQL语句获取受影响的行数
            int affectedRows = statement.executeUpdate(sql);

            System.out.println("受影响的行数:" + affectedRows);
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        } finally {
            // 关闭资源
            try {
                if (statement != null) {
                    statement.close();
                }

                if (connection != null) {
                    connection.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}
查询操作步骤【重点】
代码语言:javascript
复制
1、加载驱动
2、准备连接数据库所需要的参数
3、获取数据库连接
4、获取Statement搬运工对象
5、准备SQL语句
6、执行SQL语句获取结果集对象
7、判断结果集对象中是否有数据
8、如果结果集对象中存在数据,获取每个数据库字段对应类型的数据
Statement 查询 SQL 数据操作

准备实体类

代码语言:javascript
复制
package bean;

public class User {
    private int uid;
    private String uname;
    private String upassword;

    public User() {
    }

    public User(int uid, String uname, String upassword) {
        this.uid = uid;
        this.uname = uname;
        this.upassword = upassword;
    }

    public int getUid() {
        return uid;
    }

    public void setUid(int uid) {
        this.uid = uid;
    }

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public String getUpassword() {
        return upassword;
    }

    public void setUpassword(String upassword) {
        this.upassword = upassword;
    }

    @Override
    public String toString() {
        return "User{" +
                "uid=" + uid +
                ", uname='" + uname + '\'' +
                ", upassword='" + upassword + '\'' +
                '}';
    }
}

【注意】根据阿里巴巴开发手册,实体类成员变量要用包装类!!!

查询单行
代码语言:javascript
复制
package JDBC;

import bean.User;

import java.sql.*;

public class Demo5 {
    public static void main(String[] args) {

        // 声明资源
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;

        try {
            // 加载驱动
            Class.forName("com.mysql.jdbc.Driver");

            // 准备参数
            String url = "jdbc:mysql://localhost:3306/islu?useSSL=true&characterEncoding=UTF8";
            String user = "root";
            String password = "root";

            // 获取连接
            connection = DriverManager.getConnection(url, user, password);

            // 获取搬运工对象
            statement = connection.createStatement();

            // 准备SQL语句
            String sql = "select * from user where uid = 1;";

            // 执行SQL语句并获取结果集
            resultSet = statement.executeQuery(sql);

            User userinfo = null;

            // 判断结果集中是否还有下一行数据
            while (resultSet.next()) {
                // 从结果集中获取对应类型的数据
                int uid = resultSet.getInt(1);
                String uname = resultSet.getString(2);
                String upassword = resultSet.getString(3);

                // 通过获取到的数据创建实体类对象
                userinfo = new User(uid, uname, upassword);
            }

            // 展示
            System.out.println(userinfo);

        } catch (SQLException | ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            // 关闭资源
            try {
                if (resultSet != null) {
                    resultSet.close();
                }

                if (statement != null) {
                    statement.close();
                }

                if (connection != null) {
                    connection.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}
查询多行
代码语言:javascript
复制
package JDBC;

import bean.User;

import java.sql.*;
import java.util.ArrayList;

public class Demo6 {
    public static void main(String[] args) {

        // 声明资源
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;

        try {
            // 加载驱动
            Class.forName("com.mysql.jdbc.Driver");

            // 准备参数
            String url = "jdbc:mysql://localhost:3306/islu?useSSL=true&characterEncoding=UTF8";
            String user = "root";
            String password = "luhuijun";

            // 获取连接
            connection = DriverManager.getConnection(url, user, password);

            // 获取搬运工对象
            statement = connection.createStatement();

            // 准备SQL语句
            String sql = "select * from user;";

            // 执行SQL语句并获取结果集
            resultSet = statement.executeQuery(sql);

            User userinfo = null;
            ArrayList<User> list=new ArrayList<>();
            // 判断结果集中是否还有下一行数据
            while (resultSet.next()) {
                // 从结果集中获取对应类型的数据
                int uid = resultSet.getInt(1);
                String uname = resultSet.getString(2);
                String upassword = resultSet.getString(3);

                // 通过获取到的数据创建实体类对象
                userinfo = new User(uid, uname, upassword);
                //添加到list集合中
                list.add(userinfo);
            }

            // 展示
            System.out.println(list);

        } catch (SQLException | ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            // 关闭资源
            try {
                if (resultSet != null) {
                    resultSet.close();
                }

                if (statement != null) {
                    statement.close();
                }

                if (connection != null) {
                    connection.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

常见数据库连接

代码语言:javascript
复制
-------------------------------oracle------------------
驱动:oracle.jdbc.driver.OracleDriver
URL:jdbc:oracle:thin:@machine_name:port:dbname
注:machine_name:数据库所在的机器的名称;
      port:端口号,默认是1521

-------------------------------mysql-------------------
驱动:com.mysql.jdbc.Driver
URL:jdbc:mysql://machine_name:port/dbname
注:machine_name:数据库所在的机器的名称;
      port:端口号,默认3306    

------------------------------SQL Server---------------
驱动:com.microsoft.jdbc.sqlserver.SQLServerDriver
URL:jdbc:microsoft:sqlserver://<:port>;DatabaseName=
注:machine_name:数据库所在的机器的名称;
      port:端口号,默认是1433

------------------------------DB2----------------------
驱动:com.ibm.db2.jdbc.app.DB2Driver
URL:jdbc:db2://<:port>/dbname
注:machine_name:数据库所在的机器的名称;
      port:端口号,默认是5000
-------------------------------------------------------
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-03-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • JDBC
    • 通过 JDBC 连接 MySQL 数据库
      • 数据库驱动加载过程
        • JDBC 核心API
        • Statement 操作 SQL 语句
        • 常见数据库连接
    相关产品与服务
    数据库
    云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档