JDBC(一)
下载并配置对应数据库的驱动jar包。例如,MySQL驱动需要下载mysql-connector-java-5.x.x-bin.jar,并将其添加到类路径。 使用集成开发工具(如IntelliJ IDEA或Eclipse)进行代码编写和调试。
发布日期:2021-04-30 21:04:23
浏览次数:96
分类:精选文章
本文共 10126 字,大约阅读时间需要 33 分钟。
JDBC是什么?
JDBC(Java Database Connectivity),即Java数据库连接,是Java编程中用于规范客户端程序如何访问数据库的标准。它主要面向关系型数据库,提供了执行数据库查询和更新的方法。
JDBC的本质
JDBC实际上是一套接口,属于Java.sql.*包中的接口。作为面向接口编程的典范,JDBC通过定义接口和提供实现类,使得程序可以与数据库交互,而无需直接关注具体的数据库实现。这使得程序具有更高的扩展性和灵活性。
为什么要面向接口编程?
面向接口编程的主要原因是为了实现解耦合。通过定义标准接口,程序可以与多个数据库驱动兼容,而不需要修改代码。这种设计使得程序更易于扩展和维护。
JDBC开发前的准备工作
在开发JDBC程序之前,需要完成以下准备工作:
JDBC访问数据库需要用到的类、接口和方法
JDBC涉及多个核心类和接口,主要包括以下几个:
1. DriverManager类
- 负责加载和管理数据库驱动程序。
- 主要方法:
getConnection(url, username, password),用于获取数据库连接。
2. Connection接口
- 代表数据库连接,用于执行SQL语句和处理事务。
- 主要方法:
Statement createStatement():创建用于执行静态SQL语句的Statement对象。PreparedStatement prepareStatement(String sql):创建用于执行带有动态参数的SQL语句的PreparedStatement对象。
3. Statement接口
- 用于执行静态SQL语句(如插入、更新、删除操作)。
- 主要方法:
int executeUpdate(String sql):执行插入、更新、删除操作。ResultSet executeQuery(String sql):执行查询操作,并返回结果集。
4. PreparedStatement接口
- 用于执行带有动态参数的SQL语句。
- 主要方法:
int executeUpdate():执行带有占位符的SQL语句。ResultSet executeQuery():执行带有占位符的查询语句。
5. ResultSet接口
- 用于处理数据库查询结果。
- 主要方法:
boolean next():将指针移动到下一行。getXXX(int columnIndex):根据列索引获取对应字段的值。getXXX(String columnName):根据字段名称获取对应字段的值。
JDBC访问数据库的流程
以下是JDBC访问数据库的典型流程:
创建数据库表
使用SQL语句创建用户表:CREATE TABLE t_user ( u_id INT PRIMARY KEY AUTO_INCREMENT, u_name VARCHAR(20), u_age INT, useraddress VARCHAR(30));
创建Java项目并导入数据库启动包
在IntelliJ IDEA中,新建Java项目,添加MySQL驱动jar包,并配置项目的类路径。编写保存用户信息的Java类
定义一个UserBean类,用于封装用户信息:package com.example.jdbcdemo.bean;public class UserBean { private int uid; private String uname; private int uage; private String uaddress; public int getUid() { return uid; } public void setUid(int uid) { this.uid = uid; } public String getUname() { return uname; } public void setUname(String uname) { this.uname = uname; } public int getUage() { return uage; } public void setUage(int uage) { this.uage = uage; } public String getUaddress() { return uaddress; } public void setUaddress(String uaddress) { this.uaddress = uaddress; }}编写数据库驱动管理类
定义DBConnection类,用于加载数据库驱动并获取数据库连接:package com.example.jdbcdemo.db;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;public class DBConnection { private static final String DRIVER_NAME = "com.mysql.jdbc.Driver"; private static final String URL = "jdbc:mysql://localhost:3306/test"; private static final String USERNAME = "root"; private static final String PASSWORD = "123456"; static { try { Class.forName(DRIVER_NAME); } catch (ClassNotFoundException e) { System.out.println("未找到数据库驱动!"); e.printStackTrace(); } } public static Connection getMyConnection() { Connection connection = null; try { connection = DriverManager.getConnection(URL, USERNAME, PASSWORD); } catch (SQLException e) { System.out.println("获取数据库连接失败!"); e.printStackTrace(); } return connection; }}编写访问数据库的DAO类
UserDaoObject类用于实现用户数据的 CRUD(增删改查)操作:package com.example.jdbcdemo.dao;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.util.ArrayList;import java.util.List;import com.example.jdbcdemo.bean.UserBean;import com.example.jdbcdemo.db.DBConnection;public class UserDaoObject { public Connection connLink() { return DBConnection.getMyConnection(); } public Statement statementGet(Connection connection) throws SQLException { return connection.createStatement(); } public void closeCAndS(Statement statement, Connection connection) { try { if (statement != null) { statement.close(); } if (connection != null) { connection.close(); } } catch (SQLException e) { e.printStackTrace(); } } public void insertUser(UserBean userBean) { Connection conn = null; Statement statement = null; try { conn = connLink(); statement = statementGet(conn); String insertSql = String.format( "INSERT INTO t_user VALUES (NULL, '%s', %d, '%s')", userBean.getUname(), userBean.getUage(), userBean.getUaddress() ); int result = statement.executeUpdate(insertSql); if (result > 0) { System.out.println("添加信息成功!"); } } catch (Exception e) { System.out.println("添加信息失败!"); e.printStackTrace(); } finally { closeCAndS(statement, conn); } } public void updateUserById(UserBean userBean) { Connection conn = null; Statement statement = null; try { conn = connLink(); statement = statementGet(conn); String updateSql = String.format( "UPDATE t_user SET u_name='%s', u_age=%d, useraddress='%s' WHERE u_id=%d", userBean.getUname(), userBean.getUage(), userBean.getUaddress(), userBean.getUid() ); int result = statement.executeUpdate(updateSql); if (result > 0) { System.out.println("修改信息成功!"); } } catch (Exception e) { System.out.println("修改信息失败!"); e.printStackTrace(); } finally { closeCAndS(statement, conn); } } public UserBean selectUserMsgById(int userId) { UserBean userBean = null; Connection conn = null; Statement statement = null; ResultSet resultSet = null; try { conn = connLink(); statement = statementGet(conn); String selectSql = String.format( "SELECT u_id, u_name, u_age, useraddress FROM t_user WHERE u_id=%d", userId ); resultSet = statement.executeQuery(selectSql); if (resultSet.next()) { userBean = new UserBean(); userBean.setUid(resultSet.getInt("u_id")); userBean.setUname(resultSet.getString("u_name")); userBean.setUage(resultSet.getInt("u_age")); userBean.setUaddress(resultSet.getString("useraddress")); } } catch (Exception e) { System.out.println("查询失败!"); e.printStackTrace(); } finally { if (resultSet != null) { try { resultSet.close(); } catch (SQLException e) { e.printStackTrace(); } } closeCAndS(statement, conn); } return userBean; } public List selectUserAll() { List userList = new ArrayList<>(); Connection conn = null; Statement statement = null; ResultSet resultSet = null; try { conn = connLink(); statement = statementGet(conn); String selectSql = "SELECT * FROM t_user;"; resultSet = statement.executeQuery(selectSql); while (resultSet.next()) { UserBean userBean = new UserBean(); userBean.setUid(resultSet.getInt("u_id")); userBean.setUname(resultSet.getString("u_name")); userBean.setUage(resultSet.getInt("u_age")); userBean.setUaddress(resultSet.getString("useraddress")); userList.add(userBean); } } catch (Exception e) { System.out.println("查询失败!"); e.printStackTrace(); } finally { if (resultSet != null) { try { resultSet.close(); } catch (SQLException e) { e.printStackTrace(); } } closeCAndS(statement, conn); } return userList; } public void deleteUserById(int userId) { Connection conn = null; Statement statement = null; try { conn = connLink(); statement = statementGet(conn); String deleteSql = String.format( "DELETE FROM t_user WHERE u_id=%d", userId ); int result = statement.executeUpdate(deleteSql); if (result > 0) { System.out.println("删除信息成功!"); } } catch (Exception e) { System.out.println("删除失败!"); e.printStackTrace(); } finally { closeCAndS(statement, conn); } }} 编写测试类
TestMain类用于验证各个功能的实现是否正确:package com.example.jdbcdemo.test;import java.util.List;import com.example.jdbcdemo.bean.UserBean;import com.example.jdbcdemo.dao.UserDaoObject;public class TestMain { public static void main(String[] args) { // 测试添加数据 UserBean userBean = new UserBean(); userBean.setUname("张三"); userBean.setUage(25); userBean.setUaddress("山西"); UserDaoObject userDaoObject = new UserDaoObject(); userDaoObject.insertUser(userBean); // 测试修改数据 UserBean updateBean = new UserBean(); updateBean.setUid(2); updateBean.setUname("李四"); updateBean.setUage(30); updateBean.setUaddress("北京"); userDaoObject.updateUserById(updateBean); // 测试查询用户信息 UserBean queryBean = userDaoObject.selectUserMsgById(1); if (queryBean != null) { System.out.println(queryBean.getUname() + "\t" + queryBean.getUage() + "\t" + queryBean.getUaddress()); } else { System.out.println("查询失败!"); } // 测试查询所有用户信息 List allUserList = userDaoObject.selectUserAll(); if (allUserList.size() > 0) { for (UserBean userBean : allUserList) { System.out.println(userBean.getUname() + "\t" + userBean.getUage() + "\t" + userBean.getUaddress()); } } else { System.out.println("没有查到数据!"); } // 测试删除用户信息 userDaoObject.deleteUserById(2); }} 总结
通过以上步骤,可以实现一个完整的JDBC数据库访问流程。开发过程中需要注意资源的释放和异常的处理,以确保程序的健壮性。
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2026年05月29日 06时22分13秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
php反射api
2023-03-01
PHP反射ReflectionClass、ReflectionMethod 入门教程
2023-03-01
PHP反射机制
2023-03-01
php取当天的最后一秒_Docker快速搭建PHP开发环境详细教程
2023-03-01
php取绝对值
2023-03-01
php各种常用的算法
2023-03-01
php各种缓存策略对比
2023-03-01
php后台“爬虫”模拟登录第三方系统
2023-03-01
php后台的在控制器中就可以实现阅读数增加
2023-03-01
php命令行生成项目结构
2023-03-01
php命名空间
2023-03-01
PHP命名空间带来的干扰
2023-03-01
PHP和MySQL Web开发从新手到高手,第1天-搭建PHP开发环境
2023-03-01
php商店管理系统,基于PHP的商店管理系统.doc
2023-03-01
PHP四大主流框架的优缺点总结
2023-03-01
PHP图片处理—PNG透明缩放并生成灰图
2023-03-01
php在liunx系统中设置777权限不起作用解决方法
2023-03-01
PHP基于openssl实现的非对称加密操作
2023-03-01
php基本符号大全
2023-03-01
php基础篇-二维数组排序 array_multisort
2023-03-01