JDBC操作

2023-11-16

目录

一、实现JDBC步骤

1.注册驱动

 1.1导入驱动包

1.1异常处理

2.创建连接

2.1导包

2.2处理异常

3.得到执行sql语句的Statement对象

3.1修改数据操作

 3.2删除数据操作

3.3插入数据操作

3.4查询数据操作 

4.执行sql语句,并返回结果,并处理结果

5.关闭资源

6.完整代码

6.1修改数据操作代码

6.2查询数据操作代码

二、JDBC封装函数

1.建立两个类(工具类、测试类)

2.全局变量声明

3.初始化数据库链接函数

4.修改数据函数

5.查询数据函数

6.关闭资源函数

7.测试代码

7.1修改数据测试代码

7.2查询数据测试代码


一、实现JDBC步骤

1.注册驱动

 1.1导入驱动包

1.1异常处理

更正一下是 Class.forName("com.mysql.jdbc.Driver"),上面代码写错了。 

//注册驱动(加载驱动类,5.0版本)
try {
    Class.forName("com.mysql.jdbc.Driver");
	System.out.println("加载驱动成功");
} catch (ClassNotFoundException e) {
    // TODO Auto-generated catch block
	System.out.println("加载驱动失败");
	e.printStackTrace();
}

2.创建连接

2.1导包

2.2处理异常

//创建数据库连接
String url = "jdbc:mysql://127.0.0.1:3306/score";
//jdbc:mysql: //数据库主机地址:端口号/数据库名
String user="root"; //数据库用户名
String password="268875"; //数据库密码
Connection connection = DriverManager.getConnection(url,user,password);			
System.out.println("获取数据库连接成功");

3.得到执行sql语句的Statement对象

3.1修改数据操作

//修改数据操作
String sql = "update student SET Sage=? where Sid=?";
PreparedStatement pre = connection.prepareStatement(sql);
//prepareStatement--预编译SQL语句执行对象
//把数据设置到占位符位置
pre.setInt(1, 39);
//向sql语句中第一个位置设置数据
pre.setString(2,"100010");
//向sql语句中第二个位置设置数据

 3.2删除数据操作

//删除数据操作
String sql="delete from student where Sid=?";
pre = connection.prepareStatement(sql);
pre.setString(1, "100020");

3.3插入数据操作

//插入数据操作
String sql="insert into student values(?,?,?,?,?)";
//问号为占位符,使用占位符主要为了避免sql注入
pre = connection.prepareStatement(sql);
pre.setString(1,"100010");
pre.setString(2,"黎明");
pre.setInt(3,30);
pre.setString(4,"女");
pre.setString(5,"手机游戏");

3.4查询数据操作 

//查询数据操作
String sql="select * from student";
pre = connection.prepareStatement (sql);
ResultSet set = pre.executeQuery();
//查询,返回的是结果集,类似于一张虚拟表
//把虚拟表中的数据取出来,即解析结果集
while(set.next()){
/* 调用next()方法时,
 * 游标向下移动一行,
 * 判断是否存在数据,
 * 并把数据放入结果集中,
 * 返回值为布尔类型。
 */
	/* 通过数所在位置去获取数据,这个方法不可取
	 * System.out.println(set.getString(1));
	 * System.out.println(set.getString(2));
	 * System.out.println(set.getInt(3));
	 * System.out.println(set.getString(4));
	 * System.out.println(set.getString(5));
	 */
	System.out.println(set.getString("Sid"));
	System.out.println(set.getString("Sname"));
	System.out.println(set.getInt("Sage"));
	System.out.println(set.getString("Ssex"));
	System.out.println(set.getString("Szhuanye"));
}

4.执行sql语句,并返回结果,并处理结果

/* 执行sql语句
 * 对于jdbc来说操作数据库只有两种操作
 * 1.修改(增,删,改);2.查询(查)
 */
