【MySQL】Java-JDBC

MySQL & Java & JDBC

  • 其实各种各样的语言都可以操控数据库的

    • 例如C, C++, python, Java~
    • 数据库也有很多MySQL便宜好用^v^
  • 这里以MySQL与Java,JDBC编程为例~

  • 特别注意的是:此文章只展现我认为比较好的一种操控方法,其他方法我保持中立~

    • 以下也是我通过简化后的理解~

1. JDBC本质

  • JDBC ==> Java DataBase Connectivity

    • Java 数据库连接~
  • 本质上就是一个 API

    • API ==> Application Programming Interface
    • 应用编程接口,学习完Java后的我们可想而知已经对接口有很大认知了~
    • 没错,Java内置了很多接口类,通过这些接口类,就可以对数据库进行操纵~
    • Java提供一套标准的API,规定好这些数据库统一的访问方式,数据库厂商按这个要求制作API和对应驱动包~
      • 多个数据库迎合一个语言才比较合理~
  • 但是这些接口有名无实~

  • 必须下载驱动包,即下载配置数据库厂商提供的API和驱动包
    在这里插入图片描述


JDBC优势:

  • Java语言访问数据库操作完全面向抽象接口编程
  • 开发数据库应用不用限定在特定数据库厂商的API
    • 他们就是按照咱们的标准做的~
  • 程序的可移植性大大增强

1.1 “.jar文件” – 驱动包下载与配置

  • jar扩展名也是一种压缩包~

    • 与jdk有关~
  • 点击此链接: mysql-connector-java-5.1.49.jar · 游离态

    • 在这里插入图片描述
  • 下载保存到熟悉的地方~

    • 在这里插入图片描述
  • 在一个项目的**.idea文件**中建立一个新的目录

    • 在这里插入图片描述
  • 命名,我习惯命名为lib(library,在程序员世界里一般指代库的意思~)

    • 在这里插入图片描述
  • 将刚才的 “.jar文件”放在这各lib目录下,我用的是Ctrl + C 和Ctrl + V ,将文件中间导入~

    • 在这里插入图片描述
  • 确认后将lib目录添加为库~

    • 在这里插入图片描述
  • 确认~

    • 在这里插入图片描述
  • OK了~

    • 在这里插入图片描述
  • 这样之后就可以正常使用接口了~


2. JDBC编程

2.1 构建数据源

  • 程序与数据库进行联系~
  • 在这里插入图片描述
public class Test {
    public static void main(String[] args) {
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/" +
                /*这里java107含义是数据库名*/"java107?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("我的密码");
    }
}
2.1.1 MysqlDataSource
  • 普通类实现接口,这是Java程序员的习惯
  • 这个类里有更多的方法,但是太多,我们只需要等一下向下转型用三个设置方法~
2.1.2 setUrl
  • URL简单来说就是一个这个数据源的定位器
    • 简单的理解为地址呗
    • 程序联系数据库~
  • “jdbc:mysql://127.0.0.1:3306/java107?characterEncoding=utf8&useSSL=false”
    • 这个复制粘贴就好,现在的知识储备还不能理解~
    • 这里的java107为已存在的数据库的数据库名,我们也可以通过输入字符串,通过字符串拼接
    • 起自定义控制数据库的~
2.1.3 setUser
  • 设置为根用户(root),拥有权限去做后面的事情
2.1.4 setPassword
  • 输入MySQL账户的密码~
    • 密码错误当然进不去~

2.2 用本地数据源建立连接器

        Connection connection = dataSource.getConnection();

在这里插入图片描述

  • 会报异常
    • 这个异常JVM解决的了~
    • 直接throws或者try catch 去处理~
    • alt + 回车~

在这里插入图片描述

  • 通过这个连接器,就可以跟MySQL服务器交互了~
    在这里插入图片描述

2.3 通过连接器将SQL语句转化为“准备状态”

  • 通过连接器,建立该语句通往服务器的通道,“准备状态”即一触即发~
  • SQL语句就是一个字符串对象
    在这里插入图片描述
String sql = "insert into classes (id, name) values (4, \'软件工程2022级卓越2班\')";
//“增语句”~
//‘ 单引号在java常字符串中,是特殊的,所以要用\去 去除特殊化~
PreparedStatement preparedStatement = connection.prepareStatement(sql);
  • 如果打印这个“准备状态”的话

  • System.out.println(preparedStatement);

在这里插入图片描述

2.4 触发这个准备状态~

2.4.1 非查询语句

在这里插入图片描述

  • 这个语句只要不是查询语句,就可以用到这个方法去触发~

    • 包括索引事物甚至创造数据库和表
  • 程序自定义输入信息~

    • Java提供了个语法,只要在需要自定义信息的位置用“ ?”代替,后续可以处理准备状态的SQL语句,进行自定义~
      • 这个方法很安全,因为通过后续方法插入的信息会被检查~
    • 自定义不代表整条语句交给程序员无限制的自定义
      • 如果通过简单拼接,甚至让程序员输入整条SQL语句的话
        • 如果别有用心,通过特殊语法,从中插入一条删除语句也不是不可能~
      • 这特别危险!
        Scanner scanner = new Scanner(System.in);
        int id = scanner.nextInt();
        String name = scanner.nextLine();

        preparedStatement.setInt(1, id);
        preparedStatement.setString(2, name);

        System.out.println(preparedStatement.executeUpdate());
  • setInt ==> 设置整数, 参数为 “通配符?”的编号, 填入整数
    • 编号即从左到右 “?” 是第几个~
  • setString ==> 参数为 “通配符?”的编号, 填入字符串~

