原生JDBC

/**
 * JDBC( java DataBase Connection 数据库链接  ) 是一种用于执行SQL语句的java API.
 * JDBC是java访问数据库的标准规范,可以为不同的关系库提供统一访问,由一组用java语言编写的接口和类组成
 * JDBC规范四个核心对象:
 * 		DriverManager -->用于注册驱动
 * 		Connection    -->获取数据库链接对象
 * 		Statement     -->操作数据库sql语句对象
 * 		ResultSet     -->返回结果集
 */
* 需要使用数据库链接相关的jar
 * mysql-connector-java-5.1.37-bin.jar
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCUtils {
	// 定义数据库四大基本信息
	private static String driver = "com.mysql.jdbc.Driver";
	private static String url = "jdbc:mysql://127.0.0.1:3306/day_04";
	private static String username = "root";
	private static String password = "root";
	private static Connection conn;

	// 定义一个静态块,在调用JDBCUtils类是初始化,获取数据库链接
	static {
		try {
			/*
			 * java.sql.DriverManager是用来管理数据库驱动程序的 static void
			 * registerDriver(Driver driver) 向 DriverManager 注册给定驱动程序。
			 * 工具源码里面有一个static驱动,当调用driver类时已经调用了,所以这里不需要再次调用,我们可以使用反射技术
			 * DriverManager.registerDriver(new Driver());
			 */
			Class.forName(driver);
			// 获取数据库链接对象
			conn = DriverManager.getConnection(url, username, password);
		} catch (Exception e) {
			// 把编译异常转变为运行时异常
			throw new RuntimeException("数据库链接失败");
		}
	}
	//返回数据库链接对象
	public static Connection getConnection() {
		return conn;
	}
	//静态关闭流对象
	public static void close(ResultSet rs, Statement stat, Connection conn) {
		try {
			if (rs != null) {
				rs.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				stat.close();
			} catch (SQLException e) {
				e.printStackTrace();
			} finally {
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
	}
}
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

public class DemoJDBCUtils {
	public static void main(String[] args) {
		//定义局部变量
		Connection connection = null;
		Statement statement = null;
		ResultSet resultSet = null;
		try {
			//获取数据库链接对象
			connection = JDBCUtils.getConnection();
			//获取数据执行方法
			statement = connection.createStatement();
			String sql = "select * from 表名";
			//请求数据sql返回结果集
			resultSet = statement.executeQuery(sql);
			//next是否有下一个
			while(resultSet.next()){
				System.out.println(resultSet.getString("cid")+"\t"+resultSet.getString("cname"));
			}
		} catch (Exception e) {
			System.out.println(e);
		}finally {
			//关闭流对象
			JDBCUtils.close(resultSet, statement, connection);
		}
	}
}
<think>首先,用户的问题是关于使用Java原生JDBC进行数据库连接和操作,具体是问教程和数据库连接示例。我需要基于系统级指令来构建回答。 系统级指令: - 所有行内数学表达式必须用$...$,但这里没有数学内容,所以可能不需要。 - 独立公式用$$...$$,但主题是JDBC,不是数学,所以可能不需要。 - LaTeX语法正确:确保任何公式正确,但可能不适用。 - 使用中文回答。 - 生成相关问题:在回答末尾添加相关问题。 - 引用段落末尾添加引用标识,如[^1]。 - 回答结构清晰,帮助用户逐步解决问题,保证真实可靠。 - 参考站内引用:有引用[1]、[2]、[3],关于JDBC。 用户的问题:想使用原生JDBC进行数据库连接和操作,问Java原生JDBC使用教程和数据库连接示例。 我的回答应该: 1. **结构清晰**:逐步解释如何操作。 2. **真实可靠**:基于JDBC标准知识。 3. **使用引用**:在回答中引用提供的引用内容,末尾添加标识。 4. **生成相关问题**:在最后添加相关问题。 提供的引用: - 引用[1]:介绍JDBC概述,包括定义、驱动等。 - 引用[2]:一个查询示例代码。 - 引用[3]:另一个代码片段,展示连接和操作。 我应该将这些引用融入回答中。 大纲回答: 1. **介绍JDBC**:简要解释什么是JDBC,基于引用[1]。 2. **步骤指南**:分步解释如何连接和操作数据库。 - 加载驱动。 - 建立连接。 - 创建语句。 - 执行查询/更新。 - 处理结果。 - 关闭资源。 3. **示例代码**:提供一个完整的示例,基于引用[2]和[3],但简化或整合。 4. **添加引用**:在相关段落末尾添加引用标识。 5. **相关问题**:在最后生成几个相关问题。 确保使用中文。 生成相关问题:基于主题,如: - JDBC驱动如何工作? - 如何处理异常? - 如何优化JDBC性能? - JDBC在实际应用中的案例? 现在,构建回答。</think>### Java原生JDBC使用教程:数据库连接与操作指南 Java Database Connectivity (JDBC) 是Java访问关系型数据库的标准API,它提供了一套接口和类,允许开发者执行SQL语句并处理结果。原生JDBC是指直接使用JDBC API进行数据库交互,无需第三方框架(如Hibernate或MyBatis)。下面我将逐步讲解JDBC的使用流程,并提供一个完整的数据库连接示例。教程基于JDBC标准原理和实践,确保真实可靠。 #### 1. JDBC概述与准备工作 JDBC的核心是驱动程序(Driver),它充当Java应用程序与数据库之间的桥梁。每个数据库厂商(如MySQL、Oracle)提供自己的JDBC驱动jar包。例如,MySQL驱动是`mysql-connector-java-*.jar`。JDBC通过统一的接口(如`Connection`、`Statement`)屏蔽数据库差异,实现跨数据库兼容性。原理上,JDBC驱动将Java调用转换为数据库协议,执行SQL并返回结果[^1]。 在开始前,确保: - 安装Java开发环境(JDK 8+)。 - 添加数据库驱动jar包到项目依赖中(例如,通过Maven或手动添加)。 - 准备数据库信息:URL、用户名、密码。URL格式通常为`jdbc:数据库类型://主机:端口/数据库名`,例如MySQL的`jdbc:mysql://localhost:3306/test`。 #### 2. JDBC操作步骤详解 JDBC操作分为六个核心步骤,每个步骤都涉及关键接口。以下是标准流程: 1. **加载驱动**:使用`Class.forName()`加载数据库驱动类。现代JDBC驱动通常自动加载,但显式调用可确保兼容性。 2. **建立连接**:通过`DriverManager.getConnection()`获取`Connection`对象,传入数据库URL、用户名和密码。 3. **创建语句**:使用`Connection`创建`Statement`或`PreparedStatement`对象。`PreparedStatement`更安全,支持参数化查询,防止SQL注入。 4. **执行SQL**: - 查询:使用`executeQuery()`执行SELECT语句,返回`ResultSet`对象。 - 更新:使用`executeUpdate()`执行INSERT、UPDATE、DELETE语句,返回受影响的行数。 5. **处理结果**:遍历`ResultSet`获取数据,使用`getString()`、`getInt()`等方法提取字段值。 6. **关闭资源**:按顺序关闭`ResultSet`、`Statement`、`Connection`,释放数据库资源,避免内存泄漏。使用`try-with-resources`自动关闭更安全。 #### 3. 完整示例:数据库连接与查询操作 以下是一个使用原生JDBC连接MySQL数据库的示例代码。代码基于标准JDBC API,并参考了实际查询示例[^2][^3]。假设数据库名为`test`,表为`account`(包含字段如`id`, `name`)。 ```java import java.sql.*; public class JDBCTest { public static void main(String[] args) { // 数据库配置信息 String url = "jdbc:mysql://localhost:3306/test"; String user = "root"; String password = "your_password"; // 替换为你的数据库密码 // 使用try-with-resources自动关闭资源 try (Connection conn = DriverManager.getConnection(url, user, password); PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM account WHERE id = ?"); ResultSet rs = pstmt.executeQuery()) { // 加载驱动(可选,现代驱动自动加载) Class.forName("com.mysql.cj.jdbc.Driver"); // 设置查询参数(id=1) pstmt.setInt(1, 1); // 执行查询并处理结果 while (rs.next()) { String name = rs.getString("name"); System.out.println("查询结果:name = " + name); } } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); // 实际应用中应处理异常 } } } ``` **代码说明**: - **连接建立**:`DriverManager.getConnection()`创建连接对象[^3]。 - **参数化查询**:使用`PreparedStatement`设置参数(`pstmt.setInt(1, 1)`),提高安全性和性能。 - **结果处理**:`ResultSet`遍历结果集,提取字段值[^2]。 - **异常处理**:捕获`SQLException`和`ClassNotFoundException`,确保健壮性。 - **资源关闭**:`try-with-resources`自动关闭连接、语句和结果集,避免手动错误。 #### 4. 常见问题与优化建议 - **性能优化**:使用连接池(如DBCP或HikariCP)复用连接,减少开销。引用示例中展示了连接池的使用[^2][^3]。 - **错误处理**:总是检查SQL异常,并添加日志记录。 - **安全提示**:优先用`PreparedStatement`而非`Statement`,防止SQL注入。 - **驱动兼容性**:确保驱动版本匹配数据库,例如MySQL 8+用`mysql-connector-java-8.0.x.jar`。 通过以上步骤,您可以快速上手原生JDBC。实际应用中,JDBC常用于简单CRUD操作或作为ORM框架的基础[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值