int row = pre.executeUpdate();
//修改,返回影响数据库的行数
System.out.println(row);
if(row>0){
    System.out.println("修改数据成功");
}else{
	System.out.println("修改数据失败");
}

5.关闭资源

finally{
//关闭资源,finally无论代码是否出现异常都会被执行
	try {
		if(connection!=null)
			connection.close(); //关闭数据库链接
		if(pre!=null)
			pre.close(); //关闭语句执行对象
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}		
}

6.完整代码

对于jdbc来说操作数据库只有两种操作:
1.修改(增,删,改);

2.查询(查)。

6.1修改数据操作代码

package java_projects;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class JDBCTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//设置成全局变量,便于后面直接关闭资源
		Connection connection = null;
		PreparedStatement pre = null;
		
		//注册驱动(加载驱动类,5.0版本)
		try {
			Class.forName("com.mysql.jdbc.Driver");
			System.out.println("加载驱动成功");
			
			//创建数据库连接
			String url = "jdbc:mysql://127.0.0.1:3306/score";
			//jdbc:mysql://数据库主机地址:端口号/数据库名
			String user="root";	//数据库用户名
			String password="268875"; //数据库密码
			connection = DriverManager.getConnection(url,user,password);			
			System.out.println("获取数据库连接成功");
			
//			//通过数据库链接对象获取sql语句执行对象Statement
//			//修改数据
//			String sql = "update student SET Sage=? where Sid=?";
//			pre = connection.prepareStatement(sql);
//			//prepareStatement--预编译SQL语句执行对象
//			//把数据设置到占位符位置
//			pre.setInt(1, 39);
//			//向sql语句中第一个位置设置数据
//			pre.setString(2,"100010");
//			//向sql语句中第二个位置设置数据
			
//			//删除数据操作
//			String sql="delete from student where Sid=?";
//			pre = connection.prepareStatement(sql);
//			pre.setString(1, "100020");
			
			//插入数据操作
			String sql="insert into student values(?,?,?,?,?)";
			//问号为占位符,使用占位符主要为了避免sql注入
			pre = connection.prepareStatement(sql);
			pre.setString(1,"100010");
			pre.setString(2,"黎明");
			pre.setInt(3,30);
			pre.setString(4,"女");
			pre.setString(5,"手机游戏");
			
			int row = pre.executeUpdate();
			//修改,返回影响数据库的行数
			System.out.println(row);
			if(row>0){
				System.out.println("修改数据成功");
			}else{
				System.out.println("修改数据失败");
			}
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			System.out.println("加载驱动失败");
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			System.out.println("获取数据库连接失败");
			e.printStackTrace();
		}finally{
		//关闭资源,finally无论代码是否出现异常都会被执行
			try {
				if(connection!=null)
					connection.close(); //关闭数据库链接
				if(pre!=null)
					pre.close(); //关闭语句执行对象
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}		
		}
	}
}

6.2查询数据操作代码

