文章目录

  • 前言
  • JDBC
    • JDBC是什么
    • JDBC的本质
    • JDBC编程六步
    • SQL注入
    • Statement和PrepareStatement

前言

虽然现在已经不在使用JDBC了,一般都是Mybatis或者Spring Data JPA,但是不管使用什么ORM框架,都是在JDBC上封装了一层或几层,再者技多不压身,学习JDBC还是很有必要的。

JDBC

在web开发中,不可避免的要使用数据库来存储和管理数据。为了在java语言中提供数据库访问的支持,Sun公司在1996年提供了一套访问数据的标准Java类库,也称JDBC。

JDBC是什么

JDBC的全称为Java DataBase Connectivity(Java语言连接数据库),它是一套用于执行SQL语句的JavaAPI,也就是使用Java语言来操作数据库的一种API。

JDBC的本质

JDBC的本质是Sun公司提供的一套接口,有调用者和使用者,面向接口调用、面向接口写实现类,这都属于面向接口编程。

为什么要面向接口编程:降低程序之间的耦合度,避免修改一处代码而牵动别处代码的改动,提高程序的扩展力,多态就是一种面向接口编程的思想

 //推荐使用Animal c = new Cat();Animal d = new Dog();//不推荐使用Cat c = new Cat();Dog d = new Dog();

JDBC编程六步

  1. 注册驱动(告诉Java程序需要连接的数据库是MySQL、Oracle…)
  2. 获取连接(JVM和数据库之间进程的通道打开)
  3. 获取数据库操作对象(专门执行SQL语句的对象)
  4. 执行SQL语句(crud语句)
  5. 处理查询结果集(收集执行完SQL语句的结果)
  6. 释放资源(将Java和数据库之间进程的通道关闭)
