JDBC的基础操作

举报
游离 发表于 2023/02/27 20:54:27 2023/02/27
【摘要】 JDBC编程@[toc]在实际工作中,很多时候还是使用代码来操作SQL语句的API : Application Programming Interface 引应用程序编程接口提供了一组类/方法,让程序员调用但是,做数据库的厂商很多,Oracle MySQL SQLite SQL Server, 不同种类的数据库,提供的API不一样,这样就增加了学习的成本以及替换数据库的成本J...

JDBC编程

@[toc]
在实际工作中,很多时候还是使用代码来操作SQL语句的

API : Application Programming Interface 引应用程序编程接口

提供了一组类/方法,让程序员调用

但是,做数据库的厂商很多,Oracle MySQL SQLite SQL Server, 不同种类的数据库,提供的API不一样,这样就增加了学习的成本以及替换数据库的成本

Java为了解决上述的问题,就提供了一套统一风格的数据库操作 API(JDBC), 让数据库厂商来适配这套Java的API,这样子程序员只要掌握这一套Java 的API就能操作各种数据库,这一套API就是JDBC(java database connection)

image-20220807223039508

JDBC环境搭建

下载驱动包

当然要先下载驱动包才能使用

建议去中央仓库

直接搜索 mysql

image-20220807223159304

驱动包有很多的版本,要保证和数据库的大版本对得上

我这里使用的是MySQL 5.7版本 ,所以只要选择5系列就行了

这个驱动包本质上就是一个压缩包,是以.jar为后缀的文件 ,成为jar包

jar包 点进去就是一堆.class文件,(java编译生成的二进制文件)

jar包是java发布程序的一种 常见手段(因为有很多的.class文件,随意打成一个jar包就会很方便)

将驱动包导入到项目中

创建一个lib(库)(必须要与 src同一级)

将驱动包粘贴到lib里面,右键lib,点击add as library就导入成功

开始进行JDBC

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;

public class JDBC {
    public static void main(String[] args) {
        //创造数据源对象,数据源对象描述了要访问的数据库是哪一个,在哪
        DataSource dataSource = new MysqlDataSource();//向上转型
        ((MysqlDataSource) dataSource).setURL();//向下转型(需要强制转型) 
        //这里的set操作不是DataSource的,而是MysqlDataSource,所以要向下转型,转成MysqlDataSource才能调用set方法(父类-->子类:向下转型)
    }
}

对于 DataSource dataSource = new MysqlDataSource();

DataSource 是标准库JDBC的一个接口,MysqlDataSource来自于自己导入的jar包
每种数据库有都会提供对应的类来实现DataSource接口–也就是new 后面的对象
此处用到了向上转型–子类对象转为(指向)父类对象 实例:Animal b=new Bird(); Bird继承于Animal DataSource是父类,MysqlDataSource是具体的子类

这里也是用到了多态的概念

封装: 将实现的细节隐藏起来,让调用者不必考虑细节,直接调用即可

多态:将实现类的类型也隐藏起来了,调用者不仅不要考虑细节,类型也不要管了

MysqlDataSource dataSource1 = new MysqlDataSource();
dataSource1.setURL();
//要是直接这样写,MysqlDataSource就会出现,导致MySQL与项目的耦合性就会提高
//要是以后迁移数据库有就会有很多的修改,维护成本高,所以还是上面的向上转型写法更好

写代码追求的是"高内聚,低耦合"

耦合性

一个大的程序,里面有很多的部分,要是这些部分之间的关联性比较强,那就是耦合性高

反之,耦合性低,我们追求的就是部分与部分之间要减少关联–低耦合

内聚性

简单来说,内聚就是将相关的代码写到一起

举一个实际的例子:将所有的衣服全都放到衣柜里面,不至于同一件,西一件,这就是高内聚

URL

URL 统一资源定位符 俗称网址

image-20220809215110306

ip地址描述了网络上主机的位置

127.0.0.1 是一个特殊的ip地址,表示本机,无论本机是什么,都可以用127.0.0.1 来表示本机 , 这个ip地址也叫做环回ip/环回地址

