文章目录

  • 前言
  • 一、首先是每个操作共用的操作大纲
    • 1.注册驱动
    • 2.创建连接
    • 3.编写SQL语句结果,动态值的部分使用?代替
    • 4.创建prepareStatement,并且传入SQL语句的结果
    • 5.占位符赋值(若无占位符,此步骤可跳过)
    • 6.发送SQL语句(注意)
    • 7.输出结果
    • 8.关闭资源
  • 二、对数据库的各种操作
    • 1.对数据库的增加操作
    • 2.对数据库的删除操作
    • 3.对数据库的修改操作
    • 4.对数据库的查询操作
  • 总结

前言

今天我们将探讨如何使用Java数据库连接(JDBC)在控制台上进行简单的增删改查操作。数据库是现代应用程序的重要组成部分,因此了解如何与其进行交互是非常有用的技能。JDBC是Java开发中使用最广泛的数据库API,它提供了一种标准的方式来连接和管理各种类型的数据库。在本文中,我们将介绍如何使用JDBC API连接到数据库,执行基本的增删改查操作,并关闭连接,以确保数据的安全性。无论您是新手还是有经验的开发人员,本文都将为您提供有用的信息和指导,让您能够轻松地在控制台上操作数据库。

本篇中部分内容在我发的其他博客中已经介绍过,错过的小伙伴可通过点击以下链接快速了解相关内容
JDBC中java与数据库的连接-CSDN


一、首先是每个操作共用的操作大纲

要想在IDEA的控制台对数据库进行操作,连接数据库是必须的,在这里,我会将IDEA连接数据库的操作一一列出来并做部分讲解

1.注册驱动

注册驱动有两种方法,第一种方法我并不推荐

 DriverManager.registerDriver(new Driver());

DriverManager.registerDriver(new Driver())是Java中用于注册JDBC驱动程序的代码。JDBC驱动程序是用于连接Java应用程序和各种数据库的组件。在此代码中,DriverManager调用registerDriver方法来注册Driver类的实例,该实例是一个JDBC驱动程序的实现。这样,该驱动程序就可以在应用程序中被使用,并且可以用来连接和操作数据库。
但是用这种方法连接驱动会导致连接多次,因为在registeDriver方法内部是有注册驱动的代码的,而在new Driver()中也是有驱动注册的代码,使用该方法会导致多次注册驱动从而影响整个代码的运行能力,所以我们不推荐这种方法

public static void registerDriver(java.sql.Driver driver)throws SQLException {//驱动就是在这注册的registerDriver(driver, null);}public class Driver extends NonRegisteringDriver implements java.sql.Driver {public Driver() throws SQLException {}static {try {//在这里又出现了registerDriver方法DriverManager.registerDriver(new Driver());} catch (SQLException var1) {throw new RuntimeException("Can't register driver!");}}
}

Class.forName("com.mysql.cj.jdbc.Driver");

第二种方法是使用Class.forNam()方法,也是我所推荐的方法;这行代码的作用是动态加载 MySQL 数据库的 JDBC 驱动程序。在 Java 应用程序中,需要使用 JDBC 驱动程序才能连接和操作数据库。而为了使用 JDBC 驱动程序,需要先将其加载到应用程序的内存中。通过 Class.forName() 方法动态加载 JDBC 驱动程序可以避免在程序运行时静态加载所有可能用到的类,从而减少了内存的消耗。
而Class.forNam()方法中的参数就是是 MySQL 数据库的 JDBC 驱动程序的类名,值得一提的是,如果你使用的是版本号为5的驱动版本的话,那么MySQL 数据库的 JDBC 驱动程序的类名就是com.mysql.jdbc.Driver,而如果你使用的版本号为8的驱动版本的话,那么MySQL 数据库的 JDBC 驱动程序的类名就是com.mysql.cj.jdbc.Driver

2.创建连接

Connection connection = DriverManager.getConnection("jdbc:mysql:///数据库名", "账号名", "密码");

这行代码使用Java中的JDBC(Java数据库连接) API连接到MySQL数据库中,它创建了一个名为“connection”的对象,该对象表示与数据库的连接,可以用于执行查询和更新等操作。
在这里你可以会奇怪DriverManager.getConnection()方法有一个参数、两个参数和三个参数,其实它们表达的意思都一样,我个人推荐三个参数的方法

3.编写SQL语句结果,动态值的部分使用?代替

String sql = "select * from t_user where username = ? and password = ?";

这行代码是一个 SQL 查询语句,用于在数据库表 t_user 中根据指定的用户名和密码来查询用户信息。其中,问号 ? 表示占位符,用于在执行查询语句时动态地替换成实际的参数值。这种写法可以避免 SQL 注入等安全问题,提高代码的可读性和可维护性。

