JDBC
1.JDBC入门
1.1.JDBC的概述
- Java DataBase Connectivity Java(Java数据库的连接)。
- 目的是使用Java的代码来操作数据库。
- 需要使用JDBC(Java数据库连接)规范来操作数据库的数据。
1.2.JDBC的规范
- JDBC是一套接口规范。
- JDBC的实现类都是由各个数据库的生产商提供的实现类。
- 只要学会了JDBC的接口和方法,就可以实现Java代码操作任何数据库了。
1.3.驱动
- 数据传输的桥梁
- 驱动指的是各个数据库厂商提供的实现类。
- 需要来使用实现类,就需要导入MySQl(这里使用的是MySQL数据库,其他的数据库操作都一样,除了导入jar包不一样)提交的驱动jar包
- 需要导入mysql - connector - java - 8.0.19 - bin.jar
1.4.JDBC开发的入门步骤
- 加载驱动类(先导入开发jar包,驱动包)。
- 获取到连接(操作数据库,连接上数据库),过程中传入连接主机地址,用户名和密码。
- 执行一些SQL语句(执行查询的SQL语句)。
- 遍历结果集(查询的数据全部都封装到结果集中)。
- 释放资源(连接…)。
2.JDBC相关的接口和API(重要的方法必须掌握)
2.1.DriverManager类(驱动)
1.DriverManager
* 使用DriverManager来管理JDBC的驱动的实现类
2.作用
* 加载驱动
* static void registerDriver(Driver driver)
* 参数:传入的真正的参数其实是MySQL提 供Driver的类
* 传入的参数new Driver() 这种方式不是特别好
* 过于依赖某一个实现类
* 驱动的jar包会加载两次(通过看源代码)
* 解决上述的两个问题
* Class.forName("com.mysql.jdbc.Driver");
* 获取连接
* static Connection getConnection(String url, String user, String password)
* 参数有3个
* 第一个参数:jdbc:mysql://localhost:3306/SCOTT(背下来)
* jdbc ‐‐ 代表的主协议
* mysql ‐‐ 子协议(有可能变化的)
* localhost ‐‐ 主机
* 3306 ‐‐ 默认的端口号
* SCOTT ‐‐ 数据库
* 如果访问的是本地的自己的数据库,那么localhost:3306就可以省略不写
* mysql的命令 ‐uroot ‐proot
* JDBC简写:jdbc:mysql:///SCOTT
* 第二个参数:root(用户名)
* 第三个参数:root(密码)
3.总结
* 管理驱动的
* 作用
* 加载驱动
* Class.forName("com.mysql.jdbc.Driver");
* 获取连接
* getConnection("jdbc:mysql:///SCOTT","root","密码");
2.2.Connection接口(链接)
1.Connection
* 代表的数据库的连接,非常重要,并且连接比较稀有,用完一定要释放它
2.作用
* 能获取到执行SQL语句的对象(获取Statement接口)
* Statement createStatement() ‐‐ 获取到Statement接口
* PreparedStatement prepareStatement(String sql) ‐‐ 获取到PreparedStatement
接口,对象非常重要的,防止SQL注入的漏洞。
* 管理事务(没学过)
* void setAutoCommit(boolean autoCommit) ‐‐ 开启事务
* void commit() ‐‐ 提交事务
* void rollback() ‐‐ 回滚事务
3.总结
* 获取能执行SQL语句对象的方法
* Statement createStatement()
* PreparedStatement prepareStatement(String sql)
* 只需要知道Connection接口可以管理事务就可以了!!
2.3.Statement接口(能执行SQL语句)
1.Statement接口
* 能执行SQL语句的对象
2.作用
* 能执行SQL语句
* ResultSet executeQuery(String sql) ‐‐ 执行查询SQL语句的方法
* int executeUpdate(String sql) ‐‐ 能执行增删改的SQL语句
* 能执行批处理
* void addBatch(String sql) ‐‐ 把SQL语句添加到批处理中
* void clearBatch() ‐‐ 清除批处理
* int[] executeBatch() ‐‐ 执行批处理
3.总结
* 就是能执行SQL语句
* 作用
* 执行SQL语句
* 执行批处理
2.4.ResultSet接口(代表结果集)
1.ResultSet接口
* 代表的是结果集,执行的是查询的SQL语句,把查询的数据的表格封装到ResultSet接口中,通过遍历该接口,
获取到查询的结果!!
2.总结
* 封装数据
* ResultSet接口使用表格的方式来封装数据
* 内部维护一个游标,默认指向的是第一行数据之前
* 调用next()方法来向下移动游标,移动到某一行,获取该行的数据
* 注意:游标默认只能向下移动
* 获取值
* 根据字段的类型,调用不同的方法
* 例如
* 如果字段是int或者bigint
* getInt()或者getLong()
* 如果字段是varchar char类
* getString()
* 使用getObject()获取任何类型的数据,自己强转
* 获取数据的方法都是重载的
* getInt(int index) ‐‐ 通过下标值来取值,默认从1开始
* getInt(String s) ‐‐ 通过字段的名称来取值,比较常用的
2.5.释放资源(必须要做的)
1.连接等对象必须要释放
2.释放资源的代码一帮会在finally代码块中释放
* 一定会执行的
3,释放的代码的标准
if(conn != null){
try {
// 释放资源
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
JDBC连接MySQL数据库简单案例
mysql数据库:
版本:MySQL是8.5以上
package com.suntao.JDBC;
import java.sql.*;
public class MySQLJDBCDemo01 {
public static void main(String[] args) {
//把连接等在这里定义,为了最后关闭资源的时候能判断是否为空
Connection conn = null; //获取连接对象
Statement stmt = null; //创建执行对象
ResultSet rs = null; //创建结果集对象
try {
//1.加载数据库驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/SCOTT?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true","root","123456");
//3.创建一个执行对象,可以执行Sql语句
stmt = conn.createStatement();
//4.定义SQL语句
String sql = "select * from user";
//5.执行sql语句(返回值用结果集对象获取)
rs = stmt.executeQuery(sql);
//6.遍历结果(把数据库中多行数据打印出来)
while (rs.next()){
int id = rs.getInt("userId");
String name = rs.getString("name");
int age = rs.getInt("age");
System.out.println("用户id="+id+",用户姓名="+name+",用户年龄="+age);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
//关闭资源
try {
//先打开的后关闭
if(rs != null) {
rs.close();
}
if(stmt != null){
stmt.close();
}
if(conn != null){
conn.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
运行结果:
增删改查
package com.suntao.JDBC;
import java.sql.*;
public class MySQLJDBCUpdate {
public static void main(String[] args) {
//把获取连接,创建执行对象,结果集变量在这里定义,为了最后关闭资源的时候能判断是否为空
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
//1.加载数据库驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/SCOTT?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true","root","123456");
//3.创建执行对象执行sql程序
stmt = conn.createStatement();
//4.定义sql语句
//添加用户
String sqlInsert = "insert into user value ('5','tianqi','18')";
//修改用户信息
String sqlUpdate = "update user set name = 'zhangsi' where userId = 1";
//删除用户信息
String sqlDelete = "delete from user where userId = 2";
//查询添加后结果
String sqlSelect = "select * from user";
//5.执行sql语句
//添加
stmt.executeUpdate(sqlInsert);
//修改
stmt.executeUpdate(sqlUpdate);
//删除
stmt.executeUpdate(sqlDelete);
//查询
rs = stmt.executeQuery(sqlSelect);
//6.遍历打印结果集
while (rs.next()){
int id = rs.getInt("userId");
String name = rs.getString("name");
int age = rs.getInt("age");
System.out.println(id+" "+name+" "+ age);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
//关闭资源
try {
if(rs != null){
rs.close();
}
if(stmt != null){
stmt.close();
}
if(conn != null){
conn.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
结果: