Java的数据库编程:JDBC

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: Java的数据库编程:JDBC

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中的数据库连接规范。可以为多种关系数据库提供统一访问.

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


上链接


https://mvnrepository.com/


6f16ba01b778444ab1feb6a69a23518b.png

1be28033c5684479a29a26683e83706c.png


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


6818302a0a254d46be1cb1304935d94b.png


点击这个


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


7dd20ccf121447a6a9bd90c502bcde28.png

就像这样,这样数据库就和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();
    }
}

d31270d6f1764137b8893c0e124337c5.png


3b72e8c528454ba1ae1bc9ece9f89e5a.png

看看执行结果,在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();
    }

1adec3645ea8403d8a03be7235f4ad0a.png


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

e1b45365834e459ca2265b810f0b473f.png

395b4982ec354df68e7a48d0bcc5dd40.png

这一段就是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();
    }

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

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5天前
|
安全 Java 调度
Java编程时多线程操作单核服务器可以不加锁吗?
Java编程时多线程操作单核服务器可以不加锁吗?
17 2
|
8天前
|
Java
死磕-java并发编程技术(二)
死磕-java并发编程技术(二)
|
8天前
|
存储 Java 调度
死磕-java并发编程技术(一)
死磕-java并发编程技术(一)
|
8天前
|
设计模式 缓存 Java
死磕-高效的Java编程(一)
死磕-高效的Java编程(一)
|
8天前
|
算法 安全 Java
JAVA并发编程系列(12)ThreadLocal就是这么简单|建议收藏
很多人都以为TreadLocal很难很深奥,尤其被问到ThreadLocal数据结构、以及如何发生的内存泄漏问题,候选人容易谈虎色变。 日常大家用这个的很少,甚至很多近10年资深研发人员,都没有用过ThreadLocal。本文由浅入深、并且才有通俗易懂方式全面分析ThreadLocal的应用场景、数据结构、内存泄漏问题。降低大家学习啃骨头的心理压力,希望可以帮助大家彻底掌握并应用这个核心技术到工作当中。
|
8天前
|
Java 程序员 编译器
死磕-高效的Java编程(二)
死磕-高效的Java编程(二)
|
3天前
|
Java
JAVA并发编程系列(13)Future、FutureTask异步小王子
本文详细解析了Future及其相关类FutureTask的工作原理与应用场景。首先介绍了Future的基本概念和接口方法,强调其异步计算特性。接着通过FutureTask实现了一个模拟外卖订单处理的示例,展示了如何并发查询外卖信息并汇总结果。最后深入分析了FutureTask的源码,包括其内部状态转换机制及关键方法的实现原理。通过本文,读者可以全面理解Future在并发编程中的作用及其实现细节。
|
6天前
|
Java 数据处理 调度
Java中的多线程编程:从基础到实践
本文深入探讨了Java中多线程编程的基本概念、实现方式及其在实际项目中的应用。首先,我们将了解什么是线程以及为何需要多线程编程。接着,文章将详细介绍如何在Java中创建和管理线程,包括继承Thread类、实现Runnable接口以及使用Executor框架等方法。此外,我们还将讨论线程同步和通信的问题,如互斥锁、信号量、条件变量等。最后,通过具体的示例展示了如何在实际项目中有效地利用多线程提高程序的性能和响应能力。
|
7天前
|
安全 算法 Java
Java中的多线程编程:从基础到高级应用
本文深入探讨了Java中的多线程编程,从最基础的概念入手,逐步引导读者了解并掌握多线程开发的核心技术。无论是初学者还是有一定经验的开发者,都能从中获益。通过实例和代码示例,本文详细讲解了线程的创建与管理、同步与锁机制、线程间通信以及高级并发工具等主题。此外,还讨论了多线程编程中常见的问题及其解决方案,帮助读者编写出高效、安全的多线程应用程序。
|
8天前
|
存储 数据库 Python
python的对象数据库ZODB的使用(python3经典编程案例)
该文章介绍了如何使用Python的对象数据库ZODB来进行数据存储,包括ZODB的基本操作如创建数据库、存储和检索对象等,并提供了示例代码。
13 0
下一篇
无影云桌面