Java_Jdbc

目录

一.JDBC概述

二.JDBC API

三.ResultSet[结果集]

四.Statement 

 五.PreparedStatement

六. JDBC API 总结


一.JDBC概述

  1. JDBC 为访问不同的数据库提供了同一的接口,为使用着屏蔽了细节问题
  2. Java程序员使用JDBC 可以连接任何提供了  JDBC驱动的数据库系统,从而完成对数据库的各种操作
  3. JDKC的原理图
  4. 模拟JDBC  com.hspedy.jdbc.myjdbc

JDBC是java操作提供的一套用于数据库操作的接口API,java程序员只需要面向这套接口编程计科。不同的数据库厂商,需要针对这套接口,提供不同实现。

二.JDBC API

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

 JDBC程序编写步骤

  1. 注册驱动   加载Driver类
  2. 获取连接  得到 connection
  3. 执行增删改查 发送相关的sql命令给mysql执行
  4. 释放资源    关闭相关的连接等

package com.tianedu.jdbc;import com.mysql.jdbc.Driver;import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;/*** @author tian* 这是第一个JDBC程序 完成简单的操作*/
public class Jdbc01 {public static void main(String[] args) throws SQLException {// 前置工作在项目下创建一个文件夹 libs// 将 mysql.jar 拷贝到该目录下,点击 add to project 加入到项目中才可以使用//1.注册驱动Driver driver = new Driver();  // 创建driver 对象//2.得到连接//(1)  jdbc: // 规定好的协议,通过jdbc的方式连接mysql//(2)  localhost 主机,也可以是ip地址//(3) 3306 表示MySQL 监听的端口//(4) hsp_db03 表示连接到呢个数据库// (5) MySQL的连接本质就是前面学习过sql 的连接String url = "jdbc:mysql://localhost:3306/hsp_db03";// 将用户名和密码 放到Properties 对象中Properties properties = new Properties();// 说明: user 和 password 是规定好的,后面的值根据实际情况写properties.setProperty("user","root"); // 用户properties.setProperty("password","tian"); //密码Connection connect = driver.connect(url, properties);//3.执行sql语句//String sql = "insert into actor values(null,'刘德华','男','1970-11-11',110)";// String sql = "update actor set name = '周星驰'where id = 1";String sql = "delete from actor where id = 1";// 下面的statement 用于执行静态的sql 语句并返回其生成的结果的对象Statement statement = connect.createStatement();int rows =  statement.executeUpdate(sql);  // 如果是dml语句,返回的就是影响行数 如果是1 添加成功 如果是0 添加失败System.out.println(rows > 0 ? "成功":"失败");//4.关闭资源statement.close();connect.close();}
}

获取数据库连接5种方式

package com.tianedu.jdbc;import com.mysql.jdbc.Driver;
import org.junit.Test;import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;/*** @author tian* 分析java 连接MySQL的物种方式*/
public class JdbcConn {@Testpublic void connect01() throws SQLException {Driver driver = new Driver();String url = "jdbc:mysql://localhost:3306/hsp_db03";// 将用户名和密码放入到Properties 对象Properties properties = new Properties();properties.setProperty("user", "root");properties.setProperty("password", "tian");Connection connect = driver.connect(url, properties);System.out.println(connect);}//方式2@Testpublic void connect02() throws ClassNotFoundException, InstantiationException, IllegalAccessException, SQLException {//使用反射加载Driver 动态加载,更加灵活,减少依赖性Class<?> aClass = Class.forName("com.mysql.jdbc.Driver");Driver driver = (Driver)aClass.newInstance();String url = "jdbc:mysql://localhost:3306/hsp_db03";// 将用户名和密码放入到Properties 对象Properties properties = new Properties();properties.setProperty("user", "root");properties.setProperty("password", "tian");Connection connect = driver.connect(url, properties);System.out.println("方式2=" + connect);}// 方式3 使用DriverManager 替代 Driver 进行统一管理@Testpublic void connect03() throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException {// 使用反射 加载DriverClass<?> aClass = Class.forName("com.mysql.jdbc.Driver");Driver driver  = (Driver) aClass.newInstance();//创建 url 和 user 和 passwordString url = "jdbc:mysql://localhost:3306/hsp_db03";String user = "root";String password = "tian";DriverManager.registerDriver(driver);  //注册Driver 驱动Connection connection = DriverManager.getConnection(url, user, password);System.out.println("第三种方式" + connection);}// 方式4   使用Class.forName 自动完成注册,简化代码// 使用最多@Testpublic void  connect04() throws ClassNotFoundException, SQLException {// 使用反射加载 Driver 类// 在加载Driver类时,完成注册/*源码: 1.静态代码块,在类加载时,会执行一次2.DriverManager.registerDriver(new Driver());3.因此 加载和注册Driver 的工作已经完成static {try {DriverManager.registerDriver(new Driver());} catch (SQLException var1) {throw new RuntimeException("Can't register driver!");}}*/Class.forName("com.mysql.jdbc.Driver") ;  //如果没有这句也可以执行,建议写上更加明确// MySQL 驱动 5.1.6 可以无需Class.forName("com.mysql.jdbc.Driver");// 从 jdk1.5 以后使用Jdbc4 不在需要显示调用class.forName() 注册驱动而已自动调用驱动// jar包下META-INF\services\java.sql.Driver文本种的类 名称去注册String url = "jdbc:mysql://localhost:3306/hsp_db03";String user = "root";String password = "tian";Connection connection = DriverManager.getConnection(url,user,password);System.out.println("第四种方式" + connection);}@Test// 方式5,在方式4的基础上改进,增加配置文件,让信息连接MySQL更加灵活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 driver = properties.getProperty("driver");String url = properties.getProperty("url");Class.forName(driver); //建议写上 更加明确Connection connection = DriverManager.getConnection(url, user, password);System.out.println("方式5" + connection);}
}

三.ResultSet[结果集]

