当前位置: 首页 > 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();}}
}


http://www.mrgr.cn/news/100572.html

相关文章:

  • Miniconda Windows10版本下载和安装
  • Vue 3 vuedraggable 例子
  • linux 使用nginx部署vue、react项目
  • 【angular19】入门基础教程(三):关于angular里面的响应式数据入门使用
  • 【Linux实践系列】:进程间通信:万字详解命名管道实现通信
  • (八)RestAPI 毛子(Unit Testing)
  • 二极管钳位电路——Multisim电路仿真
  • Centos小白之在CentOS8.5中安装Rabbitmq 3.10.8
  • 【Keil5-开发指南】
  • 电路中的DGND、GROUND、GROUND_REF的区别,VREF、VCC、VDD、VEE和VSS的区别?
  • 在g2o中,顶点(Vertex)和边(Edge)插入到概率图的流程
  • 【Vue.js】组件数据通信:基于Props 实现父组件→子组件传递数据(最基础案例)
  • 练习普通话,说话更有节奏
  • day005
  • 架构风格对比
  • IEC 61850标准协议解读 2.基于Java的MMS实现
  • 怎么把Ubuntu系统虚拟环境中启动命令做成系统服务可以后台运行?
  • 安装qt4.8.7
  • QT6 源(58)篇一:阅读与注释 QString 这个类,先给出其应用举例
  • 通过深度学习推进增材制造:当前进展与未来挑战综述