【MySQL】从连接数据库开始:JDBC 编程入门指南

发布于:2025-07-30 ⋅ 阅读:(21) ⋅ 点赞:(0)

个人主页♡喜欢做梦

欢迎  👍点赞  ➕关注  ❤️收藏  💬评论


目录

🌟一、什么是JDBC?

🌟二、JDBC编程的步骤

✨使用步骤

✨DriverManger

💫定义

💫DriverManger的主要功能

💫DriverManger的核心方法

💫使用

✨DataSource

💥定义

💥使用 

💥代码优化

✨DriverManger和DataSource的区别


🌟一、什么是JDBC?

JDBC(Java Data Base Connectivity,Java数据库连接)是Java程序和数据库之间的桥梁,也就是Java语言操作数据库的标准API,他提供了一套用于执行SQL语句的Java接口。JDBC的主要作用就是:与数据库连接、发送SQL语句和处理数据库执行结果。

🌟二、JDBC编程的步骤

✨使用步骤

1.加载数据库厂商的驱动包

2.建立连接,用户名,密码

3.创建Statement

4.发送要执行的SQL语句

5.接收返回结果并显示(结果集,受影响的行数)

6.释放资源和关闭连接

✨DriverManger

💫定义

DriverManger是JDBC中的一个核心类,位于java.sql包下,他负责管理数据库驱动程序,并为客户端程序提供获取数据库连接的方法。它就像一个“驱动管理器”,协调不同数据库驱动与应用程序之间的交互。

💫DriverManger的主要功能

  • 注册数据驱动:管理 已加载的数据;
  • 获取数据库连接:根据连接信息(URL、用户名、密码)返回合适的Connection对象;
  • 处理驱动程序之间的竞争:当多个驱动可以连接到同一URL时,选择最合适的驱动。

URL表示统一资源定位符,是互联网上用来指定一个位置、文件或者资源的标准方式。 

💫DriverManger的核心方法

getConnection()

核心方法 功能
getConnection(String url) 通过URL获取连接
getConnection(String url,String  user,String password) 通过URL、用户名和密码获取连接
getConnection(String url,Properties info) 通过URL和包含连接属性的Properties对象获取连接
registerDriver(Driver driver) 注册驱动(一般不用手动调用)
deregisterDriver(Driver driver) 注销驱动
gerDrivers() 获取所有已注册的驱动

💫使用

import java.sql.*;
import java.text.MessageFormat;
import java.util.Scanner;

public class Demo1 {
    public static void main(String[] args) {
        //声明数据库操作的相关对象
        //数据库连接对象
        Connection connection=null;
        //执行静态SQL对象,但是SQL注入可能会出现一些问题
        Statement statement= null;
        //对静态SQL的解决方法,预处理
        PreparedStatement preparedStatement=null;
        //查询结果集对象
        ResultSet resultSet=null;
        try{
            //1,加载数据厂商提供的驱动:加载数据库提供的jdbc驱动类,注册到DriverManger中
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2.获取数据库连接--相当于在数据库中写use java2;
            //数据库连接URL格式:jdbc:mysql://服务器地址:端口/数据库?参数名=值[&参数名=值]
            connection= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/java2?characterEncoding=utf8" +
                    "&allowPublicKeyRetrieval=true&useSSL=false", "root", "123456");
            //3.创建Statement对象:Statement用于像数据库发送SQL语句
            statement = connection.createStatement();
            //4.定义SQL语句并执行
            System.out.println("请输入学生姓名:");
            Scanner scanner =new Scanner(System.in);
            //接收用户输入
            String name=scanner.next();
            String sql="select id,name,class_id from students where name='"+name+"'";
            //5.执行SQL,获取查询结果
            //executeQuery用于执行select语句,返回结果集
            resultSet=statement.executeQuery(sql);
            //6.对结果集进行遍历获取结果
            //有返回true,没有返回false
            while(resultSet.next()){
                long id=resultSet.getLong(1);//获取第一列字段的值
                String Stuname=resultSet.getString(2);//获取第二列字段的值
                long class_id=resultSet.getLong(3);//获取第三列字段的值
                System.out.println(MessageFormat.format("学生id={0},姓名={1},班级={2}",id,name,class_id));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }finally{// 释放资源(从后往前释放),关闭连接
            if(resultSet!=null){
                try{
                    resultSet.close();
                }catch (SQLException e){
                    e.printStackTrace();
                }
            }
            if(statement!=null){
                try {
                    statement.close();
                }catch (SQLException e){
                    e.printStackTrace();
                }
            }
            if(connection!=null){
                try {
                    connection.close();
                }catch (SQLException e){
                    e.printStackTrace();
                }
            }
        }
    }
}

✨DataSource

💥定义

是Java数据库连接(JDBC)的一个接口,用于获取数据库连接,可方便数据库连接资源,实现连接池等高级功能。

💥使用 

import com.mysql.cj.jdbc.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.*;
import java.text.MessageFormat;
import java.util.Scanner;

