学点Java_Day12_JDBC

1 JDBC

在这里插入图片描述
面向接口编程
在JDBC里面Java这个公司只是提供了一套接口Connection、Statement、ResultSet,每个数据库厂商实现了这套接口,例如MySql公司实现了:MySql驱动程序里面实现了这套接口,Java程序员只要调用实现了这些方法就可以实现对 MySql数据库的增删改查。
在这里插入图片描述

2 JDBC开发步骤

2.1 加载驱动Class.forName(“”)

2.2 获得连接对象Connection

2.3 写sql语句

2.4 创建Statement(一艘船)

2.5 执行sql语句

 (1) 更新类(更改了表里面数据):delete/update/insert      executeUpdate()返回值:int,表示你影响的行数(2)查询(没有改变表里面数据):  select                              executeQuery()返回值:结果集ResultSet

2.6 关闭连接

    @Testpublic void test1() {Connection connection = null;Statement statement = null;ResultSet resultSet = null;try {//1、加载驱动Class.forName("");Class.forName("com.mysql.cj.jdbc.Driver");//2、获得连接对象Connection//Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/study", "root", "xiangjie");//jdbc:mysql:协议 localhost 127.0.0.1connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/study?useSSL=false&useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2b8", "root", "xiangjie");//3、写sql语句String sql = "select id,name,age,gender from student";//4、创建Statement(一艘船)statement = connection.createStatement();//5、执行sql语句//  (1) 更新类(更改了表里面数据):delete/update/insert     executeUpdate()//    返回值:int,表示你影响的行数//  (2)查询(没有改变表里面数据):  select                  executeQuery()//    返回值:结果集ResultSetresultSet = statement.executeQuery(sql);List<Student> studentList = new ArrayList<>();while (resultSet.next()) {//判断下一行有没有,如果没有返回FALSE,如果有返回true并且指向这一行。既判断也指向,没有指向自己//当前resultSet指向第一行//while循环每遍历一次,把这一行每个字段的值拿出来,就可以封装一个Student对象int id = resultSet.getInt("id");String name = resultSet.getString("name");int age = resultSet.getInt("age");String gender = resultSet.getString("gender");//以后有框架给干  但是自己也要过一遍流程Student student = new Student(id, name, age, gender);System.out.println(student);studentList.add(student);}//6、关闭连接  见finally} catch (ClassNotFoundException e) {throw new RuntimeException(e);} catch (SQLException e) {throw new RuntimeException(e);} finally {//6、关闭连接if (resultSet != null) {try {resultSet.close();} catch (SQLException e) {throw new RuntimeException(e);}}if (statement != null) {try {statement.close();} catch (SQLException e) {throw new RuntimeException(e);}}if (connection != null) {try {connection.close();} catch (SQLException e) {throw new RuntimeException(e);}}}}

3 JDBC接口核心的API

|- DriverManager类: 驱动管理器类,用于管理所有注册的驱动程序
       |-registerDriver(driver) : 注册驱动类对象
       |-Connection getConnection(url,user,password); 获取连接对象
|- Connection接口: 表示java程序和数据库的连接对象。
       |- Statement createStatement() : 创建Statement对象
       |- PreparedStatement prepareStatement(String sql) 创建PreparedStatement对象
       |- CallableStatement prepareCall(String sql) 创建CallableStatement对象(调用写好的存储过程)
|- Statement接口: 用于执行静态的sql语句
       |- int executeUpdate(String sql) : 执行静态的更新sql语句
       |- ResultSet executeQuery(String sql) :执行的静态的查询sql语句
    |-PreparedStatement接口:用于执行预编译sql语句
       |- int executeUpdate() : 执行预编译的更新sql语句
       |-ResultSet executeQuery() : 执行预编译的查询sql语句
|- ResultSet接口:用于封装查询出来的数据
    |- boolean next() : 将光标移动到下一行
    |-getXX() : 获取列的值

    @Testpublic void test2() {Connection connection = null;Statement statement = null;ResultSet resultSet = null;try {Class.forName("com.mysql.cj.jdbc.Driver");connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/study?useSSL=false&useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2b8", "root", "xiangjie");String sql = "select id,name,age,gender from student";statement = connection.createStatement();resultSet = statement.executeQuery(sql);List<Student> studentList = new ArrayList<>();while (resultSet.next()) {int id = resultSet.getInt("id");String name = resultSet.getString("name");int age = resultSet.getInt("age");String gender = resultSet.getString("gender");Student student = new Student(id, name, age, gender);System.out.println(student);studentList.add(student);}} catch (ClassNotFoundException e) {throw new RuntimeException(e);} catch (SQLException e) {throw new RuntimeException(e);} finally {JDBCUtil.close(connection, statement, resultSet);}}

4 PreparedStatement(预编译)和Statement区别

1、语法不同:
PreparedStatement可以使用预编译的sql,只需要发送一次sql语句,后面只要发送参数即可,公用一个sql语句。
Statement只能使用静态的sql。
2、效率不同:PreparedStatement使用了sql缓冲区,效率要比Statement高。
3、安全性不同:PreparedStatement可以有效的防止sql注入,而Statement不能防止sql注入。

    @Testpublic void test3() {//预编译的statementConnection connection = null;//Statement statement = null;PreparedStatement statement = null;ResultSet resultSet = null;try {connection = JDBCUtil.getConnection();String sql = "select id,name,age,gender from student";//预编译的statementstatement = connection.prepareStatement(sql);resultSet = statement.executeQuery();List<Student> studentList = new ArrayList<>();while (resultSet.next()) {int id = resultSet.getInt("id");String name = resultSet.getString("name");int age = resultSet.getInt("age");String gender = resultSet.getString("gender");Student student = new Student(id, name, age, gender);System.out.println(student);studentList.add(student);}} catch (SQLException e) {throw new RuntimeException(e);} finally {JDBCUtil.close(connection, statement, resultSet);}}

5 SQL注入

-- 演示Sql注入问题
CREATE TABLE users(id INT PRIMARY KEY AUTO_INCREMENT,`name` VARCHAR(10),`password` VARCHAR(10)
);
INSERT INTO users(`name`, `password`) VALUES('lisi',123);
SELECT * FROM users WHERE 1=1;  -- 1=1   true
SELECT * FROM users WHERE `name`='lisi' AND `password`='123';
--  zhangsan' OR 1=1 -- y 
SELECT * FROM users WHERE `name`='zhangsan' OR 1=1 -- y' AND `password`='343';

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

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

相关文章

如何调试Clang源码

下载编译Clang 这个就直接去LLVM官网下载&#xff0c;然后编译好Clang就行&#xff0c;注意得debug模式&#xff0c;保存符号信息。 调试Clang 可以直接通过命令行来调试 #进入调试环境&#xff0c;这里的clang得是刚刚编译好的 lldb ./clang # r是运行&#xff0c;后面是正…

电脑关机速度很慢怎么解决?

给电脑关机&#xff0c;总是要很久才完全关闭。这是因为计算机运行了太长时间&#xff0c;并且打开的程序太多&#xff0c;则关闭时间超过十秒钟&#xff0c;这是正常的现象。还有就是计算机升级或补丁程序更新也将导致计算机缓慢关闭。此时&#xff0c;建议耐心等待关闭完成。…

【C++】STL中sort算法使用了什么排序算法?

参考:https://blog.csdn.net/u011386173/article/details/110394829 STL所提供的各式各样的算法中&#xff0c;sort()是最复杂庞大的一个。这个算法接受两个RandomAccessIterators(随机存取迭代器),然后将区间内的所有元素以渐增方式由小到大重新排列。第二个版本则允许用户指定…

Dubbo的服务注册与发现原理、Java如何实现Dubbo的服务注册与发现

1、Dubbo的服务注册与发现原理 Dubbo的服务注册与发现原理主要基于Zookeeper实现。 1、服务提供者在启动时&#xff0c;会将自己的服务地址和相关信息注册到Zookeeper中的指定节点。注册的信息包括服务名称、服务地址、服务版本号等。 2、服务消费者在启动时&#xff0c;会连…

【GitLab】Ubuntu使用宝塔安装GitLab最新社区版

首先在Ubuntu安装宝塔面板 在官网可以找到脚本一键安装 安装GitLab社区版 然后在宝塔面板的“软件商店”里面找到GitLab最新社区版 12.8.1一键安装 安装过程中可能出现以下问题&#xff1a; 1.卡在ruby_block[wait for logrotate service socket] action run 解决办法&…

离心式风机运行效率测算

1.总压静压动压&#xff1b; 2.动压0.5空气体密度风速2&#xff1b; 风机所需功率P&#xff08;KW&#xff09;&#xff1a;PQp/&#xff08;36001000η0η1&#xff09; Q—风量&#xff0c;m3/h&#xff1b; p—风机的全风压&#xff0c;Pa&#xff1b; η0—风机的内效率&a…

iOS library not found for -lMBProgressHUD

0x00 前因 一开始是使用 CocoaPods 管理 MBProgressHUD&#xff0c;后来直接导入 MBProgressHUD 源码&#xff0c;就出现了这个错误&#xff1a;library not found for -lMBProgressHUD 0x01 后果 在 Xcode 工程目录中找到文件夹&#xff1a;Frameworks 看看里面是否有个红色…

计算机网络-RIP动态路由协议简介

一、概述 前面我们学习了动态路由协议按照工作机制及算法划分可以分为&#xff1a;距离矢量路由协议DV型和链路状态路由协议LS型。RIP就是典型的距离矢量路由协议&#xff0c;但是实际工作中用得已经比较少了。 距离矢量路由协议DV: RIP 链路状态路由协议LS: OSPF IS-IS 二、RI…

提升 Vim 技能的四种方法

如果您经常使用安全shell&#xff1a; $ ssh userhostname.provider.com 并使用虚拟专用服务器 (VPS) 或本地虚拟化容器&#xff0c;就此而言&#xff0c;您可以从强大的 Vim 技能中受益匪浅。 一、将 Vim 设置为默认文本编辑器 1、将 Vim 设置为 Bash 中的默认值 Bash 通…

深入Spark与LDA:大规模文本主题分析实战

使用LDA模型和Spark进行文本主题分析 本篇博客介绍了如何使用LDA&#xff08;潜在狄利克雷分配&#xff09;模型和Spark进行文本主题分析。我们的目标是从大量的用户评论中提取出主题。 1. 环境设置 首先&#xff0c;我们需要导入所需的库&#xff0c;包括jieba&#xff08;…

Java八股文(JVM)

Java八股文のJVM JVM JVM 什么是Java虚拟机&#xff08;JVM&#xff09;&#xff1f; Java虚拟机是一个运行Java字节码的虚拟机。 它负责将Java程序翻译成机器代码并执行。 JVM的主要组成部分是什么&#xff1f; JVM包括以下组件&#xff1a; ● 类加载器&#xff08;ClassLoa…

当当狸智能激光雕刻机 多种材质自由雕刻,轻松打造独一无二的作品

提及“激光雕刻”&#xff0c;大多数人的印象一般都是&#xff1a;笨重巨大、价格昂贵、操作复杂、使用门槛较高、调试难度大...不是普通人能够随意操作的&#xff0c;让人望尘莫及。 而小米有品上新的这台「当当狸桌面智能激光雕刻机L1」&#xff0c;将超乎你的想象&#xff…

JimuReport积木报表 v1.7.4 公测版本发布,免费的JAVA报表工具

项目介绍 一款免费的数据可视化报表&#xff0c;含报表和大屏设计&#xff0c;像搭建积木一样在线设计报表&#xff01;功能涵盖&#xff0c;数据报表、打印设计、图表报表、大屏设计等&#xff01; Web 版报表设计器&#xff0c;类似于excel操作风格&#xff0c;通过拖拽完成报…

【C语言基础】:数据在内存中的存储

文章目录 一、整数在内存中的存储二、大小端字节序和字节序判断1. 为什么有大小端&#xff1f;2. 练习 三、浮点数在内存中的存储1. 浮点数的存储1.1 浮点数的存储过程1.2 浮点数取的过程 四、题目解析 书山有路勤为径&#xff0c;学海无涯苦作舟。 创作不易&#xff0c;宝子们…

google浏览器下载文件提示无法安全地下载怎么解决?

在使用google浏览器下载文件的时候,弹出了“无法安全下载”的提示,搞了文件都下载不下来,网上查了一下,是因为chrome认为使用非https链接下载文件是不安全的,在新版本中阻止了用户下载。 目录 1、打开google浏览器的设置

轻量级检测模型效果一定差?基于轻量级目标检测模型构建布匹瑕疵检测模型,对比分析不同分辨率图像尺度对模型效果的影响

瑕疵类的检测模型如&#xff1a;工业部件瑕疵、瓷砖瑕疵、PCB瑕疵、布匹瑕疵等等&#xff0c;在我们之前的博文中已经有过很多相关的开发实践了&#xff0c;这里就不再一一列举了&#xff0c;感兴趣的话可以直接搜索关键字信息博文内容即可一键直达。 因为本文的实验对象选择的…

structured bindings is supported from c++17

结构化绑定可以绑定结构体、数组和 tuple-like 对象。 完整示例&#xff1a; #include <iostream> #include <format> #include <iomanip>void test_00(){struct Box{int width_;int height_;std::string name_;};Box box{3,4,"amazing"};auto [w…

IT服务营销管理案例分析题

习题一 企业随着业务的蓬勃发展&#xff0c;所投入的基础设施资源不断增加。企业员工数倍数增长&#xff0c;办公场地、办公环境等要求也越来越高。 可是该企业的IT部门人员短缺&#xff0c;对IT管理还处于被动的“救火”阶段&#xff0c;每天至少15个突发故障&#xff0c;故障…

YOLOv9改进策略 | 损失函数篇 | InnerIoU、InnerMPDIoU二次创新损失函数助力小目标检测(全网独家首发)

一、本文介绍 本文给大家带来的改进机制是InnerIoU以及包含其它二次创新的代码InnerCIoU、InnerMPDIoU等一些列利用Inner形成的二次创新损失函数&#xff0c;到此大家可能比较模糊为啥Inner能够和其他损失函数形成二次创新&#xff0c;Inner又是一个什么样的机制&#xff0c;开…

【1】网络协议基础概念

【1】网络协议基础知识 1、互联网2、为什么要学习网络协议3、学习中需要搭建的环境4、客户端-服务器5、Java 的跨平台原理6、C/C的跨平台原理7、一个简单的SpringBoot项目(1) pom.xml(2) application.yml(3) NetworkStudyApp.java(4) SwaggerConfig.java(5) HelloWorldControll…