package java_projects;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class JDBCTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//设置成全局变量,便于后面直接关闭资源
		Connection connection = null;
		PreparedStatement pre = null;
		ResultSet set = null;

		//注册驱动(加载驱动类,5.0版本)
		try {
			Class.forName("com.mysql.jdbc.Driver");
			System.out.println("加载驱动成功");
			
			//创建数据库连接
			String url = "jdbc:mysql://127.0.0.1:3306/score";
			//jdbc:mysql://数据库主机地址:端口号/数据库名
			String user="root";	//数据库用户名
			String password="268875";	//数据库密码
			connection = DriverManager.getConnection(url,user,password);			
			System.out.println("获取数据库连接成功");
			
			//查询数据操作
			String sql="select * from student";
			pre = connection.prepareStatement (sql);
			set = pre.executeQuery();
			//查询,返回的是结果集,类似于一张虚拟表
			//把虚拟表中的数据取出来,即解析结果集
			while(set.next()){
			/* 调用next()方法时
			 * 游标向下移动一行
			 * 判断是否存在数据
			 * 并把数据放入结果集中
			 * 返回值为布尔类型
			 */
				/* 通过数所在位置去获取数据,这个方法不可取
				 * System.out.println(set.getString(1));
				 * System.out.println(set.getString(2));
				 * System.out.println(set.getInt(3));
				 * System.out.println(set.getString(4));
				 * System.out.println(set.getString(5));
				 */
				System.out.println(set.getString("Sid"));
				System.out.println(set.getString("Sname"));
				System.out.println(set.getInt("Sage"));
				System.out.println(set.getString("Ssex"));
				System.out.println(set.getString("Szhuanye"));
			}
			
			/* 执行sql语句
			 * 对于jdbc来说操作数据库只有两种操作
			 * 1.修改(增,删,改);2.查询(查)
			 */

		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			System.out.println("加载驱动失败");
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			System.out.println("获取数据库连接失败");
			e.printStackTrace();
		}finally{
		//关闭资源,finally无论代码是否出现异常都会被执行
			try {
				if(connection!=null)
					connection.close(); //关闭数据库链接
				if(pre!=null)
					pre.close(); //关闭语句执行对象
				if(set != null)
					set.close(); //关闭结果集资源
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}	
		}
	}
}

二、JDBC封装函数

1.建立两个类(工具类、测试类)

2.全局变量声明

private	static	Connection connection;
private	static	PreparedStatement pre;
private	static	ResultSet set;
private	static	String url="jdbc:mysql://127.0.0.1:3306/score";
private	static	String user="root";
private	static	String password="268875";
private	static	String driver="com.mysql.jdbc.Driver";

3.初始化数据库链接函数

public static void initConnection(){
	try {
		Class.forName(driver);
		connection = DriverManager.getConnection(url, user, password);
	} catch (ClassNotFoundException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
}

4.修改数据函数

/**
 * 修改数据操作(增、删、改)
 * @param o 数组第一个位置放sql语句,后面的所有位置放sql语句中对应的值
 * @return 影响的行数
 */
public static int update(Object ... o) {
    /* Object ... o
	 * 该写法叫可变参数
	 * 可以传递0到无限个object参数进来
	 * 把可变参数当成数组使用即可
	 */
	try {
		pre=connection.prepareStatement(o[0].toString());
		for(int i=1;i < o.length;i ++){
			pre.setObject(i, o[i]); 
			//不知道设置什么类型,直接使用Object
		}
		return pre.executeUpdate();			
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}finally{
		close(); //关闭资源函数
	}
	return 0;
}
	

5.查询数据函数

	/**
	 * 查询操作
	 * @param o 数组第一个位置放sql语句,后面的所有位置放sql语句中对应的值
	 * @return 返回结果集
	 */
	public static ResultSet select(Object ... o){
		initConnection();
		try {
			pre=connection.prepareStatement(o[0].toString());
			for(int i = 1;i < o.length;i ++){
				pre.setObject(i, o[i]);
			}
			set = pre.executeQuery();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}//结果集资源不能被关闭,所以没有finally语句
		return set;
	}

6.关闭资源函数

public static void close(){
	try {
		if(connection!=null)
			connection.close(); //关闭数据库链接
		if(pre!=null)
			pre.close(); //关闭语句执行对象
		if(set!=null)
			set.close(); //关闭结果集资源
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
}

7.测试代码

7.1修改数据测试代码

package java_projects;

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		JDBCTool.initConnection();
		JDBCTool.update("insert into student values(?,?,?,?,?)","100020","黑暗",50,"男","电脑游戏");
//		int row=JDBCTool.update("insert into student values(?,?,?,?,?)","100020","黑暗",50,"男","电脑游戏");
//		if(row>0){
//			System.out.println("修改数据成功");
//		}else{
//			System.out.println("修改数据失败");
//		}
	}
}

7.2查询数据测试代码

package java_projects;