在这里插入图片描述

2.4.2 查询语句

在这里插入图片描述

  • 这个语句只能是查询性质的语句==> 即show语句或者select语句
  • 返回的这个结果集,也是一个迭代器~
    • 并不属于集合类,不能for-each遍历
  • 用类似于迭代器的方法去遍历
        String searchSql = "select id, name from classes";
        preparedStatement.close();
        preparedStatement = connection.prepareStatement(searchSql);
        ResultSet set = preparedStatement.executeQuery();
        while(set.next()) {
            id = set.getInt("id");
            name = set.getString("name");
            System.out.println(id + " " + name);
        }

在这里插入图片描述

2.4.2.1 迭代原理

在这里插入图片描述

  • 一开始set是处于这个列表头的位置

  • 所以这个时候去获取当前行的数据的时候,必然是会报错的~

  • 在这里插入图片描述

  • set.next( ) 作为循环条件~

  • 在这里插入图片描述

  • set的getxxx方法,获取当前行的信息~

    • 输入的是成员名/别名~

2.5 释放空间

  • 每个客户端这么搞,数据库服务器是有负担的,我们要对这些对象进行释放关闭~
    • 就像吃完饭,要从饭店离开~
  • 后创建的先释放~
    • 否则先创建的对象的释放影响后面的对象的释放~
set.close();
preparedStatement.close();
connection.close();
  • 数据源不需要释放,因为还没跟数据库服务器有联系呢~

3. 知识点补充

3.1 创建数据库

  • 我们现在只是浅浅了解,后续有更多的语法随着我们学习JavaEE,我们会继续完善~

  • 目前我们需要进入一个已知的数据库~

  • 补充知识:show语句虽然没有where语句,但是有like模糊匹配

    • 库名/表明进行模糊匹配~直接作为条件,判断是否输出
    • 在这里插入图片描述
  • 通过show语句执行后形成的结果集,判断是否存在此库~(用next方法)

  • 不存在就执行改造数据库~

    public static void main(String[] args) throws SQLException {
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/" +
                /*这里java107含义是数据库名*/"java107?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("mmsszsd666");
        Connection connection = dataSource.getConnection();
        String sql = "show databases like \"newOne\"";//查询性质的语句
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        ResultSet set = preparedStatement.executeQuery();
        if(set.next()) {
            System.out.println("数据库已存在");
        }else{
            System.out.println("创建数据库");
            preparedStatement.close();
            String createSql = "create database newOne charset = utf8";
            preparedStatement = connection.prepareStatement(createSql);
            preparedStatement.executeUpdate();
        }
        set.close();
        preparedStatement.close();
        connection.close();
    }
  • 在数据库那儿进行验证~
    • 在这里插入图片描述

3.2 创建表~

  • 思路差不多~
  • 我在newOne中建立一个新表
  • 在释放资源之前调用函数:createNewOne(Connection connection)
public static void createNewOne(Connection connection) throws SQLException {
    String useSql = "use newOne";
    PreparedStatement preparedStatement = connection.prepareStatement(useSql);
    preparedStatement.executeUpdate();
    preparedStatement.close();

    String searchSql = "show tables like \"Student\"";
    preparedStatement = connection.prepareStatement(searchSql);
    ResultSet set = preparedStatement.executeQuery();
    if(set.next()) {
        System.out.println("已有此表");
    }else{
        preparedStatement.close();
        String sql = "create table Student (id int, name varchar(20))";
        preparedStatement = connection.prepareStatement(sql);
        preparedStatement.executeUpdate();
        System.out.println("创建成功");
    }
    set.close();
    preparedStatement.close();
    connection.close();
}
  • executeUpdate也可以执行use语句~
  • 在数据库那儿进行验证~
    • 在这里插入图片描述

3.3 对于查询语句的结果集

  • 如果一个“准备状态”被执行第二次,上一次的结果集直接强制被释放~

  • 		ResultSet resultSet1 = preparedStatement.executeQuery();
    		ResultSet resultSet2 = preparedStatement.executeQuery();
            while(resultSet1.next()) {
                int id = resultSet1.getInt("id");
                String name = resultSet1.getString("name");
                System.out.println(id + " " + name);
            }
            while(resultSet2.next()) {
                int id = resultSet2.getInt("id");
                String name = resultSet2.getString("name");
                System.out.println(id + " " + name);
            }
            System.out.println("--------------------------------------------------");
    

在这里插入图片描述

  • 被释放后还去使用必然是会报异常的~

文章到此结束!谢谢观看
可以叫我 小马,我可能写的不好或者有错误,但是一起加油鸭🦆

这是我的代码仓库!(在马拉圈的23.3里)代码仓库

本次可代码具体位置:jdbc简洁无笔记版/src/Test.java · 游离态

邮箱:2040484356@qq.com

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

s:103

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

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

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

打赏作者

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

抵扣说明:

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

余额充值