  1. 表示数据库结果的数据表,通常通过执行查询数据库的语言生成
  2. ResultSet对象保持一个光标指向其当中的数据行,最初,给光标位于第一行之间
  3. next方法将光标移动到下一行,并且由于在ResultSet对象种没有更多行时返回false,因此可以在while 循环中使用循环来遍历结果集
package com.tianedu.jdbc.resultest_;import java.io.FileInputStream;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;/*** @author tian** 演示select 语句返回一个resultset 并取出结果*/
@SuppressWarnings({"all"})
public class ResultSet_ {public static void main(String[] args) 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 driver = properties.getProperty("driver");String url = properties.getProperty("url");Class.forName(driver); //建议写上 更加明确Connection connection = DriverManager.getConnection(url, user, password);//得到StatementStatement statement = connection.createStatement();//组织sql 语句String sql = "select id,name,sex,borndate from actor";//执行给定的sql语句,该语句返回单个 ResultSet对象ResultSet resultSet = statement.executeQuery(sql);// 使用where 循环取出数据while (resultSet.next()) {// 让光标向后移动 如果没有更多的记录则返回falseint 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);// 获取该行的对第一列}// 关闭连接resultSet.close();connection.close();statement.close();}
}

四.Statement 

  1. statement 对象 用于执行静态SQL语句返回生成的结果的对象
  2. 在连接建立后,需要对数据库进行访问,执行命令或是sql 语句,可以通过 Statement【存在sql注入】,PerparedStatement【预处理】,CallableStatement【存储过程】
  3. Statement对象执行sql语句,存在sql 注入风险
  4. sql 注入是利用某些系统没有对用户输入的数据进行充分的检查,而在用户输入数据中注入非法的sql 语句或命令,恶意攻击数据库。sql_injection.sql
  5. 要防范sql注入,只要用PerparedStatement(从Statement 扩展而来)取代Statement 就可以了
package com.tianedu.jdbc.statement_;import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;
import java.util.Scanner;/*** @author tian* 演示statement 的注入问题*/
@SuppressWarnings({"all"})
public class Statement_ {public static void main(String[] args) throws Exception {Scanner scanner = new Scanner(System.in);//让用户输入管理员姓名和密码System.out.print("请输入管理员的名字:");String admin_name = scanner.nextLine(); //next当接受到空格或者 ' 表示结束System.out.print("请输入管理员的密码:");String admin_pwd = scanner.nextLine();// 通过Properties 对象获取配置文件的信息Properties properties = new Properties();properties.load(new FileInputStream("src\\mysql.properties"));// 获取相关的值String user = properties.getProperty("user");String password = properties.getProperty("password");String driver = properties.getProperty("driver");String url = properties.getProperty("url");//1.注册驱动Class.forName(driver);//2.得到连接Connection connection = DriverManager.getConnection(url,user,password);//3.得到StatementStatement statement = connection.createStatement();//4.组织sqlString sql = "select name,pwd from admin where name = '"+admin_name+"' and pwd= '"+admin_pwd+"'" ;ResultSet resultSet = statement.executeQuery(sql);if(resultSet.next()){//如果查询到一条记录,则说明该管理员存在System.out.println("登录成功");} else  {System.out.println("对不起,登录失败");}// 关闭连接resultSet.close();statement.close();connection.close();}}

