Java – JDBC – 数据库基本操作
简介
JDBC全称 Java DataBase Connectivity . 是Java用于数据库连接,数据库操作的驱动。
JDBC的本质其实是Java官方定义的一套操作所有关系型数据库的接口集,通过不同数据库厂商对JDBC接口集开发实现类,从而使用JDBC一次编码,可以统一操作不同数据库。
基础使用
// 使用反射导入 Mysql 的 JDBC 驱动到内存中,在新的版本中,使用com.mysql.cj.jdbc.Driver 而且不需要再手动调用这个方法加载,会自动加载
Class.forName("com.mysql.cj.jdbc.Driver");
// 调用 DriverManager.getConnection 连接Mysql数据库
Connection sqlConn = DriverManager.getConnection("jdbc:mysql:///jdbc", "root", "tzminglove");
// 定义一个 sql 语句
String sql = "update user set money=2000 where id = 1";
// 创建一个sql记录集管理对象
Statement sqlStatement = sqlConn.createStatement();
// sql记录集管理对象执行 sql 语句,会返回受影响的行数
int count = sqlStatement.executeUpdate(sql);
System.out.println(count);
// 释放记录集
sqlStatement.close();
// 关闭数据连接
sqlConn.close();
DriverManager类
驱动管理对象,用于管理一组JDBC驱动程序的基础服务类
功能:
1.注册驱动 registerDriver()
在使用反射调用 com.mysql.cj.jdbc.Driver 时,Driver 类里有一个静态代码块,随着反射调用时会自动执行
static {
try {
// 静态代码块处调用了DriverManager注册方法
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
所以实际上,注册驱动的,是 DriverManager 类在处理
2.获取数据库连接
使用DriverManager.getConnection() 方法获取数据库
static Connection getConnection(String url)
static Connection getConnection(String url, Properties info)
// 使用连接 url 和数据库账号密码进行连接数据库,返回 Connection 对象
static Connection getConnection(String url, String user, String password)
url 中根据不同的数据库类型,url 定义也不同,如果是 mysql 的数据库,那么使用
jdbc:mysql://ip地址:端口/数据库名?参数键值对...
比如
jdbc:mysql://127.0.0.1:3306/db
如果是本地的数据库,还可以不写数据库ip地址
jdbc:mysql:///db
Connection类
数据库连接对象接口,它是一个数据库连接之后对于某个数据库连接的管理接口,一个数据库的连接,就是一个 Connection 方法
功能
1.获取执行 sql 的对象
// 创建一个sql记录集对象,用于管理sql执行和记录的类
Statement createStatement()
PreparedStatement prepareStatement(String sql)
2.管理事务
开启事务
// JDBC 默认开启自动事务提交,所以如果需要手动事务提交,需要关闭
void setAutoCommit(boolean autoCommit)
调用方法设置参数为 false ,即开启事务
开启事务后,我们就可以对数据库进行一系列的操作,但是这样的操作并不是实时写进数据库中的,而是在事务中暂存,目的是提防在数据库操作过程中出现异常。
提交事务
// 把一些sql执行语句进行提交修改,如果修改成功则通过
void commit()
如果在上述的数据库操作中没有出现异常,调用 commit() 提交事务后,数据库才会最终修改。如果上述数据库操作中出现异常了,就会被 try..cache 捕获异常,这时应该把数据库的操作进行回滚。
回滚事务
// 如果通过事务提交的任务执行失败,则会回滚事务
void rollback()
回滚数据库操作后,上述一系列的数据库操作将无效还原。
Statement类
执行sql的记录集对象接口,它其实就是一个静态sql语句的记录集管理对象,用于管理sql执行和数据结果的接口。
// 执行任意的sql语句,这个不常用
boolean execute(String sql)
// 执行DML(update,insert,delete)操作都可以调用它进行操作,返回影响行数
int executeUpdate(String sql)
// 执行 DQL(select) 操作,都可以调用它来进行,用于查询数据库,会返回一个
// ResultSet 对象
ResultSet executeQuery(String sql)
ResultSet类
ResultSet 类是用于调用executeQuery 方法后,返回的数据库数据表集的类
ResultSet 对象默认在内存中会存在着一个 游标 ,用于指定当前查询数据库表中的记录位置,默认在第 0 行(第一行数据在第 1 行),使用 next() 方法,使 游标 往下移动一行,再进行读取数据。
// 使游标往下移动一行数据行,如果能移动则返回 true ,如果不能移动则返回 false
boolean next()
同时,可以调用 ResultSet 对象的 getXxx() 系列方法,对数据表中的字段进行读取
get 方法有非常多,但都只有两种重载方式
// 通过传入数据表的列数来定位字段,列数从 1 开始
getXxx(int columnIndex)
// 通过传入数据表的列名来定位字段
getXxx(String columnName)
getXxx 系列的方法有非常多,这里列举部分常用的方法
.getString();
.getInt();
.getBoolean();
.getByte();
.getDate();
.getFloat();
.getDouble();
.getLong();
.getTimestamp();
.getTime();
.getArray();
使用循环取出查询数据
ResultSet resultSet = sqlStatement.executeQuery(sql);
while (resultSet.next()){
// 取出等一列的字段数据
resultSet.getInt(1);
// 取出 字段名为 username 的字段数据
resultSet.getString("username");
resultSet.getString("createTime");
}
// 取出完数据后要释放资源
resultSet.close();
PreparedStatement类
执行sql的对象接口,PreparedStatement 是一个升级的Statement类。
Statement 类中是使用了静态sql语句执行查询的,这样会出现sql注入的问题(目前是),于是Java提供了一种动态的sql语句构建Statement类。
定义PreparedStatement
PreparedStatement 需要提前接收一个原始的sql语句,语句中的查询字段使用 ? 替代。
// 连接 MySQL 数据库
Connection connection = DriverManager.getConnection("jdbc:mysql:///jdbc", "root", "tzminglove");
// 预先构造一个原始的sql语句,查询的字段使用 ? 代替
String sql = "select count(username) from user where username = ? and password = ?";
// 数据库连接对象 创建一个 PreparedStatement ,并传入原始sql
PreparedStatement ps = connection.prepareStatement(sql);
对sql进行字段匹配
配置好原始SQL语句后,需要在PreparedStatement 中设置 ? 替代符为真实的数据,PreparedStatement 提供了非常多的 setXxx() 系列方法
setXxx(int index, <T> data);
参数1:指的是要设置第几个 ? 替代符的值
参数2:指的是要设置的真正值
String sql = "select count(username) from user where username = ? and password = ?";
PreparedStatement ps = connection.prepareStatement(sql);
// 设置第一个 ? 的值为 username
ps.setString(1, username);
// 设置第二个 ? 的值为 password
ps.setString(2, password);
执行查询
PreparedStatement 类中因为前期已传入了原始sql语句,因此在执行查询时,是不需要传入sql参数的。
ResultSet executeQuery()
// 直接调用,返回 ResultSet 对象。
ResultSet resultSet = ps.executeQuery();
在项目中,多数都会使用PreparedStatement类代替不安全的Statement类。
共有 0 条评论