数据库: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)

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

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

实现类提供的方法

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

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

拓展:低耦合,高内聚

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

代码耦合高了,后面改某个代码前面的代码就容易出bug

内聚:把有关系的代码放到一起,不要放的东一处西一处的

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

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

返回我们刚刚的代码

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

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

 第二步

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

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

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

 


第三步

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

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

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

statement也差不多

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


 第四步

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

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

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


第五步

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

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

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


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

而itellij里面打印的

表示有1行受到影响

整个的代码

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语句,这样会很麻烦

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

        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(),光标就会往下走一行

整个执行代码

        //执行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);
        }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/226577.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【广州华锐互动】风电场检修VR情景模拟提供接近真实的实操体验

风电场检修VR情景模拟系统由广州华锐互动开发,这是一种新兴的培训方式,它通过虚拟现实技术将风力发电场全范围进行1:1仿真建模还原,模拟监视风力发电场各种运行工况下的运行参数和指标,同时可进行升压站系统的巡视,倒闸…

C# 使用FluentScheduler触发定时任务

写在前面 FluentScheduler是.Net平台下的一个自动任务调度组件,以前经常用的是Quarz.Net,相对而言FluentScheduler的定时配置更为直观,可直接用接口进行参数化设置,对Cron表达式有恐惧症的人来说简直就是福音,使用起来…

Java网络编程,使用UDP实现TCP(一), 基本实现三次握手

简介: 首先我们需要知道TCP传输和UDP传输的区别,UDP相当于只管发送不管对方是否接收到了,而TCP相当于打电话,需要进行3次握手,4次挥手,所以我们就需要在应用层上做一些功能添加,如:…

Spring基于注解存储对象

小王学习录 前言基于注解存储对象Controller (控制器存储)Service (服务存储)Repository (仓库存储)Component (组件存储)Configuration (配置存储)Bean(方法注解) 前言 上一篇文章中已经介绍了在Spring中存储Bean和取Bean的方法. 而在 Spring 中想要更简单的存储和读取对象的…

让工作更高效,那些不能错过的8款泳道图绘制工具

在现代企业的运营管理中,泳道图扮演了至关重要的角色。这种独特的图表工具以其直观、清晰的特点,帮助我们理解和改进复杂的工作流程,从而提升效率。本文将为你分享8款实用且高效的泳道图绘制工具,它们能够帮助你轻松创建出专业级别…

Emscripten运行时

本章将简要介绍Emscripten环境下与运行时相关的部分知识,包括消息循环、文件系统、内存管理等内容。 main函数与生命周期 生成本地代码时,作为C/C程序的入口函数,通常main()函数意味着程序的整个生命周期,程序随main()函数返回的…

第二十一章网络通信总结博客

局域网与互联网 为了实现两台计算机的通信,必须用一个网络线路连接两台计算机。如下图所示 网络协议 1.IP协议 IP是Internet Protocol的简称,是一种网络协议。Internet 网络采用的协议是TCP/IP协议,其全称是Transmission Control Protocol/I…

对Spring源码的学习:一

目录 BeanFactory开发流程 ApplicationContext BeanFactory与ApplicationContext对比 基于XML方式的Bean的配置 自动装配 BeanFactory开发流程 这里的第三方指的是Spring提供的BeanFactory,Spring启动时会初始化BeanFactory,然后读取配置清单&#…

力扣每日一题:1466. 重新规划路线(2023-12-07)

力扣每日一题 题目:1466. 重新规划路线 日期:2023-12-07 用时:45 m 36 s 时间:37ms 内存:69.64MB 代码: class Solution {public int minReorder(int n, int[][] connections) {list new List[n];Arrays…

IPTABLES(一)

文章目录 1. iptables基本介绍1.1 什么是防火墙1.2 防火墙种类1.3 iptables介绍1.4 包过滤防火墙1.5 包过滤防火墙如何实现 2. iptables链的概念2.1 什么是链2.2 iptables有哪些链 3. iptables表的概念3.1 什么是表3.2 表的功能3.3 表与链的关系 4. iptables规则管理4.1 什么是…

Shell数组函数:数组——数组和循环(二)

for脚本快速定义数组 [rootlocalhost ~]# vim for12.sh #脚本编辑 #!/bin/bash for a in cat /etc/hosts do hosts[o]$a donefor i in ${!hosts[]} do echo "$i : ${hosts[$a]}" done[rootlocalhost ~]# vim for12.sh #执行脚本区别 :for的空格分割…

coredump

linux原生 一、设置 $ cat /proc/sys/kernel/core_pattern 通过查看core_pattern文件,发现其确实指定了一个路径,于是我前往那个路径,发现竟然是脚本程序,后来查看说明文件,才知道core_pattern中如果首先指定了一个 …

docker 可视化工具操作说明 portainer

官网地址 https://docs.portainer.io/start/install-ce/server/docker/linux 1.First, create the volume that Port docker volume create portainer_data2.下载并安装容器 docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restartalways -v /var/run/docker…

前端:让一个div悬浮在另一个div之上

使用 CSS 的 position 属性和 z-index 属性 首先,将第二个 div 元素的 position 属性设为 relative 或 absolute。这样可以让该元素成为一个定位元素,使得后代元素可以相对于它进行定位。 然后,将要悬浮的 div 元素的 position 属性设为 ab…

DOS 批处理 (二)

DOS 批处理 1. 基础 DOS 命令1.1 基础命令1.2 文件系统操作1.3 文件夹管理1.4 文件管理1.5 网络相关1.6 系统管理1.7 IF、FOR和NETIFFORNET 1. 基础 DOS 命令 command /? 查找帮助DOS命令不区分命令字母的大小写 C:\Users\Administrator>echo 1 1 C:\Users\Administrator…

SQL面试题,判断if的实战应用

有如下表,请对这张表显示那些学生的成绩为及格,那些为不及格 1、创建表,插入数据 CREATE TABLE chapter8 (id VARCHAR(255) NULL,name VARCHAR(255) NULL,class VARCHAR(255) NULL,score VARCHAR(255) NULL );INSERT INTO chapter8 (id, n…

嵌入式系统

嵌入式系统 目前国内一个普遍认同的嵌入式系统定义是:以应用为中心、以计算机技术为基础,软件硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。(引用自《嵌入式系统设计师教程》) …

点评项目——商户查询缓存

2023.12.7 redis实现商户查询缓存 在企业开发中,用户的访问量动辄成百上千万,如果没有缓存机制,数据库将承受很大的压力。本章我们使用redis来实现商户查询缓存。 原来的操作是根据商铺id直接从数据库查询商铺信息,为了防止频繁地…

一维相位解包裹

一维相位解包裹 本文首先介绍最简单的一维的位相解包裹算法。设W是包裹运算符,中是解包裹位相,是包裹的位相。则一维位相解包裹可表示为: 解包裹就是要选取正确的k,满足: 两个相邻像素位相的差值如下: 由式(2-1)和式(2…

JOSEF快速中间继电器DZK-916 4A AC220V板后嵌入式安装

系列型号 DZK-911快速中间继电器;DZK-912快速中间继电器; DZK-914快速中间继电器;DZK-916快速中间继电器; DZK-917快速中间继电器;DZK-918快速中间继电器; DZK-924快速中间继电器;DZK-934快速中…