JDBC基础

目录

一、JDBC概述

二、JDBC搭建

1.注册JDBC驱动程序

2.建立与数据库连接

3.获得Satement执行sql语句

4.关闭与数据库的链接通道

三、PreparedStatement和Statement

1、代码的可读性和可维护性

2、最重要的一点是极大地提高了安全性

四、结果集处理


一、JDBC概述

JDBC(Java DataBase Connectivity)java数据库连接

是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问, 它由一组用Java语言编写的类和接口组成。

有了JDBC,java开发人员只需要编写一次程序,就可以访问不同的数据库.

JavaAPI中提供了操作数据库的标准接口 , 最终由不同的数据库开发商实现这些标准接口来对数据库操作

.  

Java定义者制定了JDBC规范

数据库开发商实现接口                     

程序员学习使用标准规范

二、JDBC搭建

JDBC API:供程序员调用的接口与类,集成在java.sql包中

        DriverManager类作用:管理各种不同的JDBC驱动

        Connection 接口 与特定数据库的连接

        Statement 接口 执行sql

        PreparedStatement接口 执行sql

        ResultSet接口 接收查询结果

1.注册JDBC驱动程序

这需要初始化驱动程序,这样就可以打开与数据库的通信信道。

Class.forName(“com.mysql.cj.jdbc.Driver”); //反射实现

或者

DriverManager.registerDriver(new Driver());//手动注册

2.建立与数据库连接

这需要使用DriverManager.getConnection()方法来创建一个Connection对象,它代表一个物理连接的数据库.

Connection conn = DriverManager.getConnection(URL,USER,PASS);

URL:jdbc:mysql://ip(127.0.0.1):端口(3306)/数据库名?serverTimezone=Asia/Shanghai

USER:用户名(root)

PASS:密码

在getConnection方法中url参数是一个字符串,一般格式:

jdbc:subprotocol:subname

jdbc: 表示使用JDBC协议

subprotocol:指定所使用的数据库类型的子协议(例如,mysql,sqlserver,oracle等)。

subname:包含连接数据库所需的其他信息,如主机名、端口号和数据库名称等。

在URL中,还可以添加其他参数,例如用户名、密码、字符集等,通常使用?符号引入查询字符串。例如:

String url="jdbc:mysql://localhost:3306/mydatabase?useSSL=false&serverTimezone=UTC";

以注册和建立连接的示例代码:

