Java的数据库编程:JDBC

news2025/1/23 12:10:10

Content

🎉1什么是API

🎉2.什么是JDBC

🎉3.数据库驱动包的安装

🎉4.数据库安装包在idea的使用

🎉5.JDBC的增删改查的简单实现

今天为大家带来JAVA的数据库编程,也就是用Java实现数据库

数据库的最基本的操作就是增删改查

在实工作中,手敲sql语句几乎用不到,更多的是用代码来实现sql语句

像常见的数据库,比如mysal,sqlsever,Oracle等数据库软件,在开发的时候会提供编程的接口,叫做API

什么是API呢,也就是实现某种功能,例如Java的接口,就是API,比如Collection接口,里面有很多方法,可以实现很多功能,总的来说API多用于函数的形式来表示

现在要用Java实现数据库,那么也需要提供一个API用来对接Java和数据库,那么就要用JDBC,Java对数据库提出要求,数据库本来的功能上要增加一些来匹配Java,这样才可以让Java操作数据库,执行数据库.

JDBC,全称,Java Database Connectivity,是java和数据库的连接。是一种用于执行SQL语句的Java API,它是 Java中的数据库连接规范。可以为多种关系数据库提供统一访问.

Java通过JDBC操作数据库,那jdbc和数据库建立连接的时候,需要使用数据库驱动包,就是对不同数据库的原生API进行封装,封装成JDBC认识的API,,Java需要在项目导入数据库驱动包,也才能执行数据库,那么我们就需要下载驱动包,这里我们选择去maven中央仓库下载

上链接

https://mvnrepository.com/

这个要和自己下载的数据库的版本要匹配,因为我下载的是5系列的,所以我要用这个,5开头的都可以选

点击这个

然后下载了,之后,建立一个项目,然后在项目点新建directory,拷贝这个地址,就建立了lib文件

就像这样,这样数据库就和java建立连接了,现在就可以开始在idea编辑数据库代码了

还是和数据库一样,实现增删改查,上代码

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

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

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: WHY
 * Date: 2023-03-03
 * Time: 20:57
 */
//JDBC实现sql
public class JDBCInsert {
    public static void main(String[] args) throws SQLException {
            //JDBC需要以下步骤完成开发
        //1.创建并初始化一个数据源
        DataSource dataSource=new MysqlDataSource();//向上转型
        ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java107?characterEncoding=utf8&useSSL=false");//向下转型,因为seturl这个方法是子方法特有的
        ((MysqlDataSource)  dataSource).setUser("root");//设置用户名
        ((MysqlDataSource)   dataSource).setPassword("1111");//就是数据库的密码
        //2.和数据库服务器建立连接
        Connection connection=dataSource.getConnection();
        //3.构造sql语句
        String sql="insert into student values(1,'张三')";

        PreparedStatement statement=connection.prepareStatement(sql);//提前预编译一下sql,客户端对发出的请求进行预编译,减轻服务器的压力
        //4.执行sql语句
      int ret=  statement.executeUpdate();
        System.out.println(ret);
        
        //5.释放必要的资源
        statement.close();
        connection.close();
    }
}

看看执行结果,在idea上结果是1的原因是,stament.executeUpdate这个方法返回类型就是int型的,代表修改的行数

执行完以后记得释放资源

现在对这段代码进行优化,发现在构造sql语句的时候比较麻烦,进行优化

String sql="insert into student values(1,'张三')"; 

这个语句把要输入的内容写死了,也就是硬编码,在现实开发环境中,要为用户考虑,所以要写用户输入

