首页 > 其他分享 >JDBC学习笔记

JDBC学习笔记

时间:2023-06-06 10:45:02浏览次数:40  
标签:语句 JDBC 数据库 SQL 笔记 学习 PreparedStatement Statement sql

1、什么是JDBC?

JDBC是一类接口,制定了统一访问各类关系型数据库的api,屏蔽了底层数据库的差异,可以通过JDBC API 方便地实现对各种主流数据库的操作。

2、开发步骤?

访问数据库时,首先要注册和加载数据库驱动,只需加载一次,然后在每次访问数据库时创建一个Connection实例,获取数据库连接,获取连接后,执行需要的SQL语句,最后完成数据库操作时释放与数据库间的连接。

第一步:注册加载数据库驱动

此步骤的目的是告知JVM使用的是哪一个数据库的驱动。Java加载数据库驱动的方法是调用Class类的静态方法forName(),语法格式如下:

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

第二步:获得数据库连接

加载完数据库驱动后,就可以建立数据库的连接了,需要使用DriverManager类的静态方法getConnection()方法来实现。代码如下:

Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/database_name";
String user = "root";
Strign password = "root"
//建立连接
Connection conn = DriverManager.getConnection(url, user, password);

  

第三步:获得语句执行对象,然后执行SQL语句,获取执行结果,最后释放资源

建立了连接之后,就可以使用Connection接口的createStatement()方法来获取Statement对象,也可以调用prepareStatement()方法获得PrepareStatement对象,通过executeUpdate()方法来执行SQL语句。

String sql = "insert into user(username, sex, address) values('张三','1','北京市')";
Statement stmt = conn.createStatement();    //创建一个Statement对象
stms.executeUpdate(sql);                   //执行SQL语句
conn.close();       

  

还可以使用PreparedStatement接口中的executeUpdate()方法,如下:

String sql = "insert into user(username, sex, address) values(?,?,?)";
PreparedStatement ps = conn.preparedStatement(sql);
ps.setString(1, "张三");    //为第一个问号赋值
ps.setInt(2, 1);           //为第二个问号赋值
ps.setString(3, "北京市"); //为第三个问号赋值
ps.executeUpdate();
conn.close();

  

3、PreparedStatement与Statement区别


1.PreparedStatement在使用时只需要编译一次,就可以运行多次,Statement每运行一次就编译一次,所以PreparedStatement的效率更高
2.PreparedStatement的sql语句为用?(占位符)来替换值,Statement的sql语句为字符串拼接
3.PreparedStatement解决了sql注入的问题,Statement没有解决,因为PreparedStatement有一个预编译的过程,就算传入占位符的数据中有sql关键字也都被认为是值。Statement是字符串拼接,传入的整个字符串被默认为sql语句

SQL注入攻击:

举一个简单的例子,假设有一个登录页面,用户需要输入用户名和密码,后台使用 JDBC 执行如下 SQL 语句来验证登录:

SELECT * FROM user WHERE username='xxx' AND password='yyy';

假如攻击者在用户名处输入如下内容:

xxx' OR 1=1; --

那么最终执行的 SQL 语句就会变成:

SELECT * FROM user WHERE username='xxx' OR 1=1; --' AND password='yyy';

其中 -- 表示注释掉后面的语句,此时 SQL 语句等价于:

SELECT * FROM user WHERE username='xxx' OR 1=1;


 

标签:语句,JDBC,数据库,SQL,笔记,学习,PreparedStatement,Statement,sql
From: https://www.cnblogs.com/coooookie/p/17459869.html

相关文章

  • H3C交换机配置学习随笔
    常用命令:>dismac-addressxxxx-xxxx#查看物理地址信息>intgx/x#进入端口>disthis#显示端口信息>user-bindmac-addressxxxx-xxxx #绑定用户物理地址>undouser-bindmac-addressxxxx-xxxx#解除绑定用户物理地址>descriptionserver-idrac添加端口描述信息网络表格......
  • uniGUI学习之UniHTMLMemo1(62)
    https://blog.csdn.net/dlboy2018/article/details/82903680UniHTMLMemo1.Lines.Add("<p>"+UniHTMLMemo3.Text);//发UniHTMLMemo1.Lines.Clear();//清空输入框在这里你会发现我在发送文字处增加了“<p>”,那是因为如果不增加这个,接收窗口显示时会把多次信息链接到一起,没有换......
  • 【学习笔记】根号算法
    分块经典操作暴力思想先考虑最暴力的做法如何实现。平衡思想设长度\(n\),块长\(B\)。多数是定一个块长,使整块与散块、查询与修改的复杂度近似相等,并分别考虑整块好散块的情况。暴力重构指对散块处理时如果会破坏一个块的既有标记等等,可以选择暴力重新构建当前的标记。复......
  • uni-app笔记
    uni-app笔记uni-app使用vue的语法+小程序的标签和API所有组件与属性名都是小写,单词之间以连字符-连接每个vue文件的根节点必须为<template>,且这个<template>下只能且必须有一个根<view>组件view==div<scriptlang="ts">//通过使用lang="ts"可以直接编写typescript......
  • Vue笔记
    Vue笔记vuex-router-sync插件:https://segmentfault.com/a/1190000037680351学到vue.js路由就没学了!还有过渡和动画、混入、AJAX、响应接口没学进度:https://learning.dcloud.io/#/?vid=5https://cn.vuejs.org/v2/guide/index.html模板组件化应用构建//问题:props是什么?技巧:......
  • uniCloud笔记
    uniCloud笔记结合:uni-admin实现后台的云管理,schema2code辅助自动生成代码(只需要定义好表结构)云函数云函数,是将本地写好的函数上传到云端,在云端的node.js的环境中运行。可以在本地的页面中在生命周期函数(钩子函数)中调用云函数如下://在组件/页面加载时,调用云函数的回调函数on......
  • Vue-Cli笔记
    Vue-Cli笔记新手上路在创建模式的时候,选择最后一个模式:自定义模式,创建项目,只需勾选下图3个配置,使用空格进行选择和不选择。然后选择vue版本2.x在选择css预编译中选择less最后选择是否将babel、Eslint等文件放到一个独立的文件中或放入package.json,我们选择第一项独立的文......
  • javascript笔记
    javascript笔记获得焦点onfocus,失去焦点onblurisNaN()判断是非数字undefined和数字相加最后的结果是NaNnull和数字相加最后的结果是数字typeof空格变量名或typeof(变量名)可以检测变量的类型parseInt('120.8px')最后的结果是120->数字;自动去掉px......
  • 算法学习day44动态规划part06-518、377
    packageLeetCode.DPpart06;/***518.零钱兑换II*给你一个整数数组coins表示不同面额的硬币,另给一个整数amount表示总金额。*请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回0。*假设每一种面额的硬币有无限个。*题目数......
  • 算法学习day45动态规划part07-322、279
    packageLeetCode.DPpart07;/***322.零钱兑换*给你一个整数数组coins,表示不同面额的硬币;以及一个整数amount,表示总金额。*计算并返回可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回-1。*你可以认为每种硬币的数量是无限的......