端口号是用来区分主机上不同的应用程序的

ip地址确定主机位置,但是一台主机上面有很多的程序,就由端口号来区分不同的程序

3306是mysql的默认端口号

由上面可以看出,DataSource描述了在哪里能找到数据库的位置

URL能体现出数据库服务器的位置,以及 数据库的名称

在连接数据库的时候,Connection connection= dataSource.getConnection();

这里的Connection用的是标准库里面的

image-20220809221942342

image-20220809222210450

String sql = "insert into student values(1,'张三')";//注意:这里varchar插入格式是单引号
PreparedStatement statement = connection.prepareStatement(sql);
//PrepareStatement是预处理,SQL将语句发给服务器,服务器就得进行语句解析
//但是解析过程还是很消耗资源的,服务器要处理很多的客户端请求,很忙,所以就将一部分解析的工作交给客户端
//自己进行解析,数据库就省去了解析的过程,就节省了资源消耗,提高了处理效率

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
//通过JDBC操作数据库,往数据库中插入一条数据

public class JDBC {
    public static void main(String[] args) throws SQLException {  //数据库中常见的异常
        //1.创造数据源对象,数据源对象描述了要访问的数据库是哪一个,在哪
        DataSource dataSource = new MysqlDataSource();
        //DataSource 是标准库JDBC的一个接口,MysqlDataSource来自于自己导入的jar包
        //每种数据库有都会提供对应的类来实现DataSource接口--也就是new 后面的对象
        //此处用到了向上转型--子类对象转为(指向)父类对象  实例:Animal b=new Bird(); Bird继承于Animal
        //DataSource
        ((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
        //向下转型(需要强制转型) 这里的set操作不是DataSource的,而是MysqlDataSource
        //所以要向下转型,转成MysqlDataSource才能调用set方法
        ((MysqlDataSource) dataSource).setUser("root");//用户名
        ((MysqlDataSource) dataSource).setPassword("1111");//密码
        //2. 让代码和数据库服务器进行连接
        Connection connection= dataSource.getConnection();//连接数据库  getConnection()会出现受查异常(编译时异常) 要进行显示处理 throws或者try catch
        //3.构造要执行的SQL语句
        //先通过字符串描述出要执行的sql语句,再通过PrepareStatement对象来接收sql语句
        String sql = "insert into student values(1,'张三')";//注意:这里是单引号
        PreparedStatement statement = connection.prepareStatement(sql);//PrepareStatement是预处理,SQL将语句发给服务器,服务器就得进行语句解析
        //4.执行SQLp[发送请求 & 读取响应]
        //executeUpdate   对应插入修改删除操作,返回值表示这次SQL操作影响的行数
        //executeQuery    对应查询操作,返回值是返回的临时的临时表数据
        int n = statement.executeUpdate();
        System.out.println("n = "+ n);
        //5,完成之后,就需要关闭释放相关资源
        //关系资源要按照“先创建的后关闭,后创建的先关闭”
        statement.close();
        connection.close();
    }
}

小总结(简洁版)

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
//通过JDBC操作数据库,往数据库中插入一条数据

public class JDBC {
    public static void main(String[] args) throws SQLException { 
        //1.创造数据源对象,数据源对象描述了要访问的数据库是哪一个,在哪
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource) dataSource).setUser("root");//用户名
        ((MysqlDataSource) dataSource).setPassword("1111");//密码
        //2. 让代码和数据库服务器进行连接
        Connection connection = dataSource.getConnection();//连接数据库  getConnection()会出现受查异常(编译时异常) 要进行显示处理 throws或者try catch
        //3.构造要执行的SQL语句
        String sql = "insert into student values(1,'张三')";//注意:这里varchar的格式是单引号
        PreparedStatement statement = connection.prepareStatement(sql);//PrepareStatement是预处理,SQL将语句发给服务器,服务器就得进行语句解析
        //4.执行SQLp[发送请求 & 读取响应]
        int n = statement.executeUpdate();
        System.out.println("n = "+ n);
        //5,完成之后,就需要关闭释放相关资源
        statement.close();
        connection.close();
    }
}