package com.jdbcpro;import com.mysql.cj.jdbc.Driver;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;public class Demo1 {public static void main(String[] args) throws ClassNotFoundException, SQLException {//2.注册驱动//Class.forName("com.mysql.cj.jdbc.Driver");//反射方式加载驱动类DriverManager.registerDriver(new Driver());//3.建立与数据库的连接String url = "jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";String user = "root";String password = "root";//写自己数据库的密码Connection connection =  DriverManager.getConnection(url,user,password); //com.mysql.cj.jdbc.ConnectionImpl@25359ed8System.out.println(connection);

3.获得Satement执行sql语句

Statement st = connection.createStatement();

Satement中的方法:

Int executeUpdate(String sql) 用于执行ddl语句和dml(增,删,改)语句 返回

操作的行数

用于执行ddl语句返回0

用于执行dml语句返回操作的行数

ResultSet executeQuery(String sql); 用于执行查询语句返回一个ResultSet 集合

获得PrepareStatement执行sql语句

在sql语句中参数位置使用占位符,使用setXX方法向sql中设置参数

PrepareStatement ps = connection.prepareStatement(sql);

PrepareStatement中的方法:

Int executeUpdate() 用于执行ddl语句和dml(增,删,改)语句 返回操作的行数

用于执行ddl语句返回0

用于执行dml语句返回操作的行数

ResultSet executeQuery(); 用于执行查询语句 返回一个ResultSet 集合

4.关闭与数据库的链接通道

每次操作完成后关闭所有与数据库交互的通道

st.close();

rs.close();

conn.close();

ps.close();

示例(用statement在student表中执行sql语句完成进行DML操作):

package com.jdbcpro;import com.mysql.cj.jdbc.Driver;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;public class Demo2 {public static void main(String[] args) throws SQLException {Demo2.insert("徐卉","女","2003-3-4","1533555",1.65);Demo2.update(4,"林欣","女","2003-3-4","15333333",1.65);Demo2.delete(7);}public static void insert(String name,String gender,String birthday,String phone,double height) throws SQLException {//注册JDBC驱动程序DriverManager.registerDriver(new Driver());//建立与数据库的连接String url = "jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";String user = "root";String password = "root";Connection connection = DriverManager.getConnection(url,user,password);System.out.println(connection);//用statement执行sql语句Statement statement = connection.createStatement();statement.executeUpdate("insert into student(name,gender,birthday,phone,height)values ('"+name+"','"+gender+"','"+birthday+"','"+phone+"','"+height+"')");//关闭与数据库的连接statement.close();connection.close();};public static void update(int number,String name,String gender,String birthday,String phone,double height) throws SQLException {//注册JDBC驱动程序DriverManager.registerDriver(new Driver());//建立与数据库的连接String url = "jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";String user = "root";String password = "root";Connection connection = DriverManager.getConnection(url,user,password);System.out.println(connection);//用statement执行sql语句Statement statement = connection.createStatement();statement.executeUpdate("update student set name='"+name+"',gender='"+gender+"',birthday='"+birthday+"',phone='"+phone+"',height="+height+" where number="+number);//关闭与数据库的连接statement.close();connection.close();};public static void delete(int number) throws SQLException {//注册JDBC驱动程序DriverManager.registerDriver(new Driver());//建立与数据库的连接String url = "jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";String user = "root";String password = "root";Connection connection = DriverManager.getConnection(url,user,password);System.out.println(connection);//用statement执行sql语句Statement statement = connection.createStatement();statement.executeUpdate("delete from student where number = "+number);//关闭与数据库的连接statement.close();connection.close();};
}

三、PreparedStatement和Statement

用prepared statement执行sql语句:

package com.jdbcpro;import com.mysql.cj.jdbc.Driver;import java.sql.*;public class Demo3 {public static void main(String[] args) throws ClassNotFoundException, SQLException {//2.注册驱动//Class.forName("com.mysql.cj.jdbc.Driver");//反射方式加载驱动类DriverManager.registerDriver(new Driver());//3.建立与数据库的连接String url = "jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";String user = "root";String password = "root";//写自己数据库的密码Connection connection =  DriverManager.getConnection(url,user,password); //com.mysql.cj.jdbc.ConnectionImpl@25359ed8//4.发送sqlPreparedStatement ps =  connection.prepareStatement("insert into major(name)value(?)"); //?占位符 表示要插入一个参数ps.setObject(1,"智能"); //1箱第一个占位符的位置插入数据ps.executeUpdate();//5.关闭与数据库的连接connection.close();}
}

然而这不是最主要的区别

而是基于以下的原因:

1、代码的可读性和可维护性

虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读性还是可维护性上来说.都比直接用Statement的代码高很多档次:

//statement

stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values

('"+var1+"' , '"+var2+"' , "+var3+" , '"+var4+"')");

//prepared statement

perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4)values (?,?,?,?)");

perstmt.setString(1,var1);//向sql中传参  向占位符传参时,进行验证防止sql注入攻击更安全

perstmt.setString(2,var2);

perstmt.setString(3,var3);

perstmt.setString(4,var4);

perstmt.executeUpdate(); //执行sql

2、最重要的一点是极大地提高了安全性

防止sql注入

String sql= “ delete from user where id = ”+num;

如果我们把[or 1=1]作为id传入进来?

delete from tb_name where id = 1 or 1 = 1;

因为‘1’ = ‘1’肯定成立

而如果你使用预编译语句.你传入的任何内容就不会和原来的语句发生任何匹配的关系.

预编译模式中每个占位符处,只能插入一个值,而会过滤其他语句.

下面是用prepared statement对student表执行sql语句示例:

package com.jdbcpro;import com.mysql.cj.jdbc.Driver;import java.sql.*;public class Demo4 {public static void main(String[] args) throws SQLException {//Demo4.insert("徐卉","女","2003-3-4","1533555",1.65);//  Demo4.update(4,"林欣11","女","2003-3-4","153333322",1.65);Demo4.delete("0 or 1=1");}public static void insert(String name,String gender,String birthday,String phone,double height) throws SQLException {//注册驱动DriverManager.registerDriver(new Driver());String url = "jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";String user = "root";String password = "root";//写自己数据库的密码//建立与数据库的连接Connection connection = DriverManager.getConnection(url,user,password);//发送sqlPreparedStatement ps = connection.prepareStatement("insert into student(name,gender,birthday,phone,height)value(?,?,?,?,?)");ps.setObject(1,name);ps.setObject(2,gender);ps.setObject(3,birthday);ps.setObject(4,phone);ps.setObject(5,height);ps.executeUpdate();//关闭与数据库的连接ps.close();connection.close();}public static void update(int number,String name,String gender,String birthday,String phone,double height) throws SQLException {//注册驱动DriverManager.registerDriver(new Driver());String url = "jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";String user = "root";String password = "root";//写自己数据库的密码//建立与数据库的连接Connection connection = DriverManager.getConnection(url,user,password);//发送sqlPreparedStatement ps = connection.prepareStatement("update student set name=?,gender=?,birthday=?,phone=?height=? where number = ?");ps.setObject(1,name);ps.setObject(2,gender);ps.setObject(3,birthday);ps.setObject(4,phone);ps.setObject(5,height);ps.setObject(6,number);ps.executeUpdate();//关闭与数据库的连接ps.close();connection.close();}public static void delete(String number) throws SQLException {//注册驱动DriverManager.registerDriver(new Driver());String url = "jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";String user = "root";String password = "root";//写自己数据库的密码//建立与数据库的连接Connection connection = DriverManager.getConnection(url,user,password);//发送sqlPreparedStatement ps = connection.prepareStatement("delete from student where number = ?");//封装sqlps.setObject(1,number);//向sql中传参 向占位符传参时,进行验证,防止sql注入攻击 更安全ps.executeUpdate();//执行sql//关闭与数据库的连接ps.close();connection.close();}
}

四、结果集处理

PreparedStatement和Statement中的executeQuery()方法中会返回一个ResultSet对象,查询结果就封装在此对象中.

使用ResultSet中的next()方法获得下一行数据

使用getXXX(String name)方法获得值

示例:完成了数据库中根据学号查找单个学生信息的功能,并把信息封装在Student对象中。

//学生类:
package com.jdbcpro;import java.util.Date;public class Student {private int number;private String name;private String gender;private Date birthday;private double height;private String phone;private Date regTime;public int getNumber() {return number;}public void setNumber(int number) {this.number = number;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public double getHeight() {return height;}public void setHeight(double height) {this.height = height;}public Date getRegTime() {return regTime;}public void setRegTime(Date regTime) {this.regTime = regTime;}@Overridepublic String toString() {return "Student{" +"number=" + number +", name='" + name + '\'' +", gender='" + gender + '\'' +", birthday=" + birthday +", phone='" + phone + '\'' +", height=" + height +", regTime=" + regTime +'}';}
}//实现了查询学生信息:
package com.jdbcpro;import com.mysql.cj.jdbc.Driver;import java.sql.*;public class Demo5 {public static void main(String[] args) throws SQLException {Student student = findStudentByNumber(1);System.out.println(student);}public static Student findStudentByNumber(int number) throws SQLException {//注册JDBC驱动程序DriverManager.registerDriver(new Driver());;//建立连接String url = "jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";String user = "root";String password = "root";Connection connection = DriverManager.getConnection(url, user, password);//用PreparedStatement执行sql语句PreparedStatement ps = connection.prepareStatement("select number,name,gender,birthday,height,phone,reg_time from student where number = ?");ps.setObject(1, number);//执行查询后,将mysql数据封装到ResultSet对象中ResultSet rs = ps.executeQuery();//com.mysql.cj.jdbc.result.ResultSetImpl@4f9a3314//将ResultSet中的数据重新包装到我们自己的对象中,使用起来更方便Student student = null;if(rs.next()) {//结果集中有没有数据,如果有返回true,没有返回falsestudent = new Student();student.setNumber(rs.getInt("number"));student.setName(rs.getString("name"));student.setGender(rs.getString("gender"));student.setBirthday(rs.getDate("birthday"));student.setHeight(rs.getDouble("height"));student.setPhone(rs.getString("phone"));student.setRegTime(rs.getTimestamp("reg_time"));}rs.close();ps.close();connection.close();return student;}
}

结果:

查询多个学生的示例:

package com.jdbcpro;import com.mysql.cj.jdbc.Driver;import java.sql.*;
import java.util.ArrayList;public class Demo5 {public static void main(String[] args) throws SQLException {ArrayList<Student>students = findStudents();System.out.println(students);}public static ArrayList<Student> findStudents() throws SQLException {//注册JDBC驱动程序DriverManager.registerDriver(new Driver());;//建立连接String url = "jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";String user = "root";String password = "root";Connection connection = DriverManager.getConnection(url, user, password);//用PreparedStatement执行sql语句PreparedStatement ps = connection.prepareStatement("select number,name,gender,birthday,height,phone,reg_time from student ");//执行查询后,将mysql数据封装到ResultSet对象中ResultSet rs = ps.executeQuery();//com.mysql.cj.jdbc.result.ResultSetImpl@4f9a3314//将ResultSet中的数据重新包装到我们自己的对象中,使用起来更方便//创建一个集合对象,用来封装多个学生对象ArrayList<Student> students = new ArrayList<>();while(rs.next()) {//结果集中有没有数据,如果有返回true,没有返回falseStudent student = new Student();student.setNumber(rs.getInt("number"));student.setName(rs.getString("name"));student.setGender(rs.getString("gender"));student.setBirthday(rs.getDate("birthday"));student.setHeight(rs.getDouble("height"));student.setPhone(rs.getString("phone"));student.setRegTime(rs.getTimestamp("reg_time"));students.add(student);//把当前学生对象添加到集合中}rs.close();ps.close();connection.close();return students;}
}

结果:

 

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

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

相关文章

c语言指针2

文章目录 一、void * 指针二、const关键字1.const修饰变量2.const修饰指针变量2. 1 const放在*的右边2. 2 const放在*的左边2. 3 总结 三、指针的运算3. 1指针的加减运算3. 2 指针 - 指针3. 3 指针的关系运算 四、野指针4. 1 什么叫野指针&#xff1f;4. 1 野指针的成因4.1.1 指…

Poetry入门教程

以前使用模块管理和虚拟环境为pip和Virtualenv组合&#xff0c;随着Rasa、Dify等开源项目逐步使用Poetry模块管理&#xff0c;也开始尝试使用Poetry。本文简要介绍Poetry入门操作。 1.Poetry安装 可参考Poetry官网[1]推荐的安装方式&#xff1a; 通过Windows的Powershell如下…

C++编程: 使用 Nanomsg 进行 PUB-SUB 模式基准测试

文章目录 0. 引言1. Nanomsg简介1.1 可扩展性协议类型1.2 支持的传输机制1.3 NanoMsg 架构与实现 2. PUB-SUB 模式基准测试 0. 引言 Nanomsg 作为一款高性能的通信库&#xff0c;支持多种消息传递模式&#xff0c;其中包括 PUB-SUB&#xff08;发布-订阅&#xff09;。 本篇文…

yolov8环境安装

一、Miniconda Conda 是一个开源的包管理和环境管理系统&#xff0c;它能运行、安装和更新各种包和依赖&#xff0c;同时还能创建隔离的环境。 1.1 下载安装 Miniconda https://repo.anaconda.com/miniconda/Miniconda3-py39_24.5.0-0-Windows-x86_64.exe1.2 打开 Anaconda …

向量数据库(一)

写在前面 最近在学习一些 AI 相关的开发&#xff0c;了解了一些未接触过的东西&#xff0c;其中有一部分是向量数据库&#xff0c;想开一个专题&#xff0c;对相关的内容做一下整理。 内容 什么是向量数据库 一般在我们的日常开发中&#xff0c;使用的数据库存储主要有两种…

Matlab进阶绘图第65期—带分组折线段的柱状图

带分组折线段的柱状图是在原始柱状图的基础上&#xff0c;在每组柱状图位置处分别添加折线段&#xff0c;以进行对比或添加额外信息。 由于Matlab中未收录带分组折线段的柱状图的绘制函数&#xff0c;因此需要大家自行设法解决。 本文使用自制的BarwithGroupedLine小工具进行…

大模型算法面试题(十四)

本系列收纳各种大模型面试题及答案。 1、微调后的模型出现能力劣化&#xff0c;灾难性遗忘是怎么回事 微调后的模型出现能力劣化&#xff0c;灾难性遗忘&#xff08;Catastrophic Forgetting&#xff09;是一个在机器学习领域&#xff0c;尤其是在深度学习和大模型应用中频繁出…

数据库(MySQL)-DQL数据查询语言

DQL(Data Query Language 数据查询语言)的用途是查询数据库数据&#xff0c;如select语句。其中&#xff0c;可以根据表的结构和关系分为单表查询和多表联查。 单表查询 单表查询&#xff1a;针对数据库中的一张数据表进行查询 全字段查询 语法&#xff1a;select 字段名 fro…

报警系统与机房动力环境监控系统的集成及报警功能实施

在当今的运维行业中&#xff0c;确保关键基础设施的安全与稳定运行面临着诸多挑战&#xff0c;如设备故障、环境异常、非法入侵等。为了有效应对这些挑战&#xff0c;报警系统与机房动力环境监控系统的集成变得至关重要。本文旨在为运维团队提供关于报警系统与机房动力环境监控…

使用frrouting、gns3、pim实现ipv6组播(三)

翻遍整个网络都没有找到用ipv6进行组播推流的实例。 朋友说&#xff1a;A true strong person never complains about the environment 那么&#xff0c;就由我来创造一个吧~ 此文涉及到的所有软件均为开源软件&#xff0c;进行深入学习与其他平台移植时十分便利。 记得点赞额…

如何在GPU服务器上安装Stable Diffusion webUI

一、前提条件 1、硬件条件 GPU&#xff1a;12G&#xff0c;建议16G以上&#xff0c;还是尽量勾搭&#xff0c;好像现在最大32G&#xff0c;目前个人性价比24G有时长出售。 内存&#xff1a;16G以上&#xff0c;建议32G&#xff0c;也是越大越好。 硬盘&#xff1a;最好使用…

2024年【金属非金属矿山(地下矿山)安全管理人员】考试报名及金属非金属矿山(地下矿山)安全管理人员模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年金属非金属矿山&#xff08;地下矿山&#xff09;安全管理人员考试报名为正在备考金属非金属矿山&#xff08;地下矿山&#xff09;安全管理人员操作证的学员准备的理论考试专题&#xff0c;每个月更新的金属非…

抖音矩阵管理系统功能说明:一站式掌握

在当下这个信息爆炸的时代&#xff0c;抖音作为短视频领域的佼佼者&#xff0c;其用户规模持续扩大&#xff0c;影响力日益增强。对于内容创作者和营销人员来说&#xff0c;如何高效管理抖音账号&#xff0c;实现内容的多平台分发和精准触达&#xff0c;成为了亟待解决的问题。…

Redis常用指令(不定期更新)

Redis常用指令&#xff08;不定期更新&#xff09; 查询指定前缀key的数量查看键空间事件开启键空间通知 查询指定前缀key的数量 查询【TEST前缀】的key数量 EVAL "return #redis.call(keys,TEST:*)" 0返回信息 查看键空间事件 config get notify-keyspace-even…

Navicat Charts Creator for Mac:数据可视化利器

Navicat Charts Creator for Mac是一款专为Mac用户设计的数据可视化工具&#xff0c;它将复杂的数据转化为直观、易懂的图表&#xff0c;帮助用户更好地理解和分析数据。 该软件支持连接到多种数据库&#xff0c;如MySQL、MariaDB、PostgreSQL等&#xff0c;轻松获取实时数据&…

【QGroundControl二次开发】七.QGC自定义MAVLink消息MavLink通信协议 C++应用

1. 接收解析源码分析 通过接收串口或UDP发来的的字节流buffer&#xff0c;长度lengthbuffer.size()&#xff0c;通过下列脚本解析&#xff0c;每解析出一个mavlink数据包就执行onMavLinkMessage函数 for(int i 0 ; i < length ; i){msgReceived mavlink_parse_char(MAVL…

VS2022下安装和配置OpenCV环境参数+QT开发环境搭建

1.工具准备 VS2022,OpenCV4.5.5版本&#xff0c;QT5.12.12 VisualStudio最新版直接官网下载&#xff0c;根据需要进行下载&#xff0c;我下载的免费社区版本。日常开发完全够用。 qt官网下载5.12版本。 OpenCVReleases - OpenCV 选择Windows版本下载并解压到本地磁盘&#xff0…

在Spring项目中使用Maven和BCrypt来实现修改密码功能

简介 在数字时代&#xff0c;信息安全的重要性不言而喻&#xff0c;尤其当涉及到个人隐私和账户安全时。每天&#xff0c;无数的用户登录各种在线服务&#xff0c;从社交媒体到银行账户&#xff0c;再到电子邮件和云存储服务。这些服务的背后&#xff0c;是复杂的系统架构&am…

【BUG】已解决:No Python at ‘C:Users…Python Python39python. exe’

No Python at ‘C:Users…Python Python39python. exe’ 目录 No Python at ‘C:Users…Python Python39python. exe’ 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班…

【linux服务器】大语言模型实战教程:LLMS大模型快速部署到个人服务器

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言 说到大语言模型相信大家都不会陌生&#xff0c;大型语言模型(LLMs)是人工智能文本处理的主要类型,也现在最流行的人工智能…