MySQL之JDBC概述 - 是什么?干什么?JDBC连接数据库的详细步骤(IDEA)

目录

 一、JDBC是什么?

二、使用JDBC操纵数据库步骤

1. 安装JDBC驱动包

2. 在程序中导入驱动包

3. 连接数据库

4. JDBC操纵数据库 


一、JDBC是什么?

JDBC是 用来执行SQL语句操纵数据库 的 一套规范性API接口

🔊 JDBC是操纵数据库的

可能有小伙伴用的是命令行或者图形界面操纵数据库。不过实际开发时,在自己编写的代码中访问数据库的情况较多。要想在自己编写的代码中操纵数据库,就需要用到JDBC

🔊  API接口

由一些类/方法/函数等组成,通过直接调用 API 接口来实现一些功能。比如之前在Java标准库中提供的一些类,可以叫做Java API

🔊 规范性

主流的数据库为了方便程序员实现客户端程序,会提供一些API接口。借助这些接口,我们可以比较方便的访问数据库服务器。不过主流的数据库厂商很多,各家的API百花齐放不尽相同,实际开发过程中使用的非常不顺畅。

于是为了统一,Java提出了一套标准的接口体系。所有厂商将自家的API往标准适配,于是有了适配的程序包叫做JDBC驱动包。

在Java JDBC编程中对数据库的操作均使用JDK自带的API统一处理,通常与特定数据库的驱动类是完全解耦的。我们不用学各家数据库的API,只需要掌握Java JDBC API (位于 java.sql 包下)即可掌握Java数据库编程。

二、使用JDBC操纵数据库步骤

进行JDBC编程,需要先安装MySQL对应的驱动包再进行相关操作,我们一步一步来...

1. 安装JDBC驱动包

各大网站很容易搜到

2. 在程序中导入驱动包

🟢先创建一个项目

🟢再创建一个lib目录(名字自取)

🟢将下载好的驱动包复制到lib目录下(一直点ok即可)

🟢 add驱动包

🔴常见错误

 没找到add键 -> 创建lib目录的路径不对,一定要根据图示在主项目的目录下创建

3. 连接数据库

//1. 使用Datasource类,描述MySQL服务器的位置
  DataSource dataSource=new MysqlDataSource();
 ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/Test?characterEncoding=utf8&useSSL=false");
 ((MysqlDataSource)dataSource).setUser("root");
 ((MysqlDataSource)dataSource).setPassword("123456");

//2. 和数据库服务器建立连接
  Connection connection=dataSource.getConnection();//处理异常
  System.out.println(connection);

🟢如果出现下列输出,则表示连接成功 ~

🔴 任何一个细节错误,都会导致连接失败!

      检查url地址:符号是否正确,数据库test是否已经创建;

      检查密码:密码是当时安装时设置的那个用户密码

🔊 关于URL地址

 URL即统一资源定位符,用来表示互联网上的某个资源地址

🔊 为什么先向上转型又向下转型?直接用MysqlDataSource创建对象不可以吗?

      使用DataSource创建,得到的数据源是DataSource类型。后续写其他代码,如果使用到  数据源,持有的类型也是DataSource类。DataSource是通用的类型,可以指带任何数据库。如果以后需要更换数据库,代码改动量小;

      使用MysqlDataSource,得到的数据源是MysqlDataSource类型。而MysqlDataSource是  MySQL特有的类型,后续如果需要更换数据库,代码改动量大

🔊 不用记url代码,使用时直接复制即可 ~

 

4. JDBC操纵数据库 

数据库Test中有一个student表,结构如下图所示。我们使用这个案例作为参考,展示相关操作

 🟣 插入

package learn.day;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;

public class JDBCTest1 {
    public static void main(String[] args) throws SQLException {
        //1. 使用Datasource类,描述MySQL服务器的位置
        DataSource dataSource=new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/work5?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("jiuban521");

        //2. 和数据库服务器建立连接
        Connection connection=dataSource.getConnection();

        //3. 用户输入信息
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入学号:");
        int id=scanner.nextInt();
        System.out.println("请输入姓名:");
        String name=scanner.next();

        //4. 构造SQL语句-JDBC操作数据库,本质上还是通过SQL来描述数据库操作
        String sql=" insert into student values("+id+",' "+name+" ') ";//相当于insert into student values(id,name)。id,name是自己输入的数据
        PreparedStatement statement=connection.prepareStatement(sql);
        //注意:sql需要搭配PreparedStatement对象使用,不能只写一个String

        //5. 执行sql语句
        // update、delete、insert操作都是通过executeUpdate来执行的
        // 查询操作不同,通过executeQuery来执行
        int n=statement.executeUpdate();
        System.out.println(n);

        //6. 断开连接,释放资源
        statement.close();
        connection.close();
        //注意:断开连接的先后顺序,先断statement
    }
}