import java.sql.ResultSet;
import java.sql.SQLException;

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		JDBCTool.initConnection();
		ResultSet set = JDBCTool.select("select * from student");
		try {
			while(set.next()){
				System.out.println(set.getString("Sid"));
				System.out.println(set.getString("Sname"));
				System.out.println(set.getInt("Sage"));
				System.out.println(set.getString("Ssex"));
				System.out.println(set.getString("Szhuanye"));
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			JDBCTool.close();
			/*结果集必须在使用完之后再关闭
			 * 在查询数据函数中不能调用关闭资源函数
			 * 因为查询数据函数返回的是结果集
			 */
		}
	}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JDBC操作 的相关文章

  • 如何使用 PHP 从 MySQL 查询中按升序对值进行排序?

    我使用以下 PHP 脚本从 MySQL 表中获取和更改数据 并将结果打印在 HTML 表中 我希望按升序对数据进行排序 utilization percentage变量 它是由创建的 total client time total avai
  • MySQL 中的断言

    我有一个针对大型数据库运行的 SQL 脚本 我想在开始时提出几个简单的查询 作为健全性检查 有没有办法在MySQL中写断言 或者任何类型的 选择 如果它与该值不匹配 则中止整个脚本 一些疯狂的代码 要点是 SET可能会引发 mysql 变量
  • 获取查询的行号

    我有一个查询将返回一行 当表排序时 有什么方法可以找到我正在查询的行的行索引吗 我试过了rowid但当我期待第 7 行时却得到了 582 Eg CategoryID Name I9GDS720K4 CatA LPQTOR25XR CatB
  • SQL Server PIVOT 函数

    我有一个检索所有代理及其模块的查询 结果集将每个模块返回 1 行 SELECT am agentID AS agentid pa agentDisplayName agentdisplayname m ModuleName ModuleNa
  • MySQL 触发器和 SUM()

    我有两张桌子 学生桌和家庭桌 在学生中 我有列 st venue 和total venue 家里我有收入 Total Revenue 是学生 st 收入与家庭收入之和 其中 family id student student id stud
  • 在 MySQL 中分割逗号分隔值

    我正在尝试将字符串中以逗号分隔的 值拆分为多列 样本数据 COL1 COL2 COL3 000002 000003 000042 09 31 51 007 004 007 预期输出 Pno Cno Sno 000002 09 007 000
  • php 崩溃后 mysql 表被锁定

    我有一个 MySQL DB 和一个 innoDB 表 我有一个 php 页面 用于连接 锁定表 进行一些更新 然后解锁表 PHP 页面通过 wamp 与 apache 一起提供 php页面将文件上传到数据库 我决定通过上传一个大小大于分配给
  • 如何打印Oracle中过程的定义?

    oracle中有没有办法查看过程的结构是什么 我正在尝试记录并运行程序 并希望将实际的程序结构存储在我的日志中 您可以查询ALL SOURCE table SELECT text FROM all source WHERE owner lt
  • PDO::commit() 成功或失败

    The PHP PDO 提交 http www php net manual en pdo commit php文档指出该方法成功时返回 TRUE 失败时返回 FALSE 这是指beginTransaction 和commit 之间的语句执
  • 更新重复密钥上的复合密钥 [重复]

    这个问题在这里已经有答案了 我需要更新新行 如果两者都满足 date dat and empId who 作为复合键 但如果其中之一或两者不同 则插入 sql INSERT INTO history SET endtimestamp now
  • SQL Server 相当于 MySQL 的 USING

    在 MySQL 中 当您连接不同表中具有相同名称的列时 可以在连接中使用关键字 USING 例如 这些查询产生相同的结果 SELECT FROM user INNER JOIN perm USING uid SELECT FROM user
  • 数据表 - 服务器端处理 - 数据库列合并

    我目前正在使用 DataTables 1 10 5 服务器端处理功能 http www datatables net examples data sources server side html http www datatables ne
  • 在 Postgres 中的数组字段上应用聚合函数?

    是否可以对整数 字段 或其他数字数组 中的所有值应用聚合 如 avg stddev CREATE TABLE widget measurement integer insert into widget measurement values
  • 将多行合并为一行并根据行数附加列

    我正在尝试将同一个表的多行合并为一个 我有一个像这样的示例表 Col1 Col2 Col3 Col4 Col5 Col6 1 BH1 CB 12 CC CC Conveyor Mal 1 BH1 CB 104 ZC ZC Full Emp
  • Yii 查询时对相关模型的限制

    我遇到了极限问题 我正在使用的代码如下 model PostCategory model record model gt with array posts gt array order gt posts createTime DESC li
  • 累计非重复计数

    我正在查询每天获取 uid 的累计不同计数 示例 假设有 2 个 uid 100 200 出现在日期 2016 11 01 并且它们也在第二天出现 新的 uid 300 100 200 300 出现在 2016 11 02 此时我希望商店累
  • 如何在动态查询中将行值连接到列名

    我正在开发一个允许配置问题和答案的应用程序 目前最多可以有 20 个答案 但也可能更少 我的结构如下 问题 ID FormId QuestionText AnswerField 1 1 Name Answer01 2 1 Address A
  • 让 Prometheus 发送 SQL 查询

    我正在尝试使用普罗米修斯 https prometheus io 监视我的 MySQL 数据库 但似乎找不到添加 SQL 查询的区域 例如 我想运行一个返回值的 SQL 查询 然后将该值添加到图表中 发送警报 有没有办法让 Promethe
  • 案例陈述以确定我是否应该结合

    我目前想做某种条件联合 给出以下示例 SELECT age name FROM users UNION SELECT 25 AS age Betty AS name 假设我只想在 用户 计数 gt 2 时合并第二个语句 否则不合并两者 总之
  • 哪个是识别关系或非识别关系中的子表?

    在表之间的识别和非识别关系的上下文中 MySQL 文档大量将表称为父表和子表 如何判断哪个表是父表 哪个表是子表 子表 A K A 弱实体 http en wikipedia org wiki Weak entity 是一个表 其主键属性d