 五.PreparedStatement

  1. PreparedStatement 执行的sql语句中的参数用问号(?)来表示,调用PerparedStatement 对象的setXxxx() 方法来设置这些参数。setXxx() 方法有两个参数,第一个参数是要设置的sql语句中的索引(从1开始),第二个是设置的sql 语句中的参数值
  2. 调用 executeQuery() 返回ResultSet 对象
  3. 调用 executeUpdate(): 执行更新,包括增,删,修改

 预处理好处

  1. 不在使用 + 拼接sql语句,减少语法错误
  2. 有效的解决了sql注入问题
  3. 大大减少了编译次数,效率较高
package com.tianedu.jdbc.preparedstatement_;import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.Properties;
import java.util.Scanner;/*** @author tian** 演示 preparedStatement使用*/
@SuppressWarnings({"all"})
public class PreparedStatementDML_ {public static void main(String[] args) throws Exception {Scanner scanner = new Scanner(System.in);//让用户输入管理员姓名和密码System.out.print("请输入添加的名字:");String admin_name = scanner.nextLine(); //next当接受到空格或者 ' 表示结束// System.out.print("请输入管理员的密码:");//String admin_pwd = scanner.nextLine();//通过PropertiesProperties properties = new Properties();properties.load(new FileInputStream("src\\mysql.properties"));//获取相关的值String user = properties.getProperty("user");String password = properties.getProperty("password");String driver = properties.getProperty("driver");String url = properties.getProperty("url");// 注册驱动Class.forName(driver);//得到连接Connection connection = DriverManager.getConnection(url,user,password);// 组织sql sql语句的 ? 相当于占位符// 添加一个记录//String sql = "insert into admin values(?,?)";//String sql = "update admin set pwd = ? where name = ?";String sql = "delete from admin where name = ?";//3.2 preparedStatement 对象实现了 preparedStatement 接口的实现类的对象PreparedStatement preparedStatement = connection.prepareStatement(sql);//3.3 给?赋值preparedStatement.setString(1,admin_name);//preparedStatement.setString(1,admin_pwd);//4.执行DML 语句使用 executeUpdateint rows = preparedStatement.executeUpdate();System.out.println(rows > 0 ? "执行成功":"执行失败");//关闭连接preparedStatement.close();connection.close();}
}

六. JDBC API 总结

