数据库:JDBC编程

专栏目录

MySQL基本操作-CSDN博客

MySQL基本操作-CSDN博客

数据库的增删查改(CRUD)基础版-CSDN博客

数据库增删改查(CRUD)进阶版-CSDN博客

数据库的索引-CSDN博客

基本概念

JDBC编程就是通过Java代码来操作数据库

api

数据库是一个类别:MySQL,Oracle,sql server,sqlite

代码操作数据库的前提:数据库提供api,我们要调用api才能完成操作

(api:application programming interface 应用程序调用接口,就是一些实现好的类和方法

(只要是基于某个东西来编程,就需要这个东西提供api)

如果某个东西提供的api特别多,就会把这个东西叫做SDK

我们平时说的JDK就是JAVA SDK(Java开发工具包)

每个数据库软件的api不同,但是Java把这些api重新封装,形成一套api的标准,程序员就不需要再关心数据库的api差异了😊


安装JDBC

1)引入mysql的jdbc驱动包

这种驱动包属于第三方库,JDK里面是没有的

我们可以到Java世界里的中央仓库里面获取Maven 存储库:搜索/浏览/探索 (mvnrepository.com)

第一个是更高版本的驱动包,第二个是低版本的

我们选择第二个就好了

因为我的MySQL服务器用的是5的,所以这里也要用5系列的驱动包

下载下来的是.jar的文件,本质上是一个压缩包,主要是存放Java程序编译文件.class文件

左边的.pom文件是maven项目的配置文件,不用理他

2)把jar包引入到项目中

随便在项目中创建一个目录,把jar包拷贝进去

再点击add as library就好了


编写JDBC代码

第一步

数据库是服务器,服务器可能在你的主机上,也可能在其他主机上,所以我们要明确服务器的位置

一般都是用ip地址+端口号+数据库名 来定位的

ip地址是用来描述一个主机在网路上的位置,往往由一串数字构成

一般用环回ip:127.0.0.1 (表示主机)来进行举例

端口号:区分不同的服务程序,相当于快递包裹里的手机号(MySQL默认端口号3306)

java 复制代码
        //1.创建数据源,数据源描述了你要操作的数据库在哪里
        DataSource dataSource = new MysqlDataSource();

DataSource是JDBC提供的接口,MysqlDataSource是MySQL驱动包提供的

实现类提供的方法

当然下面这种写法也没问题

但是业内一般用第一种方法,原因:

拓展:低耦合,高内聚

耦合:两个东西之间的关联关系,关联越紧密,耦合就越高

代码耦合高了,后面改某个代码前面的代码就容易出bug
内聚:把有关系的代码放到一起,不要放的东一处西一处的

低内聚:某个功能的代码会散落在各个地方

高内聚:把有关联的代码放到一起

返回我们刚刚的代码

这里的url可以不用记,password就是你数据库的密码