随机推荐

  • java list 写入txt_java 如何用io流 读取list集合里我需要的内容,然后写入到.txt文件里?各位大侠请赐教...

    展开全部 import org junit Test import java io import java util ArrayList import java util List public class TestIo 路径 privat
  • 微信小程序详细图文教程-10分钟完成微信小程序开发部署发布(3元获取腾讯云服务器带小程序支持系统)

    很多朋友都认为微信小程序申请 部署 发布很难 需要很长时间 实际上 微信和腾讯云同是腾讯产品 已经提供了10分钟 根据准备资源情况 已完成小程序申请认证 完成小程序开发 部署 发布的方式 当然 实现的是基础功能 但是 可以给学习者很便捷的体
  • ios接入GameCenter登录

    iOS接入GameCenter登录很简单 首先 在target gt Capabilities中打开GameCenter配置 这里的内购 In App Purchase 是因为我需要接内购的SDK 所以我把这个 In App Purchas
  • C++ STL基本容器比较

    摘自 http blog chinaunix net u2 75321 showart 1144742 html 在STL中基本容器有 string vector list deque set map set 和map都是无序的保存元素 只
  • 在vue中使用高德地图的上浮下钻—最简单明了的方法(无需后台接口渲染文字marker)

    在vue中使用高德地图的上浮下钻 最简单明了的方法 无需后台接口渲染文字marker 第一步 安装vue amap npm i vue amap S 第二步 配置main js import VueAMap from vue amap Vu
  • QT之鼠标点击事件学习

    最近在学习点击鼠标事件 在这分享给大家 window h中的配置 ifndef MAINWINDOW H define MAINWINDOW H include
  • Linux如何查看显存

    以下内容由参看资料总结而来 若有不对 望指出 用ctrl alt t打开终端 输入命令 lspci 得到如下 部分 00 1f 6 Signal processing controller Intel Corporation 5 Serie
  • AI相关站点

    人工智能学习网站 产品经理的人工智能学习库 https easyai tech 大白智能 https www jiangdabai com API网站 极速数据 https www jisuapi com api Kate API http
  • Pandas删除某一列的方法

    1 del df columns 改变原始数据 2 df drop columns axis 1 删除不改表原始数据 可以通过重新赋值的方式赋值该数据 3 df drop columns axis 1 inplace True 改变原始数据
  • 怎样将cad布局导出来_cad布局导出模型(CAD 布局图怎么转换成模型图)

    请教大神cad布局转模型exportlayout命令无法生成新 用高版本CAD打开需要转的文件 然后用recover命令 输入完命令会提示打开文件 再次选择第一次 需要转换的 文件 此时会从新打开一个新文件 在新文件中右键模型选项卡点击里面
  • 用python编写一个更好看好用的日志库

    相信现在很多做自动化测试 开发 一般用的都是python的logging来记录日志 但是 logging确实不是很好看 只有一个红色的 在控制台中也不好分辨 那能不能自己写一个好看点的呢 我已经写好一个了 需要的可以直接下载安装试试 下面来
  • RabbitMQ图文详解

    重新整理了涉及资料的一些语言描述 排版而使用了自己的描述 对一些地方做了补充说明 比如解释专有名词 类比说明 对比说明 注意事项 提升了总结归纳性 尽可能在每个知识点上都使用一句话 关键词概括 更注重在实际上怎么应用 提出并回答了一些问题
  • C++ 函数重载(overroad) 覆盖(override) 隐藏(hide) 的区别

    C 函数重载 overroad 覆盖 override 隐藏 hide 的区别 原文转自 http blog chinaunix net u 15921 showart 227111 html 成员函数被重载的特征 1 相同的范围 在同一个
  • 2020年数学建模国赛C题题目和解题思路

    2020年数学建模国赛C题题目 在实际中 由于中小微企业规模相对较小 也缺少抵押资产 因此银行通常是依据信贷政策 企业的交易票据信息和上下游企业的影响力 向实力强 供求关系稳定的企业提供贷款 并可以对信誉高 信贷风险小的企业给予利率优惠 银
  • 安全防御——防火墙一

    安全防御 防火墙一 1 什么是防火墙 2 互联网为什么会出现防火墙 3 状态防火墙工作原理 4 防火墙如何处理双通道协议 5 防火墙如何处理nat 6 你知道哪些防火墙 以及防火墙的技术分类 防火墙种类 1 硬件防火墙 2 软件防火墙 个人
  • Qt入门(12)——Qt国际化

    应用的国际化就是使应用成为能被非本国的人使用的过程 有的情况下 国际化很简单 例如 使一个US应用可被Australian或者British用户理解 工作可能少于几个拼写修正 但是使一个US应用可以被Japanese用户使用 或者一个Kor
  • React 在componentDidMount使用 echarts,样式未加载导致Echart自适应div出错

    只需要修改componentDidMount中加入setTimeout gt echarts代码 import React Component from react import Main css 引入 ECharts 主模块 ts ign
  • 创建聚集索引

    一 ibuf init at db start Creates the insert buffer data structure at a database startup and initializes the data structur
  • 深度学习(十九)——FCN, SegNet, DeconvNet, DeepLab, ENet, GCN

    前DL时代的语义分割 续 Grab cut Grab cut是微软剑桥研究院于2004年提出的著名交互式图像语义分割方法 与N cut一样 grab cut同样也是基于图划分 不过grab cut是其改进版本 可以看作迭代式的语义分割算法
  • JDBC操作

    目录 一 实现JDBC步骤 1 注册驱动 1 1导入驱动包 1 1异常处理 2 创建连接 2 1导包 2 2处理异常 3 得到执行sql语句的Statement对象 3 1修改数据操作 3 2删除数据操作 3 3插入数据操作 3 4查询数据