【Java】JDBC的使用

JDBC

package jdbc_demo;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;public class jdbc {public static void main(String[] args)throws Exception {//1.注册驱动Class.forName("com.mysql.cj.jdbc.Driver");//2.获取连接String url="jdbc:mysql://127.0.0.1:3306/test";String username="root";String password="123";Connection conn=DriverManager.getConnection(url,username,password);//3.定义sqlString sql ="update account set money = 3000 where id=1";//4.获取执行sql的对象StatementStatement stmt = conn.createStatement();//5.执行sqlint count = stmt.executeUpdate(sql);//返回受影响的行数//6.处理结果System.out.println("受影响"+count+"行");//7.释放资源stmt.close();conn.close();}
}

数据修改成功。

DriverManager

Driver Manager的作用:

  1. 注册驱动

  2. 获取数据库连接

静态代码块会进行注册驱动。

不使用SSL

jdbc:mysql:///db1?useSSL=false

Connection

Connection作用:

  1. 获取执行SQL的对象

  2. 管理事务

  1. 获取执行SQL的对象

    • 普通执行SQL对象
    Statement createStatement()
    
    • 预编译SQL的执行SQL对象:防止SQL注入
    PreparedStatement prepareStatement(sql)
    
    • 执行存储过程的对象
    CallableStatement prepareCall(sql)
    
  2. 事务管理

    • MySQL事务管理

    • JDBC事务管理

    开启事务:setAutoCommit(boolean autoCommit):true; true为自动提交事务,false为手动提交事务,也就是开启事务

    提交事务:commit()

    回滚事务:rollback()

    package jdbc_demo;import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.sql.Statement;public class jdbc {public static void main(String[] args)throws Exception {//1.注册驱动Class.forName("com.mysql.cj.jdbc.Driver");//2.获取连接String url="jdbc:mysql://127.0.0.1:3306/test";String username="root";String password="123";Connection conn=DriverManager.getConnection(url,username,password);conn.setAutoCommit(false);//3.定义sqlString sql1 ="update account set money = 3000 where id=1";String sql2 ="update account set money = 3000 where id=2";//4.获取执行sql的对象StatementStatement stmt = conn.createStatement();//5.执行sqlint count1 = 0;//返回受影响的行数int count2 = 0;try {count1 = stmt.executeUpdate(sql1);count2 = stmt.executeUpdate(sql2);//都执行完毕了,就提交事务conn.commit();} catch (Exception e) {conn.rollback();throw new RuntimeException(e);}//6.处理结果System.out.println("受影响"+count1+"行");System.out.println("受影响"+count2+"行");//7.释放资源stmt.close();conn.close();}
    }
    

Statement

ResultSet

while(rs.next())//光标移动到下一行,并且判断当前行数据是否有效
{//获取数据rs.getXxx(参数);
}
package jdbc_demo;import java.sql.*;public class jdbc {public static void main(String[] args)throws Exception {//1.注册驱动Class.forName("com.mysql.cj.jdbc.Driver");//2.获取连接String url="jdbc:mysql://127.0.0.1:3306/test";String username="root";String password="123";Connection conn=DriverManager.getConnection(url,username,password);conn.setAutoCommit(false);//3.定义sqlString sql="select * from account";//4.获取Statement对象Statement stmt = conn.createStatement();//执行sql语句ResultSet rs=stmt.executeQuery(sql);while(rs.next()){int id=rs.getInt(1);String name=rs.getString(2);double money =rs.getDouble(3);System.out.println(id);System.out.println(name);System.out.println(money);System.out.println("--------------------");}//7.释放资源stmt.close();conn.close();}
}

需求:查询account账户表数据,封装为Account对象中,并且存储到ArrayList集合当中。

package jdbc_demo;import pojo.Account;import java.sql.*;
import java.util.ArrayList;
import java.util.List;public class jdbc {public static void main(String[] args)throws Exception {//1.注册驱动Class.forName("com.mysql.cj.jdbc.Driver");//2.获取连接String url="jdbc:mysql://127.0.0.1:3306/test";String username="root";String password="123";Connection conn=DriverManager.getConnection(url,username,password);conn.setAutoCommit(false);//3.定义sqlString sql="select * from account";//4.获取Statement对象Statement stmt = conn.createStatement();//执行sql语句ResultSet rs=stmt.executeQuery(sql);//创建集合List<Account> list=new ArrayList<>();while(rs.next()){Account account=new Account();int id=rs.getInt(1);String name=rs.getString(2);double money =rs.getDouble(3);account.setId(id);account.setName(name);account.setMoney(money);list.add(account);}System.out.println(list);//7.释放资源stmt.close();conn.close();}
}

PreparedStatement

PreparedStatement可以在预编译阶段预防SQL注入问题。

    public void testLogin_Inject() throws SQLException {String url="jdbc:mysql://127.0.0.1:3306/test";String username="root";String password="123";Connection conn=DriverManager.getConnection(url,username,password);//接收用户输入 用户名和密码String name="张三";String pwd="123456";String sql ="select * from user where username='"+name+"'and password='"+pwd+"'";Statement stmt=conn.createStatement();ResultSet rs=stmt.executeQuery(sql);if(rs.next()){System.out.println("登录成功");}else{System.out.println("登录失败");}}
public void testLogin_Inject() throws SQLException {String url="jdbc:mysql://127.0.0.1:3306/test";String username="root";String password="123";Connection conn=DriverManager.getConnection(url,username,password);//接收用户输入 用户名和密码String name="张三";String pwd="'or'1'='1";String sql ="select * from user where username='"+name+"'and password='"+pwd+"'";Statement stmt=conn.createStatement();ResultSet rs=stmt.executeQuery(sql);if(rs.next()){System.out.println("登录成功");}else{System.out.println("登录失败");}}

为什么可以登录成功?分析一下sql语句

select * from user where username='张三'and password=''or'1'='1'

前半段无论正确与否,后半段的1=1永远成立,又是or连接符,自然查询成功了。

如何解决?

package jdbc_demo;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;public class PreparedStatement {public static void main(String[] args)throws Exception {String url="jdbc:mysql://127.0.0.1:3306/test";String username="root";String password="123456";String name="张三";String pwd="'or'1'='1";Connection conn= DriverManager.getConnection(url,username,password);// 修复了 SQL 语句中的问题String sql ="select * from user where username=? and password=?";java.sql.PreparedStatement pstmt = conn.prepareStatement(sql);pstmt.setString(1,name);pstmt.setString(2,pwd);//执行sqlResultSet rst=pstmt.executeQuery();if(rst.next()){System.out.println("登录成功");}else{System.out.println("登录失败");}}
}

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

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

相关文章

c JPEG 1D DCT 优化二(AAN)

这两个图可能就是AAN 的数学模型 优化DCT就是用代码实现矩阵9,10 9和10已经把64个系数缩小到一半32个了。光从这两图可看出&#xff0c;优化后乘法少了64-32436个&#xff0c;加法少了64-32-824。估计优化时间可少百分之40左右。 实际编码640480 的图片&#xff0c;程序执行时…

FlinkSQL【分组聚合-多维分析-性能调优】应用实例分析

FlinkSQL处理如下实时数据需求&#xff1a; 实时聚合不同 类型/账号/发布时间 的各个指标数据&#xff0c;比如&#xff1a;初始化/初始化后删除/初始化后取消/推送/成功/失败 的指标数据。要求实时产出指标数据&#xff0c;数据源是mysql cdc binlog数据。 代码实例 --SET t…

解决系统开发中的跨域问题:CORS、JSONP、Nginx

文章目录 一、概述1.问题场景2.浏览器的同源策略3.解决思路 二、一点准备工作1.创建前端工程12.创建后端工程3.创建前端工程24.跨域问题 三、方法1&#xff1a;使用CORS四、方法2&#xff1a;JSONP五、方法3&#xff1a;Nginx1.安装和启动&#xff08;windows&#xff09;2.使用…

TestNG注释

目录 TestNG注释列表 BeforeXXX和AfterXXX注释放在超类上时如何工作&#xff1f; 使用BeforeXXX和AfterXXX TestNG注释 TestNG是一个测试框架&#xff0c;旨在简化广泛的测试需求&#xff0c;从单元测试&#xff08;隔离测试一个类&#xff09;到集成测试&#xff08;测试由…

【LGR-172-Div.4】洛谷入门赛 #19(A—H,c++详解!)

文章目录 【LGR-172-Div.4】洛谷入门赛 #19A.分饼干 I题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提示样例解释 1样例解释 2数据范围与约定思路: 代码 B.分饼干 II题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样…

书生·浦语大模型实战营第四次课堂笔记

先来看看参考作业 哈哈到这才想起来写笔记 倒回去看发现要求将不要葱姜蒜换成自己的名字和昵称&#xff01; 好好好我就是不配玩&#xff08;换成管理员也不行&#xff01;&#xff09; 诶怎么能进这个环境&#xff1f;要进双系统ubuntu&#xff1f; 现在看视频发现原来是…

HarmonyOS 页面跳转控制整个界面的转场动画

好 本文 我们来说 页面间的转场动画 就是 第一个界面到另一个界面 第一个界面的退场和第二个界面的进场效果 首先 我这里 创建了两个页面文件 Index.ets和AppView.ets index组件 编写代码如下 import router from "ohos.router" Entry Component struct Index {b…

鉴源实验室|自动驾驶仿真测试技术分析

01 引言 随着科技的不断发展&#xff0c;自动驾驶技术逐渐成为汽车行业的热门话题。然而&#xff0c;要将自动驾驶车辆投放到真实道路上之前&#xff0c;必须进行广泛的测试&#xff0c;以确保其在各种情况下都能安全可靠地运行。自动驾驶车辆的测试是一个复杂而昂贵的过程。…

大数据开发之Hadoop(完整版+练习)

第 1 章&#xff1a;Hadoop概述 1.1 Hadoop是什么 1、Hadoop是一个由Apache基金会所开发的分布式系统基础架构。 2、主要解决&#xff0c;海量数据的存储和海量数据的分析计算问题。 3、Hadoop通常是指一个更广泛的概念-Hadoop生态圈 1.2 Hadoop优势&#xff08;4高&#xf…

2024年AMC8被强制提前交卷事件应该告一段落了,向前看吧孩子们

原以为到今天开考前一切和往年一样的2024年AMC8竞赛也会和往年一样&#xff08;真绕&#xff09;&#xff0c;没想到出了个大规模强制提前交卷时间&#xff0c;让很多家长和孩子不可理解、很难受&#xff0c;甚至有一些家长在收集证据&#xff0c;准备请相关部门去调查&#xf…

DC-3靶机刷题记录

靶机下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1-P5ezyt5hUbmmGMP4EI7kw?pwdrt2c 提取码&#xff1a;rt2c 参考&#xff1a; http://t.csdnimg.cn/hhPi8https://www.vulnhub.com/entry/dc-32,312/ 官网http://t.csdnimg.cn/5mVZ7DC-3 (1).pdfhttps://…

[AutoSar]BSW_OS 05 Autosar OS_schedule table

目录 关键词平台说明一、调度表 关键词 嵌入式、C语言、autosar、OS、BSW 平台说明 项目ValueOSautosar OSautosar厂商vector &#xff0c;芯片厂商TI 英飞凌编程语言C&#xff0c;C编译器HighTec (GCC) >>>>>回到总目录<<<<<< 一、调度表…