数据库- JDBC
标题目录
JDBC
基本概念
- Java Database Connectivity:java访问数据库的解决方案
- 希望用相同的方式访问不同的数据库,以实现与具体数据库无关的java操作界面
- JDBC定义一套标准接口,即访问数据库的通用API,不同的数据库厂商根据各自数据库的特点去实现这些接口
JDBC 接口
- 驱动管理器
- DriverManager
- 连接对象
- Connection
- DatabaseMetaData
- SQL执行对象
- Statement
- PreparedStatement
- CallableStatement
- 查询结果集对象
- ResultSet
- ResultSetMetaData
JDBC 工作原理
- JDBC定义接口
- 数据库厂商实现接口
- 程序员调用接口,实际调用的是底层数据库厂商的实现部分
JDBC API
JDBC工作过程
- 创建驱动,建立连接
- 创建语句执行对象
- 执行SQL语句
- 处理结果集
- 关闭连接
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();}}
}