韩顺平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 {
	@Override
	public 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.执行sql
        String 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 ? "执行成功" : "执行失败")

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络——抓取icmp包

前言 本博客是博主用于记录计算机网络实验的博客,如果疏忽出现错误,还望各位指正。 抓包 我们是用Wireshark工具来进行抓包的。 ​在安装时候一路打勾安装即可,不过最后那个因为是英文,一定要看清,点了立即重启&am…

采用C#.Net +JavaScript 开发的云LIS系统源码 二级医院应用案例有演示

采用C#.Net JavaScript 开发的云LIS系统源码 二级医院应用案例有演示 一、系统简介 云LIS是为区域医疗提供临床实验室信息服务的计算机应用程序,可协助区域内所有临床实验室相互协调并完成日常检验工作,对区域内的检验数据进行集中管理和共享&#xff0…

【UE5.1】使用MySQL and MariaDB Integration插件——(2)查询

在上一篇(【UE5.1】使用MySQL and MariaDB Integration插件——(1)连接MySQL)基础上继续实现查询MySQL数据表功能。 效果 步骤 1. 这里先新建一个控件蓝图,命名为“WBP_OperateDB”,该界面用于在连接数据…

Java——线程

程序 为实现某些功能,使用计算机语言编写的一系列指令(代码)的集合 特指静态的,安装在硬盘中的代码集合 进程 运行中的程序(被加载到内存中),是操作系统进行资源分配的最小单位 线程 进程可以进一步细化为线程,是进程内一个…