4.创建prepareStatement,并且传入SQL语句的结果

PreparedStatement preparedStatement = connection.prepareStatement(sql);

PreparedStatement是在Java中用于执行预编译SQL语句的接口。它通过在执行之前将占位符替换为实际参数值,从而提高了执行效率和安全性。在使用PreparedStatement时,首先需要通过Connection接口的prepareStatement()方法创建一个PreparedStatement对象,并将需要执行的SQL语句作为参数传入。接着,可以使用setXXX()方法设置占位符的参数值,最后调用execute()或executeQuery()方法执行SQL语句并返回结果。这种方式能够避免SQL注入攻击,并且能够重复使用已编译的SQL语句,提高了程序的性能。

5.占位符赋值(若无占位符,此步骤可跳过)

preparedStatement.setObject(占位符的位置 从1开始,需要赋的值);

这是一个Java中用于向预编译的SQL语句中填充占位符的方法。其中,占位符的位置从1开始计数。setObject()方法可以接收任何类型的参数并将其转换为与数据库中对应列的类型相匹配的值。这个方法的作用是将需要赋的值赋给预编译SQL语句中的占位符,以便在执行SQL语句时使用这些值。

6.发送SQL语句(注意)

int rows = executeUpdate();//非DQL
Result result = executeQuery();//DQL

DQL是数据查询语言的缩写通常用于描述一种用于从数据库中检索数据的编程语言。DQL允许用户通过指定查询条件在数据库表中搜索数据,并且可以使用多种操作符和函数来过滤和排序返回的结果。在数据库中,DQL通常是与DML(数据操作语言)和DDL(数据定义语言)等其他数据库语言一起使用的。
**int rows = executeUpdate() **,是用于执行SQL语句并返回更新行数。在这个代码片段中,executeUpdate() 方法被调用并返回一个整数值,该值被赋给一个名为 rows 的整型变量。这个变量可以用于后续的程序逻辑,如判断SQL语句是否执行成功或者获取更新行数等。
**Result result = executeQuery() **,是用于执行 SQL 查询并返回查询结果的一个对象。该对象可以被视为一个迭代器,可以使用 result.next() 方法来获取查询结果集中的下一行数据。在使用完查询结果后,需要手动关闭该结果集以释放资源。

7.输出结果

if (rows > 0){System.out.println("删除成功!!");}else {System.out.println("删除失败!!");}
while (resultSet.next()){map.put("id",resultSet.getInt("id"));map.put("username",resultSet.getString("username"));map.put("password",resultSet.getString("password"));map.put("nickname",resultSet.getString("nickname")); }

对于int rows = executeUpdate(),我们通常只判断rows是否大于0,因为rows多数用于判断SQL语句是否执行成功或者获取更新行数。
而对于Result result = executeQuery(),我们这里使用的是最简单的手动取值,这段代码是在将数据库中查询得到的结果存入一个 map 中,其中 “id”、“username”、“password”、“nickname” 是这个 map 中的键,它们分别对应着 resultSet 中的列名。而 resultSet.getInt(“id”)、resultSet.getString(“username”) 等则是从 resultSet 中获取相应的值,并将它们存入 map 中。这样做的目的是方便我们在后续的代码中使用 map 来操作这些值。

8.关闭资源

resultSet.close();
preparedStatement.close();
connection.close();

resultSet.close()用于关闭结果集,释放相关资源;preparedStatement.close()用于关闭预处理语句对象,释放相关资源;connection.close()用于关闭数据库连接,释放相关资源。这些操作都是为了释放资源,节省系统资源开销,提高程序效率。同时,关闭这些对象可以防止资源泄漏和数据安全问题。需要注意的是,关闭的顺序应该是resultSet -> preparedStatement -> connection

二、对数据库的各种操作

首先,我将展示一下我们使用的最初的数据库:

1.对数据库的增加操作

在这里我们就直接引用上面的8个步骤了,那么便直接上代码:

//测试方法需要导入junit的测试包@Testpublic void testInsert() throws ClassNotFoundException, SQLException {//1.注册驱动Class.forName("com.mysql.cj.jdbc.Driver");//2.获取连接Connection connection = DriverManager.getConnection("jdbc:mysql:///atguigu", "root", "123456");//3.编写SQL语句结果,动态值的部分使用?代替String sql = "insert into t_user(username,password,nickname) values(?,?,?)";//4.创建preparedStatement,并且传入SQL语句结果PreparedStatement preparedStatement = connection.prepareStatement(sql);//占位符赋值preparedStatement.setObject(1,"test");preparedStatement.setObject(2,"test");preparedStatement.setObject(3,"二狗子");//6.发送SQL语句int rows = preparedStatement.executeUpdate();//7.输出结果if (rows > 0){System.out.println("数据插入成功!!");}else {System.out.println("数据插入不成功!!");}//8.关闭资源preparedStatement.close();connection.close();}