🔊 一些细节

   Connection选择的是java.sql,不是com.mysql.jdbc

 易错点:一定要选择java.sql,否则没办法完成增加操作

   Connection连接时需要处理异常

   System.out.println(n)输出改变的行数

🔊 拓展小知识

网络通信中,有两种风格

① 有连接 - 相当于“打电话”,有人接才传送信息

② 无连接 - 相当于“发微信”,不管是否接通,都先传送信息

数据库采用的是有连接的方式。好处是,保证通信的过程中线路畅通;坏处是,需要对连接进行管理,及时释放不需要用的连接(有点像打电话,没有断开通话,外面没办法打进来)

不过使用字符串拼接的方式不够科学

① 引号容易出混淆、出错

② 可能出现安全性问题(sql注入攻击 - 如果用户输入时故意构特殊代码,比如name=);drop table等代码,后果非常严重)

所以我们需要在原来代码的基础上进行改进,改进 “构造sql” 这一块的代码:

package learn.day;

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

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

public class JDBCTest1_1{
    public static void main(String[] args) throws SQLException {
        //1. 描述位置
        DataSource dataSource=new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/work5?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("jiuban521");

        //2. 建立连接
        Connection connection=dataSource.getConnection();

        //3. 用户输入
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入学号:");
        int id=scanner.nextInt();
        System.out.println("请输入姓名:");
        String name=scanner.next();

        //4. 构造sql语句
        String sql="insert into student values(?,?)";//使用?作为占位符,后续用statement对象针对?进行替换
        PreparedStatement statement=connection.prepareStatement(sql);
        statement.setInt(1,id);//针对第一个?,替换成id
        statement.setString(2,name);//针对第二个?,替换成name

        //5. 执行sql语句
        int n=statement.executeUpdate();
        System.out.println(n);

        //6. 断开连接,释放资源
        statement.close();
        connection.close();
    }
}

 🟣 更新

package learn.day;

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

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

public class JDBCTest2{
    public static void main(String[] args) throws SQLException {
        //1. 描述位置
        DataSource dataSource=new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/work5?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("jiuban521");

        //2. 建立连接
        Connection connection=dataSource.getConnection();

        //3. 用户输入信息
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入你准备修改的同学学号id:");
        int id=scanner.nextInt();
        System.out.println("请输入你要修改后的信息:");
        String name=scanner.next();

        //4. 构造sql语句4
        String sql="update student set name = ? where id = ?";
        PreparedStatement statement=connection.prepareStatement(sql);
        statement.setString(1,name);
        statement.setInt(2,id);
        System.out.println(statement);

        //5. 执行sql语句
        int n=statement.executeUpdate();
        System.out.println(n);

        //6. 断开连接,释放资源
        statement.close();
        connection.close();
    }

}

 🟣 删除

package learn.day;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;

public class JDBCTest3 {
    public static void main(String[] args) throws SQLException {
        DataSource dataSource=new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/work5?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("jiuban521");

        Connection connection=dataSource.getConnection();

        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入你要删除的学生的学号:");
        int id=scanner.nextInt();
        System.out.println("请输入你要删除的学生的学号:");
        String name=scanner.next();

        String sql="delete from student where id=? and name=?";
        PreparedStatement statement=connection.prepareStatement(sql);
        statement.setInt(1,id);
        statement.setString(2,name);
        System.out.println(statement);

        int n=statement.executeUpdate();
        System.out.println(n);

        statement.close();
        connection.close();
    }
}

 🟣 查询

package learn.day;

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;

public class JDBCTest4 {
    public static void main(String[] args) throws SQLException {
        //描述位置
        DataSource dataSource=new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/work5?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("jiuban521");

        //建立连接
        Connection connection=dataSource.getConnection();

        //直接查全表,不设置用户输入
        //构造 sql语句
        String sql="select * from student";
        PreparedStatement statement =connection.prepareStatement(sql);

        //执行sql语句
        //我们需要得到的是一张表的所有值,所以前面的executeUpdate返回类型为int不再适用
        //这里使用executeQuery,返回类型是ResultSet
        ResultSet resultSet= statement.executeQuery();
        //拿到结果集results,需要遍历打印
        while(resultSet.next()){
            int id=resultSet.getInt("id");
            String name=resultSet.getString("name");
            System.out.println(id+":"+name);
        }

        //断开连接,释放资源
        statement.close();
        connection.close();
    }
}

🔊 ResultSet的用法

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值