JDBCInsert

 public static void main(String[] args) throws SQLException {
        //1.创造数据源对象
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource) dataSource).setUser("root");//用户名
        ((MysqlDataSource) dataSource).setPassword("1111");//密码
        //2. 让代码和数据库服务器进行连接
        Connection connection = dataSource.getConnection();//连接数据库  getConnection()会出现受查异常(编译时异常) 要进行显示处理 throws或者try catch
        //3.构造要执行的SQL语句
        //[用户自己输入数据]
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要插入的学号");
        int id = scanner.nextInt();
        System.out.println("请输入要插入的姓名");
        String name = scanner.next();
        String sql = "insert into student values(?,?)";// ? 是 占位符,只是占个位置,之后会被替换掉
        PreparedStatement statement = connection.prepareStatement(sql);//PrepareStatement是预处理,SQL将语句发给服务器,服务器就得进行语句解析
        statement.setInt(1,id);//  1 表示 替换第一个?
        statement.setString(2,name);//  2  表示替换第二个?
        //4.执行SQL[发送请求 & 读取响应]
        int n = statement.executeUpdate();
        //System.out.println("statement" + statement);
        //System.out.println("n = "+ n);
        //5,完成之后,就需要关闭释放相关资源
        statement.close();
        connection.close();
    }

其实,插入修改删除都是一样的操作,这三者的执行用的都是executeUpdate,只是sql的语句不一样而已

JDBCUpdate

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

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

public class JDBCUpdate {
    public static void main(String[] args) throws SQLException {
        //1.创建一个数据源
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource) dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("1111");
        //2.和数据库进行连接
        Connection connection = dataSource.getConnection();
        //3.构造SQL语句
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要修改的同学的学号:");
        int id = scanner.nextInt();
        System.out.println("请输入修改后的姓名:");
        String name = scanner.next();
        
        String sql = "update student set name = ? where id = ?";
        PreparedStatement statement = connection.prepareStatement(sql);
        statement.setString(1,name);//代表第一个?,是String类型的
        statement.setInt(2,id);
        //4.执行SQL语句
        int n = statement.executeUpdate();
        System.out.println("n= " + n);
        //5.关闭释放资源
        statement.close();
        connection.close();
    }
}

JDBCDelete

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

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

public class JDBCDelete {
    public static void main(String[] args) throws SQLException {
        //1,创建数据源
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("1111");
        //2.连接数据库
        Connection connection = dataSource.getConnection();//Connection是Java.sql的
        //写SQL语句 解析
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要删除的学生id:");
        int id = scanner.nextInt();

        String sql = "delete from student where id = ?";
        PreparedStatement statement = connection.prepareStatement(sql);//解析
        statement.setInt(1,id);
        //4.执行sql语句
        int n = statement.executeUpdate();
        System.out.println("n= " + n);
        //5.资源的关闭释放
        statement.close();
        connection.close();
    }
}

JDBCSelect

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

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;

public class JDBCSelect {
    public static void main(String[] args) throws SQLException {
        //1.创建数据源
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource) dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("1111");
        //2.连接数据库
        Connection connection = dataSource.getConnection();
        //3.构造sql语句
        String sql = "select * from student where id = ? ";//条件查询
        PreparedStatement statement = connection.prepareStatement(sql);//解析
        statement.setInt(1,2);//前面的数字一定要从1开始,后面是表中的id,即要查询的id数字
        //4.执行SQL语句
        //查询结果要用executeQuery来完成
        //返回结果是ResultSet  结果集   类似于表的数据结构
        ResultSet resultSet = statement.executeQuery();
        //5.遍历结果集合
        while (resultSet.next()) {
            //每次循环就会将每一行id 和 name 取出
            int id = resultSet.getInt("id");//getXXX里面放到是列名
            String name = resultSet.getString("name");
            System.out.println("id = "+ id +",name= "+ name );
        }
        //5.资源的关闭与释放
        resultSet.close();//resultSet也是资源
        statement.close();
        connection.close();
    }
}

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。