public class JDBCInsert {
    public static void main(String[] args) throws SQLException {
        Scanner scanner=new Scanner(System.in);
        //JDBC需要以下步骤完成开发
        //1.创建并初始化一个数据源
        DataSource dataSource=new MysqlDataSource();//向上转型
        ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java107?characterEncoding=utf8&useSSL=false");//向下转型,因为seturl这个方法是子方法特有的
        ((MysqlDataSource)  dataSource).setUser("root");//设置用户名
        ((MysqlDataSource)   dataSource).setPassword("1111");//就是数据库的密码
        //2.和数据库服务器建立连接
        Connection connection=dataSource.getConnection();
        //3.从控制台读取用户输入的的内容
        System.out.println("请输入姓名");
        String name=scanner.next();
        System.out.println("请输入学号");
        int id=scanner.nextInt();
        //4.构造sql语句
        String sql="insert into student values("+id+",'"+name+"')";

        PreparedStatement statement=connection.prepareStatement(sql);//提前预编译一下sql,客户端对发出的请求进行预编译,减轻服务器的压力
        //5.执行sql语句
        int ret=  statement.executeUpdate();
        System.out.println(ret);

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

但是这种写法容易产生sql注入问题

 public static void main(String[] args) throws SQLException {
        Scanner scanner=new Scanner(System.in);
        //JDBC需要以下步骤完成开发
        //1.创建并初始化一个数据源
        DataSource dataSource=new MysqlDataSource();//向上转型
        ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java107?characterEncoding=utf8&useSSL=false");//向下转型,因为seturl这个方法是子方法特有的
        ((MysqlDataSource)  dataSource).setUser("root");//设置用户名
        ((MysqlDataSource)   dataSource).setPassword("1111");//就是数据库的密码
        //2.和数据库服务器建立连接
        Connection connection=dataSource.getConnection();
        //3.从控制台读取用户输入的的内容
        System.out.println("请输入姓名");
        String name=scanner.next();
        System.out.println("请输入学号");
        int id=scanner.nextInt();
        //4.构造sql语句
        String sql="insert into student values(?,?)";

        PreparedStatement statement=connection.prepareStatement(sql);//提前预编译一下sql,客户端对发出的请求进行预编译,减轻服务器的压力
        statement.setInt(1,id);
        statement.setString(2,name);
        //5.执行sql语句
        int ret=  statement.executeUpdate();
        System.out.println(ret);

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

问号代表占位符,下面的setint里面的1,id代表第一个问号放id,第二个问号放name ,然后根据动态输入就自动放入到sql语句中

 

这一段就是Preparestatement方法拼接以后 的数据

释放资源:

数据库的客户端和服务器通过网络进行通信,需要占用一定的资源,但客户端很多,服务器很少时,要即及时释放资源

谁先创建,谁就后释放

DataSource内置了数据库连接池,可以复用连接,提高连接服务器的效率

现在写查询操作

public class TestDemo {
    public static void main(String[] args) throws SQLException {
        //JDBC需要以下步骤完成开发
        //1.创建并初始化一个数据源
        DataSource dataSource=new MysqlDataSource();//向上转型
        ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java107?characterEncoding=utf8&useSSL=false");//向下转型,因为seturl这个方法是子方法特有的
        ((MysqlDataSource)  dataSource).setUser("root");//设置用户名
        ((MysqlDataSource)   dataSource).setPassword("1111");//就是数据库的密码
        //2.和数据库服务器建立连接
        Connection connection=dataSource.getConnection();
        //3.构造sql语句
        String sql="select* from student";

        PreparedStatement statement=connection.prepareStatement(sql);//提前预编译一下sql,客户端对发出的请求进行预编译,减轻服务器的压力
        //4.执行sql语句
      ResultSet resultSet= statement.executeQuery();
      //5遍历结果集合
       while(resultSet.next()){
           int id=resultSet.getInt("id");
           String name=resultSet.getString("name");
           System.out.println("+id+"+id+"name"+name);
       }

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

 resultset这个代表查询的结果集,用到的get方法相当于就是拿到某下标 的元素

删除操作

public static void main(String[] args) throws SQLException {
        Scanner scanner=new Scanner(System.in);
        //JDBC需要以下步骤完成开发
        //1.创建并初始化一个数据源
        DataSource dataSource=new MysqlDataSource();//向上转型
        ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java107?characterEncoding=utf8&useSSL=false");//向下转型,因为seturl这个方法是子方法特有的
        ((MysqlDataSource)  dataSource).setUser("root");//设置用户名
        ((MysqlDataSource)   dataSource).setPassword("1111");//就是数据库的密码
        //2.和数据库服务器建立连接
        Connection connection=dataSource.getConnection();
        /*//3.从控制台读取用户输入的的内容
        System.out.println("请输入姓名");
        String name=scanner.next();
        System.out.println("请输入学号");
        int id=scanner.nextInt();*/
        //4.构造sql语句
        String sql="delete from student where id=1";

      PreparedStatement statement=connection.prepareStatement(sql);//提前预编译一下sql,客户端对发出的请求进行预编译,减轻服务器的压力
      /*  statement.setInt(1,id);
        statement.setString(2,name);*/
        System.out.println(statement);
        //5.执行sql语句
        int ret=  statement.executeUpdate();
        System.out.println(ret);

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

修改操作

 public static void main1(String[] args) throws SQLException {
        Scanner scanner=new Scanner(System.in);
        //JDBC需要以下步骤完成开发
        //1.创建并初始化一个数据源
        DataSource dataSource=new MysqlDataSource();//向上转型
        ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java107?characterEncoding=utf8&useSSL=false");//向下转型,因为seturl这个方法是子方法特有的
        ((MysqlDataSource)  dataSource).setUser("root");//设置用户名
        ((MysqlDataSource)   dataSource).setPassword("1111");//就是数据库的密码
        //2.和数据库服务器建立连接
        Connection connection=dataSource.getConnection();
        /*//3.从控制台读取用户输入的的内容
        System.out.println("请输入姓名");
        String name=scanner.next();
        System.out.println("请输入学号");*/
        /*int id=scanner.nextInt();*/
        //3.构造sql语句
        String sql="update student set id=12 where name='张三'";

        PreparedStatement statement=connection.prepareStatement(sql);//提前预编译一下sql,客户端对发出的请求进行预编译,减轻服务器的压力

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

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

这就是今天的所有内容了,我们下期再见!!!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分布式锁简介

Redis因为单进程、性能高常被用于分布式锁;锁在程序中作用是同步工具,保证共享资源在同一时刻只能被一个线程访问。 Java中经常用的锁synchronized、Lock,但是Java的锁智能保证单机的时候有效,分布式集群环境就无能为力了&#xf…

软件设计师错题集

软件设计师错题集一、计算机组成与体系结构1.1 浮点数1.2 Flynn分类法1.3 指令流水线1.4 层次化存储体系1.4.1 程序的局限性1.5 Cache1.6 输入输出技术1.7 总线系统1.8 CRC循环冗余校验码二、数据结构与算法基础2.1 队列与栈2.2 树与二叉树的特殊性2.3 最优二叉树(哈…

VisualSP Enterprise - February crack

VisualSP Enterprise - February crack VisualSP(可视化支持平台)提供了一个上下文中完全可定制的培训平台,它可以作为企业web应用程序的覆盖层提供。无论员工正在使用什么应用程序,他们都能够快速访问页面培训和指导,说明如何最有效地使用该…

C++基础了解-14-C++ 字符串

C 字符串 一、C 风格字符串 C 风格的字符串起源于 C 语言,并在 C 中继续得到支持。字符串实际上是使用 null 字符 \0 终止的一维字符数组。因此,一个以 null 结尾的字符串,包含了组成字符串的字符。 下面的声明和初始化创建了一个 RUNOOB …

教你如何搭建店铺—收支管理系统,demo可分享

1、简介1.1、案例简介本文将介绍,如何搭建店铺-收支管理。1.2、应用场景以店铺收支管理为核心,维度数据分析,智能指导门店经营,账目清晰一目了然,店铺经营更高效。2、设置方法2.1、表单搭建1)新建表单【客户…

如何使用码匠连接 DynamoDB

目录 在码匠中集成 DynamoDB 在码匠中使用 DynamoDB 关于码匠 DynamoDB 是亚马逊 AWS 的一种高性能、全托管的 NoSQL 数据库服务。作为一种数据源,DynamoDB 能够提供高度可扩展性、低延迟和可靠性。它支持多种数据类型和数据模型,包括键-值、文档和图…

元宇宙时代来临,Facebook豪掷百亿是谋略还是赌博?

"Facebook向元宇宙发起冲击,豪掷百亿是谋略还是赌博?"2022年,Facebook宣布将投资100亿美元用于元宇宙技术的开发和推广。这笔巨额资金的投入是否会给Facebook带来巨大的回报,还是一场高风险的赌博呢?首先&am…

【13种css选择器】学css选择器,这一篇就够了

举例形象让你学会,不搞官方话css所有的选择器相邻兄弟选择器后续兄弟选择器后代选择器子代选择器并集选择器(多重选择器)属性选择器伪类选择器伪元素选择器class选择器(类选择器)id选择器*选择器(通配符选择器)标签选择…

【算法之旅】初识数据结构与算法

一名软件工程专业学生的算法之旅,记录自己从零开始学习数据结构与算法,从小白的视角学习数据结构:数组、对象/结构、字符串、队列、栈、树、图、堆、平衡树/线段树等,学习算法:枚举、排序、搜索、计数、分治策略、动态…

Windows中配置docker没有hyper-v功能解决方案

👨 作者简介:大家好,我是Taro,前端领域创作者 ✒️ 个人主页:唐璜Taro 🚀 支持我:点赞👍📝 评论 ⭐️收藏 文章目录前言解决步骤:1.新建文档2. 另存为3. 功能…

Tomcat独立部署-Nginx-1.12.2配置SSL

目录 🏆1. 实现思路 🏆2. 重启服务器 🏆3. proxy_pass 后地址带/和不带/的url地址显示 🏆4. 配置SSL证书 🏆5. 遇到问题 🏆6. 参考文章 学习完本篇博客您将掌握: 1、使用Tomcat配置SSL域名…

SpringMVC中的拦截器不生效的问题解决以及衍生出的WebMvcConfigurationSupport继承问题思考

文章目录SpringMVC中的拦截器不生效的问题解决WebMvcConfigurationSupport继承问题思考SpringMVC中的拦截器不生效的问题解决 过滤器代码(被Spring扫描并管理): Component public class StuInterceptor implements HandlerInterceptor {Overridepublic boolean pr…

Dynamics365安装失败解决及注册编写

一、修改错误昨天登录报错今天开始返回我之前设置的断点开始重新配置,Reporing Services配置完成后发现dynamics365还是下载失败之后下载了一上午dynamics365就一直卡在最后的界面进度条不动索性我直接把所有环境都卸载了 连同虚拟机卸载重装终于在下午的时候dynami…

设计模式---工厂模式

目录 1. 简单工厂模式 2. 工厂方法模式 1. 简单工厂模式 简单工厂模式(Simple Factory Patterm)又称为静态工厂方法模式(Static Factory Model),它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义了一…

【Nginx】Nginx的安装配置

环境说明系统:Centos 7一、编译安装Nginx官网下载地址nginx: download#安装依赖 [rootnginx nginx-1.22.1]# yum install gcc pcre pcre-devel zlib zlib-devel -y #从官网下载Nginx安装包,并进行解压、编译、安装 [rootnginx ~]# wget https://nginx.or…

【第八课】空间数据基础与处理——数据结构转化

一、前言 数据结构即指数据组织的形式,是适合于计算机存储、管理和处理的数据逻辑结构。对空间数据则是地理实体的空间排列方式和相互关系的抽象描述。它是对数据的一种理解和解释,不说明数据结构的数据是毫无用处的,不仅用户无法理解,计算机程序也不能正确地处理,对同样一组数…

【C++学习】栈 | 队列 | 优先级队列 | 反向迭代器

🐱作者:一只大喵咪1201 🐱专栏:《C学习》 🔥格言:你只管努力,剩下的交给时间! 栈 | 队列 | 优先级队列 | 反向迭代器😼容器适配器🙈什么是适配器&#x1f64…

数据清洗和特征选择

数据清洗和特征选择 数据清洗和特征挖掘的工作是在灰色框中框出的部分,即“数据清洗>特征,标注数据生成>模型学习>模型应用”中的前两个步骤。 灰色框中蓝色箭头对应的是离线处理部分。主要工作是 从原始数据,如文本、图像或者应…

MySQL的基本语句(SELECT型)

基本MySQL语句SELECTSELECT FROM 列的别名去除重复行空值着重号算术运算符加法( )减法( - )乘法( * )除法&#xff08; / 或DIV)求模&#xff08; % 或MOD)比较运算符等于&#xff08; &#xff09;安全等于&#xff08; <> &#xff09;不等于&#xff08; ! 或 <…

WindTerm 界面/UI字体大小调节

文章目录WindTerm 界面/UI字体大小调节问题&#xff1a;解决办法&#xff1a;第一部分&#xff1a;调整编码部分字体大小第二部分&#xff1a;调整UI界面字体大小WindTerm 界面/UI字体大小调节 问题&#xff1a; 今天在使用windTerm的时候&#xff0c;发现windterm界面字体过…