当前位置: 首页 > news >正文

数据库- JDBC

标题目录

  • JDBC
    • 基本概念
      • JDBC 接口
      • JDBC 工作原理
    • JDBC API
      • JDBC工作过程
      • Driver 接口及驱动加载
      • Connection 接口
      • Statemen 接口
      • ResultSet 接口
      • PreparedStatement 接口

JDBC

基本概念

  • Java Database Connectivity:java访问数据库的解决方案
  • 希望用相同的方式访问不同的数据库,以实现与具体数据库无关的java操作界面
  • JDBC定义一套标准接口,即访问数据库的通用API,不同的数据库厂商根据各自数据库的特点去实现这些接口

JDBC 接口

  • 驱动管理器
    • DriverManager
  • 连接对象
    • Connection
    • DatabaseMetaData
  • SQL执行对象
    • Statement
    • PreparedStatement
    • CallableStatement
  • 查询结果集对象
    • ResultSet
    • ResultSetMetaData

JDBC 工作原理

  • JDBC定义接口
  • 数据库厂商实现接口
  • 程序员调用接口,实际调用的是底层数据库厂商的实现部分

JDBC API

JDBC工作过程

  1. 创建驱动,建立连接
  2. 创建语句执行对象
  3. 执行SQL语句
  4. 处理结果集
  5. 关闭连接

Driver 接口及驱动加载

  • 加载驱动类Driver
    • Driver是JDBC定义的接口,不同的数据库都提供了对应的实现类
    • 使用Class.forName(“驱动完全限定类”)方式加载驱动
    • 不同的数据库驱动类的完全限定名不同
  • 常见的数据库Driver实现类完全限定名
    • ORACLE:“oracle.jdbc.driver.OracleDriver”
    • MySQL:“com.mysql.cj.jdbc.Driver”
Class.forName("com.mysql.cj.jdbc.Driver");

Connection 接口

  • 使用驱动管理器与数据库建立连接
    • DriverManager是JDBC提供的类,用于与数据库建立连接
    • 建立连接时要指明数据库URL,用户名及密码
    • URL的格式:jdbc:subprotocol:subname
    • 不同的数据库URL格式不完全一致
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true","root", 		//用户名"root"			//密码
);        

Statemen 接口

  • Statement接口用于表示SQL语句执行对象
    • 通过Connection提供的方法createStatement()方法获取
    • boolean execute(String sql):可执行所有种类SQL,但通常用于执行DDL,如果执行的SQL语句返回了一个结果集则返回true,否则返回false
    • int executeUpdate(String sql):用于执行DML语句,返回值表示受 SQL 语句影响的行数
    • ResultSet executeQuery(String sql):用于执行DQL语句并获取查询结果集
  • 执行DDL语句

创建Userinfo表,包含id,username,password,nickname,age字段

Statement state = connection.createStatement();
String sql = "CREATE TABLE userinfo(\n" +"    id INT PRIMARY KEY AUTO_INCREMENT,\n" +"    username VARCHAR(30),\n" +"    password VARCHAR(30),\n" +"    nickname VARCHAR(30),\n" +"    age INT(3)\n" +")";
state.execute(sql);
  • 执行DML语句

向Userinfo表中插入一条记录

Statement state = connection.createStatement();
String sql = "INSERT INTO userinfo(username,password,nickname,age)\n" +"VALUES('张三','123456','阿三',22)";
int num = state.executeUpdate(sql);
if(num>0){System.out.println("插入成功");}

修改Userinfo表中一条记录

Statement state = connection.createStatement();
String sql = "UPDATE userinfo " +"SET password='666666' " +"WHERE username='张三'";
int num = state.executeUpdate(sql);
System.out.println(num>0?"修改成功":"修改失败");

删除Userinfo表中一条记录

Statement state = connection.createStatement();
String sql = "DELETE FROM userinfo " +"WHERE id=1";
int num = state.executeUpdate(sql);
System.out.println(num>0?"删除成功":"删除失败");

ResultSet 接口

  • JDBC提供的接口ResultSet
  • ResultSet表示查询结果集,主要方法:
