JDBC入门数据库连接

news/2024/9/18 0:28:42/

1. JDBC入门

JDBC(Java Database Connectivity)是Java程序与数据库进行交互的一种标准接口,它提供了一种简单的方式来连接和操作数据库。在使用JDBC之前,需要先了解以下几个概念:

  • JDBC Driver:JDBC驱动程序是一个Java类,用于将Java应用程序与特定数据库管理系统(DBMS)连接。JDBC驱动程序分为四种类型:JDBC-ODBC桥接驱动程序、本地API驱动程序、网络协议驱动程序和本地协议驱动程序。
  • Connection:Connection是一个JDBC接口,用于连接到数据库。在Java程序中,通过Connection接口的实现类来实现与数据库的连接。
  • Statement:Statement是一个JDBC接口,用于向数据库发送SQL语句并执行它们。在Java程序中,通过Connection对象创建Statement对象。
  • ResultSet:ResultSet是一个JDBC接口,用于表示从数据库中检索到的结果集。ResultSet对象通过Statement对象的executeQuery()方法返回。

下面是一个简单的JDBC连接示例:

import java.sql.*;public class JDBCDemo {public static void main(String[] args) {try {// 加载JDBC驱动程序Class.forName("com.mysql.cj.jdbc.Driver");// 建立数据库连接Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "password");// 执行SQL查询Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery("SELECT * FROM users");while (rs.next()) {System.out.println(rs.getInt(1) + ", " + rs.getString(2) + ", " + rs.getString(3));}// 关闭数据库连接rs.close();stmt.close();conn.close();} catch (Exception e) {e.printStackTrace();}}
}

2. 抽取工具类

在实际开发中,我们通常会抽取出一个JDBC工具类来封装JDBC相关操作,以方便代码的重用和维护。下面是一个简单的JDBC工具类示例:

import java.sql.*;public class JDBCUtils {private static final String URL = "jdbc:mysql://localhost:3306/mydb";private static final String USER = "root";private static final String PASSWORD = "password";static {try {// 加载JDBC驱动程序Class.forName("com.mysql.cj.jdbc.Driver");} catch (ClassNotFoundException e) {e.printStackTrace();}}public static Connection getConnection() {Connection conn = null;try {// 建立数据库连接conn = DriverManager.getConnection(URL, USER, PASSWORD);} catch (SQLException e) {e.printStackTrace();}return conn;}public static void release(ResultSet rs, Statement stmt, Connection conn) {try {if (rs != null) rs.close();if (stmt != null) stmt.close();if (conn != null) conn.close();} catch (SQLException e) {e.printStackTrace();}}
}

3. Statement CRUD

Statement是JDBC中最基本的操作方式,它用于向数据库发送SQL语句并执行它们。下面是一个使用Statement进行CRUD操作的示例:

import java.sql.*;public class StatementCRUD {public static void main(String[] args) {Connection conn = null;Statement stmt = null;ResultSet rs = null;try {conn = JDBCUtils.getConnection();stmt = conn.createStatement();// 插入数据String sql = "INSERT INTO users (name, age) VALUES ('Tom', 18)";stmt.executeUpdate(sql);// 更新数据sql = "UPDATE users SET age = 20 WHERE name = 'Tom'";stmt.executeUpdate(sql);// 删除数据sql = "DELETE FROM users WHERE age = 20";stmt.executeUpdate(sql);// 查询数据sql = "SELECT * FROM users";rs = stmt.executeQuery(sql);while (rs.next()) {System.out.println(rs.getInt(1) + ", " + rs.getString(2) + ", " + rs.getInt(3));}} catch (SQLException e) {e.printStackTrace();} finally {JDBCUtils.release(rs, stmt, conn);}}
}

4. 演练CRUD

下面是一个使用PreparedStatement进行CRUD操作的示例:

import java.sql.*;public class PreparedStatementCRUD {public static void main(String[] args) {Connection conn = null;PreparedStatement pstmt = null;ResultSet rs = null;try {conn = JDBCUtils.getConnection();// 插入数据String sql = "INSERT INTO users (name, age) VALUES (?, ?)";pstmt = conn.prepareStatement(sql);pstmt.setString(1, "Tom");pstmt.setInt(2, 18);pstmt.executeUpdate();// 更新数据sql = "UPDATE users SET age = ? WHERE name = ?";pstmt = conn.prepareStatement(sql);pstmt.setInt(1, 20);pstmt.setString(2, "Tom");pstmt.executeUpdate();// 删除数据sql = "DELETE FROM users WHERE age = ?";pstmt = conn.prepareStatement(sql);pstmt.setInt(1, 20);pstmt.executeUpdate();// 查询数据sql = "SELECT * FROM users";pstmt = conn.prepareStatement(sql);rs = pstmt.executeQuery();while (rs.next()) {System.out.println(rs.getInt(1) + ", " + rs.getString(2) + ", " + rs.getInt(3));}} catch (SQLException e) {e.printStackTrace();} finally {JDBCUtils.release(rs, pstmt, conn);}}
}

5. Dao模式(声明与实现分开)

Dao(Data Access Object)模式是一种用于封装数据访问逻辑的设计模式。它将数据访问逻辑与业务逻辑分离开来,使得代码更易于维护和扩展。下面是一个使用Dao模式进行CRUD操作的示例:

import java.sql.*;public class UserDAO {private static final String INSERT_SQL = "INSERT INTO users (name, age) VALUES (?, ?)";private static final String UPDATE_SQL = "UPDATE users SET age = ? WHERE name = ?";private static final String DELETE_SQL = "DELETE FROM users WHERE age = ?";private static final String SELECT_SQL = "SELECT * FROM users";public void insert(User user) {Connection conn = null;PreparedStatement pstmt = null;try {conn = JDBCUtils.getConnection();pstmt = conn.prepareStatement(INSERT_SQL);pstmt.setString(1, user.getName());pstmt.setInt(2, user.getAge());pstmt.executeUpdate();} catch (SQLException e) {e.printStackTrace();} finally {JDBCUtils.release(null, pstmt, conn);}}public void update(User user) {Connection conn = null;PreparedStatement pstmt = null;try {conn = JDBCUtils.getConnection();pstmt = conn.prepareStatement(UPDATE_SQL);pstmt.setInt(1, user.getAge());pstmt.setString(2, user.getName());pstmt.executeUpdate();} catch (SQLException e) {e.printStackTrace();} finally {JDBCUtils.release(null, pstmt, conn);}}public void delete(int age) {Connection conn = null;PreparedStatement pstmt = null;try {conn = JDBCUtils.getConnection();pstmt = conn.prepareStatement(DELETE_SQL);pstmt.setInt(1, age);pstmt.executeUpdate();} catch (SQLException e) {e.printStackTrace();} finally {JDBCUtils.release(null, pstmt, conn);}}public List<User> selectAll() {Connection conn = null;PreparedStatement pstmt = null;ResultSet rs = null;List<User> userList = new ArrayList<>();try {conn = JDBCUtils.getConnection();pstmt = conn.prepareStatement(SELECT_SQL);rs = pstmt.executeQuery();while (rs.next()) {User user = new User();user.setId(rs.getInt(1));user.setName(rs.getString(2));user.setAge(rs.getInt(3));userList.add(user);}} catch (SQLException e) {e.printStackTrace();} finally {JDBCUtils.release(rs, pstmt, conn);}return userList;}
}public class User {private int id;private String name;private int age;// 省略getter、setter方法
}

6. PrepareStatement CRUD

PreparedStatement是一种预编译的Statement,它可以通过占位符的方式来替换SQL语句中的参数,避免了SQL注入的危险。下面是一个使用PreparedStatement进行CRUD操作的示例:

import java.sql.*;public class PrepareStatementCRUD {public static void main(String[] args) {Connection conn = null;PreparedStatement pstmt = null;ResultSet rs = null;try {conn = JDBCUtils.getConnection();// 插入数据String sql = "INSERT INTO users (name, age) VALUES (?, ?)";pstmt = conn.prepareStatement(sql);pstmt.setString(1, "Tom");pstmt.setInt(2, 18);pstmt.executeUpdate();// 更新数据sql = "UPDATE users SET age = ? WHERE name = ?";pstmt = conn.prepareStatement(sql);pstmt.setInt(1, 20);pstmt.setString(2, "Tom");pstmt.executeUpdate();// 删除数据sql = "DELETE FROM users WHERE age = ?";pstmt = conn.prepareStatement(sql);pstmt.setInt(1, 20);pstmt.executeUpdate();// 查询数据sql = "SELECT * FROM users";pstmt = conn.prepareStatement(sql);rs = pstmt.executeQuery();while (rs.next()) {System.out.println(rs.getInt(1) + ", " + rs.getString(2) + ", " + rs.getInt(3));}} catch (SQLException e) {e.printStackTrace();} finally {JDBCUtils.release(rs, pstmt, conn);}}
}

以上就是关于JDBC入门、抽取工具类、Statement CRUD、演练CRUD、Dao模式(声明与实现分开)、PrepareStatement CRUD的详细介绍和代码示例。通过学习这些内容,可以让我们更好地掌握JDBC的使用和开发技巧,从而更好地应用到实际的项目中。


http://www.ppmy.cn/news/47968.html

相关文章

D. Marcin and Training Camp(思维 + 判断一个数二进制位是否是另一个数的子集)

Problem - D - Codeforces 马辛是他大学里的一名教练。有N个学生想参加训练营。马辛是个聪明的教练&#xff0c;所以他只想派那些能冷静合作的学生参加。 让我们关注一下这些学生。每个学生可以用两个整数ai和bi来描述&#xff1b;bi等于第i个学生的技能水平&#xff08;越高越…

十二、详解Kubernetes存储卷的技术原理

Kubernetes存储卷是Kubernetes中用于持久化存储数据的一种抽象概念。它们允许容器在不同的Pod之间共享数据,并且可以在Pod重新调度或迁移时保留数据。本文将详细介绍Kubernetes存储卷的原理。 1.存储卷的概念 Kubernetes存储卷是为了解决容器化环境下数据持久化的问题而引入…

linux_FIFO命名管道-mkfifo函数-进程通信

接上一篇&#xff1a;linux_管道学习-pipe函数-管道的读写-fpathconf函数 本次来分享FIFO命名管道&#xff0c;一些常识&#xff0c;开始上菜&#xff1a; 1.FIFO-mkfifo函数 FIFO常被称为命名管道&#xff0c;以区分管道(pipe)。管道(pipe)只能用于“有血缘关系”的进程间。…

第三章 法的渊源与法的分类

目录 第一节 法的渊源的分类 一、法的渊源释义二、法的渊源种类 第二节 正式法源 一、正式法源的含义二、当代中国的正式法源三、正式法源的一般效力原则 第三节 非正式法源 一、当代中国的非正式法源 第四节 法的分类 一、法的一般分类二、法的特殊分类 第一节 法的渊源的…

Spring AOP核心概念与操作示例

AOP 核心概念 还记得我们Spring有两个核心的概念嘛&#xff1f;一个是IOC/DI&#xff0c;另一个是AOP咯。 先来认识两个概念&#xff1a; AOP(Aspect Oriented Programming)面向切面编程&#xff1b;作用&#xff1a;在不惊动原始设计的基础上为其进行功能增强&#xff0c;类…

Spring Security 05 密码加密

目录 DelegatingPasswordEncoder 使用 PasswordEncoder 密码加密实战 密码自动升级 实际密码比较是由PasswordEncoder完成的&#xff0c;因此只需要使用PasswordEncoder 不同实现就可以实现不同方式加密。 public interface PasswordEncoder {// 进行明文加密String encod…

AI大模型加速RPAxAI时代到来,谁会是RPA领域的杀手级应用?

GPT等AI大模型震撼来袭&#xff0c;基于RPA的超级自动化仍是最佳落地载体 对话弘玑CPO贾岿&#xff0c;深入了解国产RPA厂商对AI大模型的探索与实践 文/王吉伟 关于RPA已死的说法&#xff0c;在中国RPA元年&#xff08;2019年&#xff09;投资机构疯狂抢项目之时就已经有了。…

西北乱跑娃 -- centos7安装python3.8最全教程

Centos7安装Python3.8详细教程 安装编译相关工具 yum -y groupinstall "Development tools" yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel yum install …

java 内置锁

java 内置锁 1.java内置锁是一个互斥锁&#xff0c;也就说明最多只有一个线程能够获得该锁&#xff0c;当线程A获得锁时&#xff0c;线程B想要尝试获得锁的时候&#xff0c;必须等线程A释放锁&#xff0c;若线程A一直不释放锁&#xff0c;则线程B一直等待处于阻塞状态中。获取…

Java锁的区别:独占模式与共享模式

目录 前言&#xff1a; Java 独占模式的锁有哪些&#xff1f; 共享模式的锁有哪些&#xff1f; Java即是 独占模式又是共享模式的锁有哪些&#xff1f; 前言&#xff1a; 资源有两种共享模式&#xff0c;或者说两种同步⽅式&#xff1a; 独占模式&#xff08;Exclusive&am…

类图(类之间的关系)

一.概述 类图(Class diagram)是显示了模型的静态结构&#xff0c;特别是模型中存在的类、类的内部结构以及它们与其他类的关系等。类图不显示暂时性的信息。类图是面向对象建模的主要组成部分。在软件工程中&#xff0c;类图是一种静态的结构图&#xff0c;描述了系统的类的集合…

MySQL调优笔记——慢SQL优化记录(2)

今天调优的原因是&#xff0c;有一个统计报表业务&#xff0c;查询的时间太慢&#xff1b;同时由于数据库的压力是随机性的&#xff0c;这个业务的执行下限和上限相差近20倍&#xff1b;快的时候可以达到600ms&#xff0c;慢的时候有9秒之多&#xff1b; 接下来详细介绍&#x…

SOFA Weekly|SOFARPC 5.10.0 版本发布、SOFA 五周年回顾、Layotto 社区会议回顾与预告...

SOFA WEEKLY | 每周精选 筛选每周精华问答&#xff0c;同步开源进展 欢迎留言互动&#xff5e; SOFAStack&#xff08;Scalable Open Financial Architecture Stack&#xff09;是蚂蚁集团自主研发的金融级云原生架构&#xff0c;包含了构建金融级云原生架构所需的各个组件&am…

水电设计院信息管理系统1.0

水电设计公司信息管理系统软件使用说明书 代码太多就不贴了&#xff0c;请在我的资源里下载&#xff0c;已部署在企业进行试运行。https://download.csdn.net/download/weixin_44735475/87704302 目录 1.引言 1 2.项目背景 1 3.系统功能 2 3.1系统功能 2 3.2系统性能 2 3.3系…

精通 TensorFlow 2.x 计算机视觉:第二部分

原文&#xff1a;Mastering Computer Vision with TensorFlow 2.x 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【ApacheCN 深度学习 译文集】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 不要担心自己的形象&#xff0c;…

【洛谷】P1631 序列合并

【洛谷】 P1631 序列合并 题目描述 有两个长度为 N N N 的单调不降序列 A , B A,B A,B&#xff0c;在 A , B A,B A,B 中各取一个数相加可以得到 N 2 N^2 N2 个和&#xff0c;求这 N 2 N^2 N2 个和中最小的 N N N 个。 输入格式 第一行一个正整数 N N N&#xff1b; 第二…

湫湫系列故事——减肥记Ⅰ

文章目录 湫湫系列故事——减肥记Ⅰ程序设计程序分析湫湫系列故事——减肥记Ⅰ 【问题描述】 对于吃货来说,过年最幸福的事就是吃了,没有之一! 但是对于女生来说,卡路里(热量)是天敌啊! 资深美女湫湫深谙“胖来如山倒,胖去如抽丝”的道理,所以她希望你能帮忙制定一个食…

Omniverse Replicator的“Hello World”

核心功能——Replicator的“Hello World” 学习目标 本教程的目的是介绍基本的 Omniverse Replicator 功能&#xff0c;例如使用一些预定义的 3D 资产创建一个简单的场景&#xff0c;应用随机化&#xff0c;然后将生成的图像写入磁盘以进行进一步处理。 使用复制器 API 要运…

淌入客户市场的“深水区”,锐捷云桌面体验再升级

作者 | 曾响铃 文 | 响铃说 现阶段&#xff0c;云桌面的普惠价值随着行业应用的深化正在不断突显。 以教育为例&#xff0c;教育信息化建设已经跨过了从无到有的阶段&#xff0c;目前正面临着如何降本增效的问题。云桌面的应用&#xff0c;正在有效地解决这个问题。 在响铃…

Java中的null总结

日常工作&#xff0c;遇见几次null的语法报错&#xff0c;整理以下Java中null&#xff1a; &#x1f341; null是一个关键字&#xff0c;对大小写敏感&#xff0c;像public、static… &#x1f341; null是所有引用数据类型的默认值&#xff08;int默认0、boolean默认false…)…