package com.bjpowernode.jdbc;import java.sql.*;public class JDBC {public static void main(String[] args) throws SQLException {Statement stmt = null;Connection conn = null;ResultSet rs = null;try {//1.注册驱动Class.forName("com.mysql.cj.jdbc.Driver");//2.获取连接//数据库中表的位置,数据库名,数据库密码conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/bjpowernode", "root", "111");//3.获取数据库操作对象stmt = conn.createStatement();//4.执行sql语句String sql = "update dept1 set dname = 'RENSHIBU',loc = 'SHANGHAI' where deptno = 20";String sql1 = "select * from dept1";int count = stmt.executeUpdate(sql);//count 表示被影响的行数rs = stmt.executeQuery(sql1);// stmt.executeQuery()方法返回的是一个集合//5.处理查询结果集System.out.println(count == 2 ? "修改成功" : "修改失败");//rs.next()方法返回的是一个boolean值while (rs.next()) {int deptno = rs.getInt("deptno");String dname = rs.getString("dname");String loc = rs.getString("loc");System.out.println(deptno + " " + dname + " " + loc);}} catch (ClassNotFoundException | SQLException e) {e.printStackTrace();} finally {//6.释放资源rs.close();stmt.close();conn.close();}}
}

SQL注入

所谓的SQL注入就是通过某种方式将恶意的SQL代码添加到输入参数中,传递到SQL服务器使其解析并执行的一种攻击方法

解决SQL注入问题
使用java.sql.PreparedStatement,PreparedStatement接口继承了java.sql.Statement,属于预编译数据库操作对象,预先对SQL语句进行编译,然后再给SQL语句传值

package com.bjpowernode.jdbc;import java.sql.*;public class JDBC {public static void main(String[] args) throws SQLException {String loginName = "zhangsan";String loginPwd = "123456";boolean flag = false;Statement stmt = null;Connection conn = null;ResultSet rs = null;try {//1.注册驱动Class.forName("com.mysql.cj.jdbc.Driver");//2.获取连接//数据库中表的位置,数据库名,数据库密码conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/bjpowernode", "root", "111");//3.获取预编译的数据库操作对象//sql语句的框架.其中一个?表示一个占位符.一个?将来接收一个"值", 占位符不能使用单引号括起来String sql = "select * from t_user where username =? and password=?";//程序执行到此处,会发送SQL语句框子给DBMS.然后DBMS进行sql语句的预先编译.ps = conn.prepareStatement(sql);//给占位符?传值(第一个问号下标是1,第二个下标是2,JDBC中所有下标从1开始)//setString(xxx,yyy)方法会自动给yyy添加单引号ps.setString(1,loginName);ps.setString(2,loginPwd);//4.执行sqlrs = ps.executeQuery();//5.处理结果集if (rs.next()) {flag = true;}} catch (ClassNotFoundException | SQLException e) {e.printStackTrace();} finally {//6.释放资源rs.close();stmt.close();conn.close();}}
}

Statement和PrepareStatement

  • Statement的使用存在SQL注入问题,而PrepareStatement解决了SQL注入的问题
  • Statement是编译一次执行一次,PrepareStatement是编译一次,可执行多次,后者的效率更高一些
  • PrepareStatement更常用一些,但有些情况也会使用Statement

一文带你了解JDBC相关推荐

  1. 一文带你全方位(架构,原理及代码实现)了解Flink(3.2W字建议收藏)

    注:最底部有PDF目录 一 flink简介 1.1 什么是flink Apache Flink是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎.F ...

  2. 一文带你入门flink sql

    文章目录 一文带你入门flink sql 写在前面 环境准备 正文 遇到的一些问题 错误一 错误二 错误三 一文带你入门flink sql 写在前面 本次实战主要是通过Flink SQL Client ...

  3. java etl工具_一文带你入门ETL工具-datax的简单使用

    什么是ETL? ETL负责将分布的.异构数据源中的数据如关系数据.平面数据文件等抽取到临时中间层后进行清洗.转换.集成,最后加载到数据仓库或数据集市中,成为联机分析处理.数据挖掘的基础. ETL是数据 ...

  4. linux awk语法格式,Awk是什么?一文带运维小白快速掌握Linux Awk用法

    原标题:Awk是什么?一文带运维小白快速掌握Linux Awk用法 作者:a8 Awk.sed与grep,俗称Linux下的三剑客,它们之间有很多相似点,但是同样也各有各的特色,相似的地方是它们都可以 ...

  5. DNN、RNN、CNN.…..一文带你读懂这些绕晕人的名词

    DNN.RNN.CNN.-..一文带你读懂这些绕晕人的名词 https://mp.weixin.qq.com/s/-A9UVk0O0oDMavywRGIKyQ 「撞脸」一直都是娱乐圈一大笑梗. 要是买 ...

  6. 一文带你深入理解JVM内存模型

    一文带你深入理解JVM内存模型 一.JAVA的并发模型 共享内存模型 在共享内存的并发模型里面,线程之间共享程序的公共状态,线程之间通过读写内存中公共状态来进行隐式通信 该内存指的是主内存,实际上是物 ...

  7. 训练的神经网络不工作?一文带你跨过这37个坑

    近日,Slav Ivanov 在 Medium 上发表了一篇题为<37 Reasons why your Neural Network is not working>的文章,从四个方面(数 ...

  8. 还不会ts?一文带你打开ts的大门

    一文带你打开ts的大门 序言 一.什么是TypeScript? 1.编程语言的类型 2.TypeScript究竟是什么? 二.为什么要学习TypeScript? 1.程序更容易理解 2.效率更高 3. ...

  9. 一文带你了解Java Agent

    转载自  一文带你了解Java Agent Java Agent这个技术,对于大多数同学来说都比较陌生,像个黑盒子.但是多多少少又接触过,实际上,我们平时用的很多工具,都是基于Java Agent实现 ...

最新文章

  1. wireshark从入门到精通(协议排错安全篇)7
  2. linux 重定向 2gt;gt;,编写我自己的linux shell I / O重定向’gt;’函数
  3. 微信小程序 引用 map 地图,显示当前位置
  4. laravel -admin 禁止某一行删除
  5. Python调用微博API获取微博内容
  6. Codeforeces Round #226 (Div. 2) E---Bear in the Field(矩阵快速幂)
  7. 数据压缩作业一:音频时域频域特性分析(Audacity)及RGB文件熵的计算
  8. python判断是否为素数_python判断一个数是否为素数
  9. 微信小程序中添加锚点的设置
  10. wince植入胎压监测_【精】创酷一个月实际用车感受+轻松解决仪表盘失灵问题+胎压监测...
  11. 请领导批阅文件怎么说_请领导批复文件怎么说
  12. 小米平板4(Plus) LTE 版本,开通话模式教程(MIUI)
  13. alios thing 信号量_信号量_AliOS Things内核_API参考文档_AliOS Things 文档_IoT物联网操作系统 - 阿里云...
  14. 008 计算某一日是这一年的第几天
  15. HTML5 移动页面自适应手机屏幕四种方法(禁止html5手机端双击页面放大的问题)
  16. docker的介绍、安装、镜像命令
  17. 01、uniapp连接MUMU模拟器
  18. 大数据技术之_17_Storm学习_Storm 概述+Storm 基础知识+Storm 集群搭建+Storm 常用 API+Storm 分组策略和并发度
  19. 菜鸟炒美股(一) (转)
  20. Java计算机毕业设计 物业管理系统

热门文章

  1. npm 安装报错 npm ERR! code Z_BUF_ERROR 问题解决
  2. 资料:《新概念英语》旧版(第一册)原文及全文翻译
  3. Non-dairynbsp;creamernbsp;植脂末
  4. 根升余弦滤波器的作用
  5. driver failed programming external connectivity on endpoint
  6. 《PyInstaller打包实战指南》第十一节 其他进阶命令
  7. 没有 Nginx 的未来,Cloudflare 工程师正在用 Rust 重构代码!
  8. 今天是礼拜天(转移)
  9. 双极权电阻网络串联电阻阻值推导
  10. Python基础学习笔记6