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

news2024/10/6 20:20:17

概述

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 ? "执行成功" : "执行失败")

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

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

相关文章

Linux-文件系统理解(磁盘的物理与逻辑结构、什么是inode、OS如何管理磁盘)

一、磁盘 磁盘的物理结构 磁盘的本质是一个机械设备,可以存储大量的二进制信息,是实现数据存储的基础硬件设施,磁盘的盘片类似于光盘,不过盘片的两面都是可读可写可擦除的,每个盘面都有一个磁头,马达可以使…

keil无法查看外设寄存器(生成SFR文件)

1.前言 自从更新了keil,用的是越来越不顺手了,一会是cannot evaluate,一会是与强制与cubemx强制联系了,这次也是的(地铁,老人,手机)折腾了一下总是搞好了(网上的解法只能…

安卓刷机fastboot分段传输

win10 fastboot 无法识别,驱动下载地址GitHub - xushuan/google_latest_usb_driver_windows 把inf文件更新到设备管理器驱动更新即可 问题 archive does not contain super_empty.img Sending vbmeta_a (4 KB) OKAY [ 0.117s] Writing …

Open CASCADE学习|实现Extrude功能

首先定义了一些基本的几何元素,如线、圆和平面,然后使用makeExtrudebydir函数来对一个面进行挤出操作。下面是详细过程: 定义Extrude函数:makeExtrudebydir函数接受一个TopoDS_Shape对象和一个gp_Vec对象作为参数。TopoDS_Shape是…

【vs2019】window10环境变量设置

【vs2019】window10环境变量设置 【先赞后看养成习惯】求关注点赞收藏😊 安装VS2019时建议默认安装地址,最好不要改动,不然容易出问题 以下是安装完VS2019后环境变量的设置情况,C:\Program Files (x86)\Microsoft Visual Studi…

【Unity添加远程桌面】使用Unity账号远程控制N台电脑

设置地址: URDP终极远程桌面;功能强大,足以让开发人员、设计师、建筑师、工程师等等随时随地完成工作或协助别人https://cloud-desktop.u3dcloud.cn/在网站登录自己的Unity 账号上去 下载安装被控端安装 保持登录 3.代码添加当前主机 "…

初探vercel托管项目

文章目录 第一步、注册与登录第二步、本地部署 在个人网站部署的助手vercel,支持 Github部署,只需简单操作,即可发布,方便快捷! 第一步、注册与登录 进入vercel【官网】,在右上角 login on,可登…

【小迪安全2023】第23天:WEB攻防-Python考点CTF与CMS-SSTI模版注入PYC反编译

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收…

Linux 文件页反向映射

0. 引言 操作系统中与匿名页相对的是文件页,文件页的反向映射对比匿名页的反向映射更为简单。如果还不清楚匿名页反向映射逻辑的,请移步 匿名页反向映射 1. 文件页反向映射数据结构 struct file: 用户进程每open()一次文件,则会生…

微服务相关

1. 微服务主要七个模块 中央管理平台:生产者、消费者注册,服务发现,服务治理,调用关系生产者消费者权限管理流量管理自定义传输协议序列化反序列化 2. 中央管理平台 生产者A在中央管理平台注册后,中央管理平台会给他…

BLIP 算法阅读记录---一个许多多模态大语言模型的基本组件

论文地址:😈 目录 一、环境配置以及数据集准备 数据集准备 数据集格式展示 环境配置,按照官网所述即可 二、一些调整 vit_base的预训练模型 远程debug的设置 Tokenizer初始化失败 读入网络图片的调整 三、训练过程 Image Encoder …

Kylin IPv4 setting config

Kylin IPv4 setting-CSDN博客 上次配置完重启又没了,永久需要修改配置文件 /etc/sysconfig/network-scripts ifcfg-ens33

langchain-chatchat指定一个或多个文件回答,不允许回答内容有其他文件内容,即屏蔽其他文件内容

1.找到langchain-chatchat中的knowledge_base_chat.py 2.knowledge_base_chat.py的api内容加上一个flie_name参数,即传过来你需要指定一个文件名称,或多个文件名称,同时也可以不指定,加上以下代码: flie_name: List …

腾讯云优惠券详细介绍及领券步骤详解

随着云计算技术的不断发展和普及,越来越多的企业和个人开始选择使用云服务来满足自身的需求。腾讯云作为国内领先的云服务提供商,以其稳定、高效、安全的服务赢得了广大用户的信赖。为了回馈广大用户,腾讯云经常推出各种优惠活动,…

linux下安装nacos2.2.0

1、获取下载地址并下载 1.1、打开nacos官网 1.2、找到对应版本,点进去 ## 1.3、复制地址 1.4下载 # 进入要安装的目录,cd /usr/local/src # 执行wget https://github.com/alibaba/nacos/releases/download/2.2.0/nacos-server-2.2.0.tar.gz2、 安装…

深入理解计算机网络分层结构

一、 为什么要分层? 计算机网络分层的主要目的是将复杂的网络通信过程分解为多个相互独立的层次,每个层次负责特定的功能。这样做有以下几个好处: 模块化设计:每个层次都有清晰定义的功能和接口,使得网络系统更易于设…

放弃powershell? 启动 sqlps!免杀| 红队攻防

0x00 前言 sql server 默认安装后,会发现有一个 sqlps.exe: 此文件本身自带微软签名: sqlps的功能,竟然是!启动 powershell??? 而且由于此文件无依赖,因此可以单独取出在…

刷题之Leetcode206题(超级详细)

206.反转链表 力扣题目链接(opens new window)https://leetcode.cn/problems/reverse-linked-list/ 题意:反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 思路 如果再定义一个新的链表&#xff0…

18 进程替换

目录 1.什么是进程替换 2.替换原理 3.替换函数 4.函数解释 5.具体应用 6.makefile构建多个文件 7.运行自己程序 8.运行其他语言程序 9.简易shell 什么是进程替换 fork之后的父子程序共享代码,如果子进程想执行一个全新的程序。就用进程替换来完成这个功能&#x…

python3高级特性

1. 装饰器 装饰器是 Python 的一种高阶函数,它可以在不修改函数内部代码的情况下,给函数增加额外的功能。 案例:记录函数执行时间的装饰器 import time def timing_decorator(func): def wrapper(*args, **kwargs): start_time time.t…