【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.mzph.cn/news/635413.shtml

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

相关文章

vue报错 ‘超出最大堆栈大小‘

当Vue应用程序报错"超出最大堆栈大小"时&#xff0c;通常是由于递归调用导致的无限循环或过深的函数调用堆栈。 要解决这个问题&#xff0c;你可以尝试以下几种方法&#xff1a; 检查是否存在无限递归&#xff1a;检查你的代码中是否存在无限递归调用。递归调用是指…

本周Github上有趣的11个项目

本周Github上有趣的项目&#xff1a; 1、AI 网关 速度极快的 AI 网关。通过 1 个快速且友好的 API 升读 100 多个大模型。 Portkey 的 AI 网关是您的应用程序和托管 LLM 之间的接口。它通过统一的 API 简化了对 OpenAI、Anthropic、Mistral、LLama2、Anyscale、Google Gemini…

计算机中如何存储数字、怎么运算、以及越界了怎么办

前言 日常开发工作中&#xff0c;很难用到二进制运算&#xff0c;编程语言已经帮我们做好处理了&#xff0c;除非研究的就是底层技术&#xff0c;比如硬件开发&#xff0c;这是避不过去的&#xff0c;但是你如果还想深入研究一番&#xff0c;本篇论文就值的你看。 问题 在开…

【开源】基于JAVA语言的教学资源共享平台

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 课程档案模块2.3 课程资源模块2.4 课程作业模块2.5 课程评价模块 三、系统设计3.1 用例设计3.2 类图设计3.3 数据库设计3.3.1 课程档案表3.3.2 课程资源表3.3.3 课程作业表3.3.4 课程评价表 四、系统展…

【开发掉坑】go 中 interface 的 nil 判断

今天介绍下 go 中的 interface(any) 的 nil 判断&#xff0c;项目中遇到的一个小问题&#xff0c;知识遗忘了&#xff0c;再做个记录。 前言 最近在合作开发项目的过程中&#xff0c;发现小伙伴写了一段代码&#xff0c;示意代码如下&#xff1a; package mainimport("…

逸学Docker【java工程师基础】3.4Docker安装redis

1.拉取redis docker pull redis 2.选择一个合适的redis 版本的配置文件 Redis configuration | Redis 或者这个 链接&#xff1a;https://pan.baidu.com/s/1RRdtgec4xBAgQghlhm0x1Q 提取码&#xff1a;ycyc 在1044行修改密码 3.提前在服务器建立 /data/redis 文件夹&…

【华为 ICT HCIA eNSP 习题汇总】——题目集1

1、&#xff08;多选&#xff09;根据下面所示的命令输出&#xff0c;下列描述中正确的是&#xff1f; A、GigabitEthernet0/0/1 允许VLAN1通过 B、GigabitEthernet0/0/1 不允许VLAN1通过 C、如果要把 GigabitEthernet0/0/1 变为 Access 端口&#xff0c;首先 需要使用命令“un…

2023 年,我患上了 AI 焦虑症!

【作者有话说】2023 年对我来说是神奇的一年&#xff0c;我意外地从一个程序员变成了一个 AI 资讯届的“网红”&#xff0c;到年底时我在 X 平台的阅读量超过 1 亿&#xff0c;微博上的阅读量则超过 10 亿&#xff0c;很多人通过我的微博或者 X 了解最新的 AI 资讯、教程和 Pro…

SpringMVC下半篇之整合ssm