java 复制代码
        ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/javasql?characterEncoding=tuf8&&useSSL=false");
        ((MysqlDataSource) dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("1234");

第二步

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

这里的建立连接是抽象连接,通信双方保存各自的信息而已

注意:这里的Connection要用第一个


第三步

java 复制代码
        //3.构造一个sql,需要把sql转成String对象
        String sql = "insert into student values(1,'张三')";
        PreparedStatement statement = connection.prepareStatement(sql);

PreparedStatement:prepared表示预处理过的,已经解析的sql语句

通过控制台写sql,是先把sql发给服务器,服务器解析并执行的

statement也差不多

但是PreparedStatement可以在客户端这边先提前把sql解析好,把解析后的结果发给服务器,服务器的开销就大幅度降低了


第四步

java 复制代码
        //4.把构造好的sql发送给服务器执行
        int n = statement.executeUpdate();
        System.out.println("n= " + n);

此时代码会构造一个网络请求,发送给mysql服务器,这个代码相当于扮演了mysql客户端的角色

等待服务器的相应数据,把得到的相应最终显示在控制台上


第五步

java 复制代码
        //5.释放必要的资源
        statement.close();
        connection.close();

这两个对象内部有一些计算机的重要软/硬件资源,需要释放

释放的顺序与创建的顺序相反


程序执行之后我们就能在我们学生表里看见变化了

而itellij里面打印的

表示有1行受到影响

整个的代码

java 复制代码
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

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

public class TestJDBC {
    public static void main(String[] args) throws SQLException {
        //1.创建数据源,数据源描述了你要操作的数据库在哪里
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/javasql?characterEncoding=utf8&&useSSL=false");
        ((MysqlDataSource) dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("1234");

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

        //3.构造一个sql,需要把sql转成String对象
        String sql = "insert into student values(2,'李四')";
        PreparedStatement statement = connection.prepareStatement(sql);

        //4.把构造好的sql发送给服务器执行
        int n = statement.executeUpdate();
        System.out.println("n= " + n);

        //5.释放必要的资源
        statement.close();
        connection.close();
    }
}

修改代码

上面的代码里的sql指令是写死的,也就是说,要想插入其他数据就需要修改代码,重新编译!

一般程序员写的代码要打包发给用户,每个用户要修改需求就要你修改代码里的sql语句,这样会很麻烦

所以我们要让用户输入信息

java 复制代码
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入学号:");
        int id = scanner.nextInt();
        System.out.println("请输入姓名:");
        String name = scanner.next();
        //3.构造一个sql,需要把sql转成String对象
        String sql = "insert into student values(" + id + ",'" + name + "')";

这种字符串拼接很丑陋,而且有sql注入攻击的风险

如果用户不好好输入name,他直接给你输入什么); drop database....

那完蛋了你的数据库可能就被端了

我们换种写法

这里的?作为占位符,然后用下面的setInt和setString方法分别把这两个?号的位置填上

这样写比较安全


插入,修改,删除的jdbc代码其实完全一样

查询的就不太一样,因为查询会有一个返回的结果集合(临时表)

查询的代码

前面的操作差不多,到了第四步执行,我们用类似迭代器遍历的方式遍历每行数据

这里的ResultSet就是结果集合,代表查询返回的临时表

这个循环来遍历这张表,想象初始情况下,光标指向第一行上的第一个位置,每次调用next(),光标就会往下走一行

整个执行代码

java 复制代码
        //执行sql
        ResultSet resultSet = statement.executeQuery();
        while(resultSet.next()){
            //获取"id"这一列的数值
            int id = resultSet.getInt("id");
            //获取"name"这一列的数值
            String name = resultSet.getString("name");
            System.out.println("id: "+id);
            System.out.println("name: "+name);
        }
相关推荐
dengjiayue5 分钟前
MySQL 性能瓶颈,为什么 MySQL 表的数据量不能太大?
数据库·mysql
席万里7 分钟前
【MySQL学习笔记】关于索引
笔记·学习·mysql
m0_7482323927 分钟前
python3 Flask应用 使用 Flask-SQLAlchemy操作MySQL数据库
数据库·mysql·flask
苹果醋333 分钟前
Vue3响应式数据: 深入分析Ref与Reactive
java·运维·spring boot·mysql·nginx
竹影卿心1 小时前
Java连接HANA数据库
java·数据库·windows
anddddoooo1 小时前
Kerberoasting 离线爆破攻击
网络·数据库·安全·microsoft·网络安全
time never ceases1 小时前
Elasticsearch安装和数据迁移
大数据·数据库·elasticsearch·es
Just_Do_IT_OK2 小时前
Docker--MySql
mysql·docker·容器
程序员shen1616112 小时前
注意⚠️:矩阵系统源码开发/SaaS矩阵系统开源/抖音矩阵开发优势和方向
java·大数据·数据库·python·php
IvorySQL2 小时前
2024 开放原子开发者大会活动回顾|瀚高 IvorySQL 开源数据库在国产软件的开源实践
数据库·postgresql·开源数据库·国产数据库·ivorysql