韩顺平Java | C25 JDBC和连接池(上)

概述

JDBC概述:JDBC为访问不同数据库提供统一接口,为使用者屏蔽细节问题。Java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统,从而完成对数据库的各种操作。
在这里插入图片描述

// 模拟代码
//JdbcInterface.java --Java规定的JDBC接口(方法)
public Interface JdbcInterface {public Object getConnect(); //连接public void crud(); //crud操作public void close(); //关闭连接
}//MySQLJdbcImpl.java --厂商的jdbc实现,数据库驱动
public class MysqlJdbcImpl implements JdbcInterface {@Overridepublic Object getConnect() { //连接System.out.println("得到mysql连接");return null;}public void crud(){ //crud操作System.out.println("完成mysql增删改查");}public void close(){ //关闭连接System.out.println("关闭mysql连接");}
}//TestJDBC.java --调用
public class TestJDBC {public static void main(String[] args) {JdbcInterface jdbcinterface = new MysqlJdbcImpl(); //创建接口引用jdbcinterface.getConnection()  //通过接口调用实现类[多态 动态绑定机制:不同的对象,调用同意方法,返回不同的状态(不同类型的不同实现)]jdbcinterface.crud();jdbcinterface .close();}
}

JDBC快速入门

前置工作-添加驱动jar包:
1 拷贝到project_name/lib目录下
2 右击jar包 > Add as library… > OK

CREATE TABLE actor (id INT PRIMARY KEY AUTO_INCREMENT,`name` VARCHAR(32) NOT NULL DEFAULT '',sex CHAR(1) NOT NULL DEFAULT '女',bordate DATETIME,phone VARCHAR(12));

JDBC程序编写步骤
1 注册驱动-加载Driver类
2 获取连接-得到Connection
3 执行增删改查-发送SQL给mysql执行
4 释放资源-关闭相关连接

public class jdbc01 {public static void main(String[] args) throws SQLException {//1.注册驱动Driver driver = new Driver(); //创建driver对象//2.得到连接-mysql连接本质就是socket连接//(1) jdbc:mysql:// 规定好的表示协议,通过jdbc方式连接mysql//(2) localhost:3306 服务的ip(主机)和mysql监听端口//(3) hsp_db02 表示连接到mysql dbms的哪个数据库String url = "jdbc:mysql://localhost:3306/hsp_db02";//将用户名和密码放到Properties对象,key是user和password是规定好的,值根据实际情况填写Properties properties = new Properties();properties.setProperty("user", "root");//用户 密码//获取连接Connection connect = driver.connect(url, properties);//3.执行sqlString sql = "insert into actor values(null, '刘德华', '男', '1970-6-1', '110')"; //序号自增长用空Statement statement = connect.createStatement(); //用于执行静态SQL语句dml,并返回其生成的结果的对象;select语句使用executeQuery(sql)int rows = statement.executeUpdate(sql); //受影响的行数System.out.println(rows > 0 ? "成功": "失败"); //三元运算符//4.关闭连接statement.close();connect.close(); //不关闭会导致mysql连接太多,后续程序连接不上}
}

※JDBC API

JDBC API是一系列的接口,它统一和规范了应用程序与数据库的连接、执行SQL语句,并得到返回结果等各类操作,相关类和接口在java.sql与javax.sql包中。

Jdbc API
DriverManger驱动管理类
DriverManager.getConnection(url, user, password)
Connection接口
createStatement 创建Statement对象
preparedStatement(sql) 创建Statement对象
Statement接口
excuteUpdate(sql) 执行dml语句,返回影响的行数
excuteQuery(sql) 执行查询语句,返回ResultSet对象
excute(sql) 执行任意语句,返回布尔值
PreparedStatement接口
excuteUpdate() 执行dml语句,返回影响的行数
excuteQuery() 执行查询语句,返回ResultSet对象
excute() 执行任意语句,返回布尔值
setXxx(占位符索引,占位符的值),解决SQL注入
setObject(占位符索引,占位符的值),作用同上,当对象来看
ResultSet结果集
next() 从第一行前面开始向下移动一行,没有下一行则返回false
previous() 向上移动一行,没有上一行则返回false
getXxx(列索引 | 列名) 返回对应列值,接收类型为Xxx
getObject(列索引 | 列名) 返回对应列值,接收类型为Object

在这里插入图片描述
PrepareStatement
DriverManager
Statement
ResultSet

获取数据库连接的最佳方式

public void connect05() throws IOException, ClassNotFoundException, SQLException {//使用配置文件,连接数据库更灵活 -- 最完善//通过Properties对象获取配置文件信息Properties properties = new Properties();properties.load(new FileInputStream("src\\mysql.properties"));String user = properties.getProperty("user");String password = properties.getProperty("password");String url = properties.getProperty("url");String driver = properties.getProperty("driver");//使用反射加载Driver类-动态加载,更加灵活,减少依赖性// 在加载driver类时完成注册(静态代码块)Class.forName(driver);Connection connection = DriverManager.getConnection(url, user, password);System.out.println(connection);}

ResuleSet 结果集

· 表示数据库结果集的数据表,通常通过执行查询数据库的语句生成
· ResuleSet对象保持一个光标指向其当前的数据行,最初光标位于第一行之前
· next方法将光标移动到下一行,并且由于在ResultSet对象中没有更多行时返回false,因此使用while循环遍历结果

// 执行给定的SQL语句,该语句返回单个ResultSet对象ResultSet resultSet = statement.executeQuery(sql); //debug: resultSet = {JDBC42ResultSet@888} 是jdbc接口,实际是实现了该接口的类//5 使用while取出对象while (resultSet.next()) {int id = resultSet.getInt(1); //获取改行的第一列数据String name = resultSet.getString(2);String sex = resultSet.getString(3);Date date = resultSet.getDate(4);System.out.println(id + "\t" + name + "\t" + sex + "\t" + date);}//6 关闭连接resultSet.close();

SQl注入

Statement

Interface Statement:Statement对象 用于执行静态SQL语句并返回其生成结果的对象。

在连接建立后,需要对数据库进行访问,执行命令或是SQL语句,可以通过Statement(存在SQL注入风险,实际开发中一般不使用)、PreparedStatement(预处理)、CallableStatement(存储过程)

SQL注入(SQL injection):是利用某些系统没有对用户输入的数据进行充分的检查,而在用户输入数据中注入非法的SQL语句段或命令,恶意攻击数据库。

SELECT * FROM admin WHERE name = 'tom' AND pwd = '123';
SELECT * FROM admin WHERE name = '1' or ' AND pwd = 1' or'1' = '1'; # 用户名为 1' or  密码为 or '1' = '1  查询条件永远正确

要防范SQL注入,只要用PreparedStatement(Statement扩展而来)取代Statement即可。

预处理

预处理查询

PreparedStatement执行的SQL语句中的参数用问号(?)来表示,调用PreparedStatement对象的.setXxx(param_index, param_value)方法来设置这些参数,方法中的两个参数分别是SQL语句中的参数索引(从1开始)、参数值
调用excuteQuery(),返回ResultSet对象
调用executeUpdate(),执行更新,包括增、删、修改,返回受影响的行数。
优点(升级Statement):不再使用+拼接sql语句,减少语法错误;有效解决sql注入问题(通过控制访问的.setXxx()方法校验);减少编译次数,提高效率。

//3 得到PreparedStatement// 3.1 组织sql语句String sql = "select `name`, pwd from admin where `name` = ? and pwd = ?"; //sql语句的?相当于占位符// 3.2 接口 真正返回的对象是实现了该接口的类的实例PreparedStatement preparedStatement = connection.prepareStatement(sql);// 3.3 给sql参数赋值preparedStatement.setString(1, admin_name);preparedStatement.setString(2, admin_pwd);// 4 执行给定的SQL语句,该语句返回单个ResultSet对象ResultSet resultSet = preparedStatement.executeQuery(); // 绑定更新后的sql,不填参数sql,否则是包含?的if (resultSet.next()) { //如果查询到一条记录,则说明该管理员存在System.out.println("恭喜,登录成功");} else { // 控制住完成密码System.out.println("sorry,登录失败");}

预处理DML

// 3.1 组织sql语句
String sql1 = insert into admin values (?, ?)";
String sql2 = update admin set name = ? where pwd = ?";
String sql3 = delete from admin where name = ?";
...
// 4 执行给定的SQL语句,该语句返回单个ResultSet对象
int rows = preparedStatement.executeUpdate()
System.out.println(rows > 0 ? "执行成功" : "执行失败")

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

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

相关文章

redis的设计与实现(五)——独立功能

1. Redis的其他功能 redis 除了简单对对象的增删改查的功能之外,其实还有其他高级功能,了解这些内容有利于我们更灵活的使用 redis 完成我们的业务功能。 2. 发布与订阅 2.1. 基本概念 很多中间件都有发布与订阅功能,但是,作为一…

文献阅读:LESS: Selecting Influential Data for Targeted Instruction Tuning

文献阅读:LESS: Selecting Influential Data for Targeted Instruction Tuning 1. 文章简介2. 方法介绍 1. Overview2. 原理说明 1. SGD上的定义2. Adam上的定义 3. 具体实现 1. Overview1. LoRA使用2. 数据选择3. LESS-T 3. 实验考察 & 结论 1. 实验设计2. 主…

UE5 在骨骼动画模型上绘制贴图

参考:Unreal 5.1 - How to paint damage textures and other effects on skeletal meshes 针对模型,在运行状态下通过射线指定一定范围,添加材质效果。 核心思路 通过射线获取命中点,作为材质参数材质中,命中的世界…

DP练习_P1002 [NOIP2002 普及组] 过河卒_python_蓝桥杯

P1002 [NOIP2002 普及组] 过河卒 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 1.DFS做超时40分 n, m, x, y map(int,input().split())flag [[0]*(n10) for _ in range(m10)] maps [[0]*(n10) for _ in range(m10)] d [[2,1],[2,-1],[-2,1],[-2,-1],[1,2],[1,-2],[-1,2]…

matlab 安装 mingw64(6.3.0),OPENEXR

matlab安装openexr 1. matlab版本与对应的mingw版本选择2. mingw(6.3.0)下载地址:3. matlab2020a配置mingw(6.3.0)流程“4. matlab 安装openexr方法一:更新matlab版本方法二:其他博文方法方法三…

【算法刷题 | 二叉树 06】4.10( 路径总和、路径总和 || )

文章目录 13.路径总和13.1问题13.2解法一:递归13.2.1递归思路(1)确定递归函数参数以及返回值(2)确定终止条件(3)确定递归逻辑 13.2.2代码实现 14.路径总和 ||14.1问题14.2解法一:递归…

HarmonyOS鸿蒙端云一体化开发--适合小白体制

端云一体化 什么是“端”,什么是“云”? 答:“端“:手机APP端 “云”:后端服务端 什么是端云一体化? 端云一体化开发支持开发者在 DevEco Studio 内使用一种语言同时完成 HarmonyOS 应用的端侧与云侧开发。 …

探索NDVI:了解植被指数的意义与应用

随着科技的进步和遥感技术的发展,我们能够更深入地了解地球上的植被覆盖情况,而其中一项重要的工具就是NDVI(Normalized Difference Vegetation Index,归一化植被指数)。NDVI不仅仅是一个数值,更是一扇窥探…

Keil开启代码提示功能

本文介绍Keil5开启代码提示功能。 进入这个 如此设置: 有的电脑的左边是空白栏,没有设置选项。应该如何解决呢? 找到MDK525安装包,其他版本的 Keil5 应该也可以。 用你的解压软件把它打开: 解压后会多出这些文…

python之字符串操作

1、切片操作 跟列表的切片很相似 代码示例 str1 chengxianzi996 print(str1[0:2]) print(str1[:10]) 代码解释:第一行:创建了一个字符串对象(其中单引号和双引号都可以创建字符串) 第二行提取前两个字符并输出 第三行输出s…

Linux LVM磁盘扩容

1、查看磁盘情况 df -h df -h2、查看逻辑卷 lvdisplay lvdisplay3、查看逻辑组 vgdisplay vgdisplay4、查看物理卷 pvdisplay pvdisplay5、查看磁盘 fdisk -l fdisk -l6、磁盘分区fdisk /dev/磁盘名 # 上一步查看到的新硬盘路径 fdisk /dev/vdb7、格式化磁盘mkfs -t ext4…

梯度提升树(Gradient Boosting Trees)

通过5个条件判定一件事情是否会发生,5个条件对这件事情是否发生的影响力不同,计算每个条件对这件事情发生的影响力多大,写一个梯度提升树(Gradient Boosting Trees)模型程序,最后打印5个条件分别的影响力。 示例一 梯…

字节对编码 (BPE):提升语言处理的效率和有效性

原文地址:byte-pair-encoding-bpe-bridging-efficiency-and-effectiveness-in-language-processing 2024 年 4 月 12 日 介绍 在快速发展的自然语言处理 (NLP) 领域,对人类语言高效解析和理解的追求带来了重大创新。字节对编码(BPE&#x…

C++ UML 类图介绍与设计

1 类图概述 UML(Unified Modeling Language),即统一建模语言,是用来设计软件的可视化建模语言。它的特点是简单、统一、图形化、能表达软件设计中的动态与静态信息。UML从目标系统的不同角度出发,定义了用例图、类图、对象图、状态图、活动图…

深拷贝总结

JSON.parse(JSON.stringify(obj)) 这行代码的运行过程,就是利用 JSON.stringify 将js对象序列化(JSON字符串),再使用JSON.parse来反序列化(还原)js对象;序列化的作用是存储和传输。&#xff08…

亚马逊云科技官方重磅发布GenAI应用开发学习路线(全免费)

今天小李哥给大家分享的是亚马逊云科技(AWS)最近官方发布的GenAI应用开发最佳学习路线,不仅内容非常全面更主要的是全部免费!大家动动小手就能成为GenAI开发大🐮! 1️⃣这个GenAI开发学习路线包括什么&…

遥感卫星:探索地球的科技之旅

遥感卫星是人类探索地球、理解地球、保护地球的重要工具,其发展历程承载了人类对地球的探索与认知的历程。从最初的概念到如今的高科技应用,遥感卫星技术的发展见证了人类科技的不断进步与创新。 初心萌芽: 遥感卫星的发展始于20世纪中叶&…

C语言高质量编程之assert()和const

目录 编程中常见的错误 assert() const 编程中常见的错误 在编程中我们通常会遇到三种错误形式,分别是:编译型错误,链接型错误,运行时错误。 编译型错误: 在编译阶段发生的错误,绝大多数情况是由语法错误…

利用Sentinel解决雪崩问题(二)隔离和降级

前言: 虽然限流可以尽量避免因高并发而引起的服务故障,但服务还会因为其它原因而故障。而要将这些故障控制在一定范围避免雪崩,就要靠线程隔离(舱壁模式)和熔断降级手段了,不管是线程隔离还是熔断降级,都是对客户端(调…

vue源码解析——v-if和v-for哪个优先级高,如何避免两者同时使用

首先,官方不推荐v-if和v-for在同一个元素上使用。其次,如果两者同时使用,v-if和v-for的优先级怎么确定?在vue2和vue3中这两者的优先级顺序不一样。vue2是v-for优先,条件不存在时也会渲染多个注释节点。在vue3中进行了改…