public class Demo {
    public static void main(String[] args) {
        //定义MySQL数据源对象
        MysqlDataSource mysqlDataSource=new MysqlDataSource();
        //MySQL驱动直连
        //数据库连接
        mysqlDataSource.setURL("jdbc:mysql://127.0.0.1:3306/java2?characterEncoding=utf8");
        mysqlDataSource.setUser("root");
        mysqlDataSource.setPassword("123456");
        //定义jdbc数据源对象
        DataSource dataSource=mysqlDataSource;
        Connection connection=null;
        //预处理
        PreparedStatement statement=null;
        //查询结果集对象
        ResultSet resultSet=null;
        try{
            //1.获取数据库连接
            connection= dataSource.getConnection();
            //2.创建Statement对象:Statement用于像数据库发送SQL语句
            //定义SQL语句并执行
            String sql="select id,name,class_id from students where name=?";
            statement = connection.prepareStatement(sql);
            //3.接收用户输入
            System.out.println("请输入学生姓名:");
            Scanner scanner =new Scanner(System.in);
            String name=scanner.next();
            // 用真实值替换占位符
            statement.setString(1,name);
            //4..执行SQL,获取查询结果
            //executeQuery用于执行select语句,返回结果集
            resultSet=statement.executeQuery(sql);
            //5.对结果集进行遍历获取结果
            //有返回true,没有返回false
            while(resultSet.next()){
                long id=resultSet.getLong(1);//获取第一列字段的值
                String Stuname=resultSet.getString(2);//获取第二列字段的值
                long class_id=resultSet.getLong(3);//获取第三列字段的值
                System.out.println(MessageFormat.format("学生id={0},姓名={1},班级={2}",id,name,class_id));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally{// 释放资源(从后往前释放),关闭连接
            if(resultSet!=null){
                try{
                    resultSet.close();
                }catch (SQLException e){
                    e.printStackTrace();
                }
            }
            if(statement!=null){
                try {
                    statement.close();
                }catch (SQLException e){
                    e.printStackTrace();
                }
            }
            if(connection!=null){
                try {
                    connection.close();
                }catch (SQLException e){
                    e.printStackTrace();
                }
            }
        }
    }
}

💥代码优化

封装

import com.mysql.cj.jdbc.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Random;

public class DB {
    //数据源
    private static DataSource dataSource=null;
    //数据库连接串
    private static final String url="jdbc:mysql://127.0.0.1:3306/java2?characterEncoding=utf8";
    //用户
    private static String user="root";
    //密码
    private static String password="123456";
    //当类加载到JVM时,执行数据源的初始化
    static {
        MysqlDataSource mysqlDataSource = new MysqlDataSource();
        mysqlDataSource.setURL(url);
        mysqlDataSource.setUser(user);
        mysqlDataSource.setPassword(password);
        dataSource = mysqlDataSource;
    }
    public  static void close(ResultSet resultSet, Statement statement, Connection connection){
        if(resultSet!=null){
            try{
                resultSet.close();
            }catch (SQLException e){
                e.printStackTrace();
            }
        }
        if(statement!=null){
            try {
                statement.close();
            }catch (SQLException e){
                e.printStackTrace();
            }
        }
        if(connection!=null){
            try {
                connection.close();
            }catch (SQLException e){
                e.printStackTrace();
            }
        }
    }
    //构造方法私有化,防止new这个对象
    private  DB(){};
    //获取数据连接
    public static Connection getConnection() throws SQLException{
        return dataSource.getConnection();
    }
}

使用jdbc插入数据 

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;

public class Demo3{
    //插入数据
    public static void main(String[] args) {
        Connection connection=null;
        PreparedStatement statement=null;
        //插入数据,不用获得结果集,要影响行数即可
        try{
            //获取数据库
            connection=DB.getConnection();
            //定义SQL
            String sql="insert into students(id,name,class_id) values(?,?,?)";
            //定义SQL预处理对象
            statement = connection.prepareStatement(sql);
            //接收用户参数
            Scanner scanner = new Scanner(System.in);
            System.out.println("请输入id");
            Long id= Long.valueOf(scanner.next());
            System.out.println("请输入姓名");
            String name= scanner.next();
            System.out.println("请输入班级");
            Long class_id= Long.valueOf(scanner.next());
            //用真实数据代替占位符
            statement.setLong(1,id);
            statement.setString(2,name);
            statement.setLong(3,class_id);
            //获取结果,影响的行数
            //executeUpdate执行返回结果是一个整形,通常用于insert、delete、update
            int row=statement.executeUpdate();
            //判断
            if(row==1){
                System.out.println("插入成功");
            }else{
                System.out.println("插入失败");
            }
        } catch (SQLException e) {
            e.printStackTrace();

        }finally {
            //关闭连接,释放资源
            DB.close(null,statement,connection);
        }
    }

}

✨DriverManger和DataSource的区别

  • DriverManger每次调用都会初始化一个新的连接,导致资源浪费;
  • DataSource使用连接池的技术,一个连接可以重复使用,用DataDource替代DriverManger.getConnection()直连方式,更直接,灵活。

网站公告

今日签到

点亮在社区的每一天
去签到