输出结果:


可以看到我们数据库多了一条数据。

2.对数据库的删除操作

@Testpublic void testDelete() throws ClassNotFoundException, SQLException {//1.注册驱动Class.forName("com.mysql.cj.jdbc.Driver");//2.获取连接Connection connection = DriverManager.getConnection("jdbc:mysql:///atguigu", "root", "123456");//3.编写SQL语句结果,动态值的部分使用?代替String sql = "delete from t_user where id=?";//4.创建prepareStatement,并且传入SQL语句的结果PreparedStatement preparedStatement = connection.prepareStatement(sql);//5.占位符赋值preparedStatement.setObject(1,5);//6.发送SQL语句int rows = preparedStatement.executeUpdate();//7.输出结果if (rows > 0){System.out.println("删除成功!!");}else {System.out.println("删除失败!!");}//8.关闭资源preparedStatement.close();connection.close();}

显而易见,我们的结果是:


我们可以发现,我们数据库的id为5的数据已经被删除了。

3.对数据库的修改操作

 @Testpublic void testUpdate() throws ClassNotFoundException, SQLException {//1.注册驱动Class.forName("com.mysql.cj.jdbc.Driver");//2.获取连接Connection connection = DriverManager.getConnection("jdbc:mysql:///atguigu", "root", "123456");//3.编写SQL语句结果,动态值的部分使用?代替String sql = "update t_user set nickname = ? where id = ?";//4.创建prepareStatement,并且传入SQL语句的结果PreparedStatement preparedStatement = connection.prepareStatement(sql);//5.占位符赋值preparedStatement.setObject(1,"三狗子");preparedStatement.setObject(2,4);//6.发送SQL语句int rows = preparedStatement.executeUpdate();//7.输出结果if (rows > 0){System.out.println("修改成功!!");}else {System.out.println("修改失败!!");}//8.关闭资源preparedStatement.close();connection.close();}

同样地,我们的结果是:


可以看见,id为4的数据的nickname已经变为三狗子。

4.对数据库的查询操作

在这里,我使用了更快捷的查询方法,就是自动取值,但对于刚入坑JDBC的小伙伴还是先从手动取值开始吧。

@Testpublic void testSelect() throws ClassNotFoundException, SQLException {//1.注册驱动Class.forName("com.mysql.cj.jdbc.Driver");//2.获取连接Connection connection = DriverManager.getConnection("jdbc:mysql:///atguigu", "root", "123456");//3.编写SQL语句结果,动态值的部分使用?代替String sql = "select id,username,password,nickname from t_user";//4.创建prepareStatement,并且传入SQL语句的结果PreparedStatement preparedStatement = connection.prepareStatement(sql);//5.占位符赋值//6.发送SQL语句ResultSet resultSet = preparedStatement.executeQuery();ResultSetMetaData metaData = resultSet.getMetaData();int columnCount = metaData.getColumnCount();List<Map> list = new ArrayList<>();//7.输出结果while (resultSet.next()){Map map = new HashMap();//            map.put("id",resultSet.getInt("id"));
//            map.put("username",resultSet.getString("username"));
//            map.put("password",resultSet.getString("password"));
//            map.put("nickname",resultSet.getString("nickname"));for (int i = 1; i <= columnCount ; i++) {Object object = resultSet.getObject(i);String columnLabel = metaData.getColumnLabel(i);map.put(columnLabel,object);}list.add(map);}System.out.println("list = " + list);//8.关闭资源resultSet.close();preparedStatement.close();connection.close();}

在这里可以看到我们的结果:

list = [{password=123456, nickname=经理, id=1, username=admin}, {password=111, nickname=管理员, id=2, username=jjcc}, {password=123456, nickname=三狗子, id=4, username=test_1}]

总结

当我们熟练地掌握以上几种方法后,我们就可以简单地做一个用控制台输入指令来控制IDEA进行相关的数据库操作了,具体的案例我会在以后发布哦,同样,在进行这些操作时,需要注意数据库表的结构和字段类型,避免出现数据类型不匹配或者数据丢失等问题。此外,还需要注意数据安全和数据备份,以免数据被恶意修改或者丢失。

JDBC中用控制台简单对数据库进行增删改查操作(IDEA.2023)相关推荐

  1. 【接口测试】Day5-使用pymysql库对mysql数据库进行增删改查操作

    目录 今日目标 一.数据库介绍 二.数据库基本操作 1.安装 2.操作流程(重点) 1. 创建连接 2. 获取游标 3. 执行sql 4. 关闭游标 5. 关闭连接 3.数据准备 4.数据库基本操作 ...

  2. python增删改查的框架_简单的Django框架增删改查操作

    Django之orm对MysqL数据库的增删改查操作简介: 利用Django中orm来查找数据库中的数据,对数据库进行增.删.改.查: 增:新增数据 # 操作数据库user表新增记录 # 方式1: u ...

  3. 利用Mybatis对数据库进行增删改查操作

    文章目录 mybatis模糊查找 先来了解一下 #{}和${}的使用 parameterType和resultType的使用 selectOne和selectList的使用 mysql自增主键返回 方 ...

  4. JDBC-03:PreparedStatement如何实现对数据库的增删改查操作

    文章目录 一.使用PreparedStatement实现CRUD操作 (1)使用PreparedStatement实现增删改操作 1.PreparedStatement介绍 2.实现数据库的添加操作 ...

  5. 欢迎来到Jsp编程课时十二——今天实现的目标是。@1将数据库的数据发送到浏览器。@2利用浏览器实现对数据库的增删改查操作。@3理解MVC三层架构的定义。

    完成项目会有以下的效果. JSP第二十课:Mvc+Mysql+Servlect+Jsp实现在浏览器上对数据库的增删改查. MVC全名是Model View Controller, 是 @@1模型(mo ...

  6. php修改数据库字段内容,php对数据库的增删改查操作

    在我看来数据库是个既复杂又高深莫测的东西,但百分之八十左右的程序员都不需要去精通他,对于我们前端开发来说,只要会数据库的增删改查语句就差不多了.首先我们来说说sql的增删改查语句. 一.增删改查 插入 ...

  7. Django数据库数据增删改查操作

    一. 无需实现model.py文件获取实例对象就能直接通过连接数据库进行数据的增删改查操作 # 连接数据库用于查询(查询单个或多个) def db_query(sql):# 打开数据库连接db = p ...

  8. JDBC练习-完成商品品牌数据的增删改查操作

    准备环境 数据库表tb_brand -- 删除tb_brand表 drop table if exists tb_brand; -- 创建tb_brand表 create table tb_brand ...

  9. nodejs对mongodb数据库的增删改查操作(转载)

    首先要确保mongodb的正确安装,安装参照:http://docs.mongodb.org/manual/tutorial/install-mongodb-on-debian-or-ubuntu-l ...

最新文章

  1. 归纳苹果,Facebook大规模部署的Spark-用户界面详细执行操作。
  2. 解决sdk manager 下载API失败的问题
  3. MVC架构简介及其测试策略
  4. [摘录]软件版本GA,RC,alpha,beta,Build 含义
  5. python is not allowed to run_【无法解决】PySpider的部署运行而非调试界面上RUN运行
  6. html5 canvas实际应用,Html5 Canvas入门及经典应用
  7. 从0到1使用Kubernetes系列(四):搭建第一个应用程序
  8. 通过OAuth 2.0和Okta使用安全的服务器到服务器通信构建Spring Boot应用
  9. gvim 安装 taglist
  10. Java核心类库篇1——简介
  11. Python中使用psutil查看内存占用的情况(内存)
  12. 【Python】表白程序
  13. pdf页眉页脚设置步骤
  14. Python学习之表的数据类型
  15. Python利用shelve模块设计简单数据库程序
  16. Linux总结----PS命令
  17. wincc怎么做数据库_WINCC与数据库连接
  18. 共模电感的工作原理及选型
  19. 《大象:thinking in uml 》(第二版) 3章 UML核心元素 4-7节 边界、业务实体、包、分析类
  20. 高德地图marker标点数据量太大造成卡顿的解决方案

热门文章

  1. CSS:position属性的区别
  2. win10 硬盘100% 解决
  3. CEPH离线部署(纯内网)
  4. 数字化时代到来企业如何“数字化生存”
  5. 【飞桨PaddleSpeech语音技术课程】— 流式语音合成技术揭秘与实践
  6. int main()和void main()有什么区别
  7. 代码随想录算法训练营第七天| 454.四数相加II 、383. 赎金信、15. 三数之和、18. 四数之和
  8. 为何总给外卖打差评?我们来数据分析一下!
  9. 适合上班族的兼职有哪些?上班族兼职赚钱项目
  10. 【DJI】GUIDANCE使用说明