运费计算(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int distance, c;float weight, price, discount, fee;//提示用户&#xff1b;printf("请输入路程&#xff0c;单价…

自动驾驶时代的物联网与车载系统安全:挑战与应对策略

随着特斯拉CEO埃隆马斯克近日对未来出行景象的描绘——几乎所有汽车都将实现自动驾驶&#xff0c;这一愿景愈发接近现实。马斯克生动比喻&#xff0c;未来的乘客步入汽车就如同走进一部自动化的电梯&#xff0c;无需任何手动操作。这一转变预示着汽车行业正朝着高度智能化的方向…

C语言基础---指针的基本语法

概述 内存地址 在计算机内存中&#xff0c;每个存储单元都有一个唯一的地址(内存编号)。通俗理解&#xff0c;内存就是房间&#xff0c;地址就是门牌号 指针和指针变量 指针&#xff08;Pointer&#xff09;是一种特殊的变量类型&#xff0c;它用于存储内存地址。指针的实…

六、数据呈现

目录 6.1 理解输入输出 6.1.1 标准文件描述符 1 STDIN &#xff08;0&#xff09; 2 STDOUT &#xff08;1&#xff09; 3 STDERR&#xff08;2&#xff09; 6.1.2 重定向错误 1 只重定向错误 2 重定向错误和数据 6.2 在脚本中重定向输出 6.2.1 临时重定向 6.2.2 永…

腾讯云全新云服务器实例S8/M8正式上线,性能提升高达115%!

2024年4月15日&#xff0c;腾讯云正式上线第八代云服务器标准型实例 S8和内存型实例M8。基于自研服务器的高密设计与硬件升级&#xff0c;搭载第五代英特尔至强可扩展处理器的腾讯云实例S8/M8&#xff0c;计算性能大幅提升&#xff0c;对比腾讯云云服务器上代实例&#xff0c;整…

Ubuntu 22.04安装中文输入法

1. 安装 sudo apt install fcitx5 2. 管理已安装的语言 Setting->Region & Language->Manage Installed Language 在下图中点击“安装”&#xff0c;之后需要等一会 选择Fcitx 5 3. 添加输入法 Setting->Keyboard 点击chinese 选择你想要的输入法 重启一下&a…

React + 项目(从基础到实战) -- 第七期

使用ant design 表单组件,开发登录,注册,搜索功能 React 表单组件 ,受控组件 案列 使用defaultVlue属性 bug : 改变了数据源,但是页面未重新渲染 {/* 表单组件 */}<button onClick{()>{console.log(text);}}>打印</button><button onClick{()>[setText(&…

【网络编程】Linux网络内核结构以及分布剖析

hello &#xff01;大家好呀&#xff01; 欢迎大家来到我的网络编程系列之Linux网络内核结构以及分布剖析&#xff0c;在这篇文章中&#xff0c;你将会学习到在Linux内核中如何实现网络数据的输入和输出的&#xff0c;并且我会给出源码进行剖析&#xff0c;以及手绘UML图来帮助…

《TinyLlama: An Open-Source Small Language Model》全文翻译

【Title】 TinyLlama&#xff1a;开源小语言模型 【Abstract】 我们推出了 TinyLlama&#xff0c;这是一个紧凑的 1.1B 语言模型&#xff0c;在大约 1 万亿个令牌上进行了大约 3 个时期的预训练。 TinyLlama 基于 Llama 2&#xff08;Touvron 等人&#xff0c;2023b&#xff…

【Python】#3 基本程序控制

文章目录 一、分支结构if语句&#xff08;Python没有switch&#xff09;tips:紧凑形式&#xff1a;适用于简单表达式的二分支结构 二、循环结构1. for语句range函数 2. while语句3. 循环保留字&#xff1a;break/continue与带else的循环语句 一、分支结构if语句&#xff08;Pyt…

关于伴行天使车载监护器的技术路线

为了判断分析并反馈孩童是否昏睡状态&#xff0c;以预防因分心后排而导致的交通事故&#xff0c;本团队根据基于回归树对齐算法中获取的数据&#xff0c;建立了疲劳度评分机制。 本评分机制采用人脸关键点智能标注模型检测人脸&#xff0c;通过人脸识别68特征点检测、分别获取…

16.读取指定路径下的txt文档然后合并内容为一个txt文档。

1.题目要求 分别读取路径为 ./middle/phone/base/1_student_0.txt, ./middle/vr/base/1_teacher.txt, ./nearby/phone/base/1_student_0.txt, ./nearby/vr/base/1_teacher.txt, ./outside/phone/base/1_student_0.txt, ./outside/vr/base/1_teacher.txt 里面的文件&#xff…

【MATLAB源码-第43期】基于matlab的turbo码误码率仿真比较不同迭代次数,采用logmap/sova算法。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 Turbo码是一种前向纠错码 (Forward Error Correction, FEC)&#xff0c;在 1993 年由法国的两位研究员 Claude Berrou 和 Alain Glavieux 提出。这种编码技术以其接近 Shannon 极限的高性能而受到广泛关注。以下是关于 Turbo…

【word】文档标题如何自动编号

我在写一个word文档的时候&#xff0c;每一级标题的格式都设置好了&#xff0c;包括字体&#xff0c;大小等等&#xff0c;但是如何自动编号呢&#xff1f; 在写中期报告的时候&#xff0c;我对每一级标题的格式都创建了一个单独的样式&#xff0c;像这样&#xff1a; 对于每一…

Linux——信号量与基于环形队列的生产者消费者模型

目录 前言 一、信号量 二、信号量的接口 1.初始化 2.销毁 3.申请信号量 4. 释放信号量 三、基于环形队列的生产者消费者模型 1.环形队列的理解 2.生产者消费者的设计 3.单消费者单生产者环形队列的实现 4.多消费者多生产者环形队列的实现 前言 之前&#xff0c;…

AI的说服力如人类?Anthropic最新研究揭秘机器的辩论能力|TodayAI

人们常常对人工智能模型在对话中的说服力表现持怀疑态度。长久以来&#xff0c;社会上一直存在一个疑问&#xff1a;人工智能是否会达到人类那样&#xff0c;在对话中具有改变他人想法的能力&#xff1f; 直到最近&#xff0c;这一领域的实证研究相对有限&#xff0c;对于人工…