4.ssm整合 4.1.创建表 CREATE TABLE account (id int(11) NOT NULL AUTO_INCREMENT,name varchar(20) DEFAULT NULL,money double DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8;4.2.创建工程 4.3.pom.xml <?xml version"1.0" encoding&…

分布式定时任务系列8:XXL-job源码分析之远程调用

传送门 分布式定时任务系列1&#xff1a;XXL-job安装 分布式定时任务系列2&#xff1a;XXL-job使用 分布式定时任务系列3&#xff1a;任务执行引擎设计 分布式定时任务系列4&#xff1a;任务执行引擎设计续 分布式定时任务系列5&#xff1a;XXL-job中blockingQueue的应用 …

蓝桥杯备战 每日一题 (4)

题目地址 首先我们要有一个知识储备 1 加法&#xff1a;(ab)%m(a%mb%m)%m 2 减法&#xff1a;(a-b)%m(a%m-b%m)%m 3 乘法&#xff1a;a*b%m(a%m)*(b%m)%m 我们可以每次计算就可以取余一次&#xff0c;这样就保证了最后取余的结果和一起相加再取余的结果一样 然后这个题目要怎…

【LeetCode】数学精选4题

目录 1. 二进制求和&#xff08;简单&#xff09; 2. 两数相加&#xff08;中等&#xff09; 3. 两数相除&#xff08;中等&#xff09; 4. 字符串相乘&#xff08;中等&#xff09; 1. 二进制求和&#xff08;简单&#xff09; 从字符串的右端出发向左做加法&#xff0c;…

SQLAlchemy ORM指南:简化数据库操作的最佳实践

SQLAIchemy 开发指南 背景&#xff1a; ​ SQLAlchemy是一个数据库的ORM框架&#xff0c;让我们操作数据库的时候不要再用SQL语句了&#xff0c;跟直接操作模型一样。操作十分便捷&#xff0c;其实SQLAlchemy应该是在Flask和Django应用的特别多&#xff0c;而且在flask中已经…

Oracle架构_数据库底层原理、机制 (授人以渔)

目录 系统全局区SGA 高速缓存缓冲区(数据库缓冲区) 日志缓冲区 共享池 其他结构 用户连接进程 用户进程User Process Server Process服务进程 程序全局区PGA Oracle的connect连接和session会话与User Process紧密相关 后台进程 数据库写入进程(DBWn) 检查点(CKPT)…

多维时序 | Matlab实现CNN-LSTM-Mutilhead-Attention卷积长短期记忆神经网络融合多头注意力机制多变量时间序列预测

多维时序 | Matlab实现CNN-LSTM-Mutilhead-Attention卷积长短期记忆神经网络融合多头注意力机制多变量时间序列预测 目录 多维时序 | Matlab实现CNN-LSTM-Mutilhead-Attention卷积长短期记忆神经网络融合多头注意力机制多变量时间序列预测效果一览基本介绍程序设计参考资料 效果…

“深入理解 Docker 和 Nacos 的单个部署与集成部署“

目录 引言&#xff1a;Docker Nacos 单个部署1.1 什么是 Docker&#xff1f;Docker 的概念和工作原理Docker 为什么受到广泛应用和认可 1.2 什么是 Nacos&#xff1f;Nacos 的核心功能和特点Nacos 在微服务架构中的作用 1.3 Docker 单个部署 Nacos Docker Nacos 集成部署总结&a…

【重点!!!】【背包】【回溯】518.零钱兑换II

题目 跟39.组合总数、322.零钱兑换题目很类似。 法1&#xff1a;背包DP&#xff0c;最优解法 解释如下&#xff1a; 0 1 2 3 4 5(背包容量)1 0 0 0 0 0 没有硬币的时候&#xff09; 0 1 2 3 4 5(背包容量) 1 1 1 1 1 1 1 0 1 2 3 4 5(背包容量) 1 …

Ubuntu 22.04 安装MySql

MySQL是非常常用的关系型数据库,无论是大厂还是小厂,都有它的身影。最大的优点是免费,安装起来也比较简单。 MySQL的架构 画了个简图,描述了下MySQL的架构。 其中的比较有趣的点在于连接池和存储引擎。连接池缓存了数据库和客户端的TCP连接,以减少建立连接的开销。存储引…

git中合并分支时出现了代码冲突怎么办

目录 第一章、Git代码冲突介绍1.1&#xff09;什么是Git代码冲突①git merge命令介绍②代码冲突原因 1.2&#xff09;提示代码冲突的两种情况①本地不同分支的文件有差异时&#xff1a;②本地仓库和git远程仓库的文件有差异时&#xff1a; 1.3&#xff09;解决合并时的代码冲突…

calloc与realloc和malloc的区别以及new

目录 calloc、realloc 和 malloc 三个函数的区别在于 更详细的示例代码 交叉使用 内存泄漏 悬空指针 内存重叠 new 的语法 使用 new 运算符在堆上创建学生对象的示例 new和malloc都可以用于在堆上分配内存 calloc、realloc 和 malloc 是 C/C 中用于动态内存分配的函…