  • Driver Manager 驱动管理类  getConnection(url,user,pwd) 获取连接
  • Connection 接口  creatStatement 创建Statement 对象(使用较少,存在注入问题)                 preparedStatement(sql) 生成一个预处理对象
  • Statement 接口   executeUpdate(sql) 执行dml语句 返回影响得到行数                                       executeQuery(sql) 执行查询,返回ResultSet对象                                                                      execute(sql) 执行任意的sql 返回的是布尔值
    • PreparedStatement 接口  excuteUpdate() 执行Dml语句                                                    excuteQuery() 执行查询   返回ResultSet                                                                    excute() 执行任意的sql 返回一个布尔值                                                                              setXxx(站位符索引,占位符的值) 可以解决sql 注入                                                        setObject(站位符的索引,站位符的值)                                                                                  ResultSet(结果集)  next() 方法向下移动一行     同时如果没有下一行,返回false              previous() 向上移动一行                                                                                                      getXX(列的索引 | 列名)         返回对应类的值 接受类型是Xxx                                            getObject(列的索引 | 列名)  返回对应列的值,接受类型为object                                       

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

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

相关文章

Linux考试复习整理

文章目录 Linux考试整理一.选择题1.用户的密码现象放置在哪个文件夹&#xff1f;2.删除文件或目录的命令是&#xff1f;3.显示一个文件最后几行的命令是&#xff1f;4.删除一个用户并同时删除用户的主目录5.Linux配置文件一般放在什么目录&#xff1f;6.某文件的组外成员的权限…

双指针——复写零

一&#xff0c;题目要求 给你一个长度固定的整数数组 arr &#xff0c;请你将该数组中出现的每个零都复写一遍&#xff0c;并将其余的元素向右平移。 注意&#xff1a;请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改&#xff0c;不要从函数返回任何东…

Python Connect SQLServer 2008

Macos&#xff08;经过了两天&#xff0c;无数次的方法验证&#xff0c;寻找各种资料&#xff0c;总结如下&#xff09; brew install freetds0.91 如果出现错误就进行手工安装&#xff0c;也可以直接使用 brew install freetds安装最新版本&#xff08;测试通过&#xff09; …

Kerberos认证协议介绍

概述 官网&#xff1a;https://www.kerberos.org/ 官方文档&#xff1a;http://web.mit.edu/kerberos/krb5-current/doc/ 为TCP/IP网络系统设计的可信的第三方身份认证协议。网络上的Keberos服务基于DES对称加密算法&#xff0c;但也可以用其他算法替代。因此&#xff0c;Keb…

CSS 基础知识-01

CSS 基础知识 1.CSS概述2. CSS引入方式3. 选择器4.文字控制属性5. 复合选择器6. CSS 特性7.背景属性8.显示模式9.选择器10.盒子模型 1.CSS概述 2. CSS引入方式 3. 选择器 4.文字控制属性 5. 复合选择器 6. CSS 特性 7.背景属性 8.显示模式 9.选择器 <!DOCTYPE html> <…

(※)力扣刷题-栈和队列-用栈实现队列

使用栈实现队列的下列操作&#xff1a; push(x) – 将一个元素放入队列的尾部。pop() – 从队列首部移除元素。peek() – 返回队列首部的元素。empty() – 返回队列是否为空。 说明: 你只能使用标准的栈操作 – 也就是只有 push to top, peek/pop from top, size, 和 is empt…

【Java基础面试三十一】、String a = “abc“; ,说一下这个过程会创建什么,放在哪里?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;String a “abc”; &am…

Java集合类

Java集合类 集合类 集合类其实就是为了更好地组织、管理和操作我们的数据而存在的&#xff0c;包括列表、集合、队列、映射等数据结构。 集合根接口 Java中已经帮我们将常用的集合类型都实现好了&#xff0c;我们只需要直接拿来用就行了 所有的集合类最终都是实现自集合根…

【Javascript保姆级教程】运算符

文章目录 前言一、运算符是什么二、赋值运算符2.1 如何使用赋值运算符2.2 示例代码12.3 示例代码2 三、自增运算符3.1 运算符3.2 示例代码13.3 示例代码2 四、比较运算符4.1 常见的运算符4.2 如何使用4.3 示例代码14.4 示例代码2 五、逻辑运算符逻辑运算符列举 六、运算符优先级…

数据预处理—滑动窗口采样数据

一个简单的例子&#xff1a; # data: 这是要应用滑动窗口采样的输入数据&#xff0c;通常是一个序列&#xff0c;例如列表或NumPy数组。 # window_size: 这是滑动窗口的大小&#xff0c;表示每个窗口中包含的元素数量。 # step_size: 这是滑动窗口移动的步长&#xff0c;表示每…

变化检测数据集制作详细版

本文记录在进行变化检测数据集制作过程中所使用的代码 首先需要准备相同地区不同时间的两幅影像&#xff0c;裁减成合适大小&#xff0c;如256*256。相同区域命名相同放在两个文件夹下。 接着使用labelme对变化区域进行标注&#xff0c;这里不再进行labelme安装及标注的赘述。…

支持语音与视频即时通讯项目杂记(一)

第一部分解释服务端的实现。 &#xff08;服务端结构&#xff09; 下面一个用于实现TCP服务器的代码&#xff0c;包括消息服务器&#xff08;TcpMsgServer&#xff09;和文件中转服务器&#xff08;TcpFileServer&#xff09;。 首先&#xff0c;TcpServer是TcpMsgServer和Tcp…

语音识别whisper的介绍、安装、错误记录

介绍 Whisper是OpenAI于2022年9月份开源的通用的语音识别模型。它是在各种音频的大型数据集上训练的模型&#xff0c;也是一个可以执行多语言语音识别、语音翻译和语言识别的多任务模型。 论文链接&#xff1a;https://arxiv.org/abs/2212.04356 github链接&#xff1a;https:…

手部关键点检测4:Android实现手部关键点检测(手部姿势估计)含源码 可实时检测

目录 1. 前言 2.手部关键点检测(手部姿势估计)方法 (1)Top-Down(自上而下)方法 (2)Bottom-Up(自下而上)方法&#xff1a; 3.手部关键点检测模型训练 4.手部关键点检测模型Android部署 &#xff08;1&#xff09; 将Pytorch模型转换ONNX模型 &#xff08;2&#xff09; …

日常中msvcp71.dll丢失怎样修复?分享5个修复方法

在 Windows 系统中&#xff0c;msvcp71.dll 是一个非常重要的动态链接库文件&#xff0c;它承载了许多应用程序和游戏的运行。如果您的系统中丢失了这个文件&#xff0c;那么您可能会遇到无法打开程序、程序崩溃或出现错误提示等问题。本文将介绍 5 个快速修复 msvcp71.dll 丢失…

Linux —— 网络基础(一)

目录 一&#xff0c;计算机网络背景 二&#xff0c;网络协议初识 三&#xff0c;网络传输基本流程 四&#xff0c;网络中的地址管理 一&#xff0c;计算机网络背景 网络发展 独立模式&#xff0c;计算机之间相互独立&#xff1b;网络互联&#xff0c;多台计算机连接在一起…

新手如何找到Docker容器(redis)中的持久化文件?

具体步骤 要查看Docker容器的dump.rdb和appendonly.aof文件&#xff08;如果启用了AOF持久化&#xff09;的位置&#xff0c;我们需要知道容器中Redis配置文件的内容或者容器的数据卷的挂载位置。 这里是一般步骤&#xff1a; 查找容器的数据卷挂载位置 使用docker inspect命令…

无人机UAV目标检测与跟踪(代码+数据)

前言 近年来&#xff0c;随着无人机的自主性、灵活性和广泛的应用领域&#xff0c;它们在广泛的消费通讯和网络领域迅速发展。无人机应用提供了可能的民用和公共领域应用&#xff0c;其中可以使用单个或多个无人机。与此同时&#xff0c;我们也需要意识到无人机侵入对空域安全…

最新视频/图集去水印小程序源码/步数小程序源码/王者战力小程序源码/红包封面小程序源码

自带多平台解析接口 短视频去水印图集水印小程序源码 &#xff0c;这是一款支持多种平台去水印的一款微信小程序源码 支持短视频去水印&#xff0c;还有图集去水印等。内含多平台去水印接口&#xff0c;响应的速度也是非常的快&#xff0c;这是一款非常值得推荐的一款小程序源…

云表|低代码开发崛起:重新定义企业级应用开发

低代码开发这个概念在近年来越来越受到人们的关注&#xff0c;市场对于低代码的需求也日益增长。据Gartner预测&#xff0c;到2025年&#xff0c;75&#xff05;的大型企业将使用至少四种低代码/无代码开发工具&#xff0c;用于IT应用开发和公民开发计划。 那么&#xff0c;为什…