方法功能
boolean next()结果集向下移动一条记录,如果存在则返回true,否则返回false
String getString(int index)获取该记录指定下标对应的String类型字段值
String getString(String name)获取该记录指定字段名对应的String类型字段值
int getInt(int index)获取该记录指定下标对应的int类型字段值
int getInt(String name)获取该记录指定字段名对应的int类型字段值
如上格式还有其他数据类型字段值的getXXX(…)方法分别通过下标和字段名获取对应字段值的操作
  • 执行DQL语句
try(Connection connection = DBUtil.getConnection();){Statement statement = connection.createStatement();String sql = "SELECT id,name,salary,title "+"FROM teacher";ResultSet rs = statement.executeQuery(sql);//遍历结果集while(rs.next()){int id = rs.getInt("id");String name = rs.getString("name");int salary = rs.getInt("salary");String title = rs.getString("title");System.out.println(id+","+name+","+salary+","+title);}} catch (SQLException e){e.printStackTrace();
}

PreparedStatement 接口

  • PreparedStatement用于执行预编译SQL语句
  • 预编译SQL
    • 预编译SQL可以使用占位符 " ? " 来表示需要使用的 " 值 "
    • 占位符内容仅表达需要使用的值,而不会影响SQL语义
    • 占位符不可以改变语义
  • 常用方法:
方法作用
setXxx(int parameterIndex, Xxx value)为指定位置的占位符设置具体的值,如 setInt、setString 等
executeQuery()执行查询语句,返回一个 ResultSet 对象
executeUpdate()执行插入、更新或删除语句,返回受影响的行数
execute()执行 SQL 语句,返回一个布尔值,表示是否返回了结果集

根据ID修改用户信息:密码,昵称,年龄:

public class JDBCDemo10 {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入用户ID:");String id = scanner.nextLine();System.out.println("请输入密码:");String password = scanner.nextLine();System.out.println("请输入昵称:");String nickname = scanner.nextLine();System.out.println("请输入年龄:");int age = scanner.nextInt();try (Connection connection = DBUtil.getConnection()) {String sql = "UPDATE userinfo SET password=?,nickname=?,age=? "+"WHERE id="+"'"+id+"'";PreparedStatement ps = connection.prepareStatement(sql);ps.setString(1,password);ps.setString(2,nickname);ps.setInt(3,age);int num = ps.executeUpdate();System.out.println(num>0?"修改成功":"修改失败");}catch(SQLException e){e.printStackTrace();}}
}

相关文章:

  • LeetCode 热题 100_最小路径和(92_64_中等_C++)(多维动态规划)
  • React:封装一个评论回复组件
  • 使用JDK的数据校验和Spring的自定义注解校验前端传递参数的两种方法
  • 2025吃鸡变声器软件推荐
  • COMEM光纤温度传感器Optocon:可靠稳定的温度监测方案
  • (002)Excel 使用图表,统计
  • 阅读MySQL实战45讲第11天
  • PCL实时动态加载显示点云功能以及laslib配置
  • Python项目-支持自然语言处理
  • 湖北理元理律师事务所:债务优化的法律机制与民生实践
  • 【阿里云大模型高级工程师ACP习题集】2.6.用插件扩展答疑机器人的能力边界
  • AI与IT协同的典型案例
  • C++——哈希表
  • 【C++】类和对象(4)
  • 线段树底层逻辑探讨-P3373-P1438
  • python 线程池顺序执行
  • 夜莺监控V8(Nightingale)二进制部署教程(保姆级)
  • BZOJ.疯狂的馒头
  • 单片机-89C51部分:7、中断
  • 无刷空心杯电机及机器人灵巧手的技术解析与发展趋势
  • 大学男生被捉奸后将女生推下高楼?桂林理工大学辟谣
  • 牛市早报|国家发改委:将推出做好稳就业稳经济推动高质量发展若干举措
  • 第二部以“法典”命名的法律!生态环境法典编纂迈出“关键步”
  • 持续更新丨伊朗官员:港口爆炸事件已致5人死亡
  • 广西给出最后期限:6月30日之前主动交代问题可从宽处理
  • 明查|把太平洋垃圾污染问题甩锅中国,特朗普用的是P过的图