「这是我参与2022首次更文挑战的第7天,活动详情查看:2022首次更文挑战」。
前言
大家好,我是程序猿小白 GW_gw,很高兴能和大家一起学习进步。
以下内容部分来自于网络,如有侵权,请联系我删除,本文仅用于学习交流,不用作任何商业用途。
摘要
本文主要介绍JDBC的基本概念和使用,以及JDBCUtils的基本范例。
JDBC
- JDBC的基本概念
JDBC(Java DataBase Connectivity) 实际上是一套操作所有关系型数据库的规则,即接口。各个数据库厂商提供对应的数据库驱动jar包来提供接口的实现类实现具体操作。
-
JDBC的基本使用流程
- 导入对应的数据库驱动jar包。
- 注册驱动。
- 获取数据库连接对象Connection。
- 定义sql语句。
- 获取执行sql语句的对象Statement。
- 执行sql语句,接收返回结果。
- 处理返回结果。
- 释放资源。
使用JDBC要先学习以下几个类。
1. DriverManager
DriverManager类的功能:
-
注册驱动。
1. Class.forName("com.mysql.cj.jdbc.Driver"); 2. DriverManager.registerDriver(new Driver());
实际上两者没有什么区别,前者实际上调用了后者(调用代码如下),mysql5之后可以省略注册驱动的步骤。
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
- 获取数据库连接。
public static Connection getConnection(String url,String user, String password)
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db_test?serverTimezone=Asia/Shanghai&useSSL=false", "root", "123456");
参数解释:
-
url:指定连接的路径。
eg:"jdbc:mysql://localhost(ip地址):3306(端口号)/db_test(数据库名称)?serverTimezone=Asia/Shanghai(设置时区)&useSSL=false(不使用SSL)"
-
user:数据库用户名。
-
password:用户密码。
2. Connection
Connection类的功能:
-
获取执行sql语句的对象
Statement statement = connection.createStatement(); -
管理事务
-
开启事务 setAutoCommit(boolean autoCommit),参数为false则为开启事务。
-
提交事务 commit()
-
回滚事务 rollback()
-
3. Statement
Statement类的功能:
执行sql语句
boolean execute(String sql)
执行给定的SQL语句,这可能会返回多个结果。
int executeUpdate(String sql)
执行给定的SQL语句,这可能是 INSERT , UPDATE ,或 DELETE语句,或者不返回任何内容,如SQL DDL语句的SQL语句。 返回值是影响的行数。
ResultSet executeQuery(String sql)
执行给定的SQL语句,该语句返回单个 ResultSet对象。
4. ResultSet
保存数据库的查询结果表。
ResultSet对象保持一个游标指向其当前的数据行。 最初,游标标位于第一行之前,即表头行。使用next方法将光标移动到下一行,并且由于在ResultSet对象中没有更多行时返回false ,因此可以在while循环中使用循环来遍历结果集。
boolean next()
将光标从当前位置向前移动一行。
boolean first()
将光标移动到此 ResultSet对象中的第一行。
获取每一列数据,根据列的数据类型使用相对应get方法。
boolean getBoolean(int columnIndex)
检索当前行中指定列的值 ,当前列是boolean类型。编号从1开始。
boolean getBoolean(String columnLabel)
检索当前行中指定列的值 当前列是boolean类型。
遍历resultSet。
【实例展示】
resultSet = statement.executeQuery(sql);
while(resultSet.next()){
int id = resultSet.getInt(1);
String name = resultSet.getString("name");
System.out.println(id +"----"+name);
}
//最后关闭资源
if(resultSet!=null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
5. JDBCUtils工具类
import java.io.FileReader;
import java.io.IOException;
import java.sql.*;
import java.util.Objects;
import java.util.Properties;
public class JdbcUtils {
private static String url;
private static String user;
private static String password;
/*
读取资源文件
*/
static{
//创建Properties集合
Properties properties = new Properties();
try {
String path = Objects.requireNonNull(JdbcUtils.class.getClassLoader().getResource("jdbc.properties")).getPath();
//加载文件
properties.load(new FileReader(path));
//获取数据
url = properties.getProperty("url");
user = properties.getProperty("user");
password = properties.getProperty("password");
String driver = properties.getProperty("driver");
Class.forName(driver);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 数据库连接
* @return 返回数据库连接对象
* @throws SQLException 抛出sql异常
*/
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,user,password);
}
/**
* 释放资源
* @param statement 执行sql语句的对象
* @param connection 数据库连接对象
*/
public static void close(Statement statement, Connection connection){
if(statement!=null){
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 释放资源
* @param resultSet 数据库结果集
* @param statement 执行sql语句的对象
* @param connection 数据库连接对象
*/
public static void close(ResultSet resultSet, Statement statement, Connection connection){
if(resultSet!=null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
close(statement, connection);
}
}
jdbc.properties
url=jdbc:mysql://localhost:3306/db_test?serverTimezone=Asia/Shanghai&useSSL=false
user=root
password=123456
driver=com.mysql.cj.jdbc.Driver
6. PreparedStatement
PreparedStatement是Statement的子接口,能有更安全的sql,有效的防止sql注入,并且效率更高,实际开发中常使用此接口。
在原sql语句中,使用?占位符来代替实际参数。
String sql = "select * from user where username = ? and password= password(?)";
【实例展示】
preparedStatement = connection.prepareStatement(sql);
//给占位符赋值,第一个参数代表占位符位置,第二个参数代表占位符的值。
preparedStatement.setString(1,username);
preparedStatement.setString(2,password);
//和Statement的sql执行语句不同的是,不需要再使用参数。
resultSet = preparedStatement.executeQuery();
7. 使用JDBC操控事务
使用Connection对象来管理事务。
- 开启事务 connection.setAutoCommit(boolean auotCommit):设置参数为false,即为开启事务,在进行sql语句执行之前调用。
- 提交事务 connection.commit(),在执行完所有的sql语句后调用。
- 回滚事务 rollback(),在catch中调用。
小结
以上就是关于JDBC的一些基本概念和基本使用,以及JDBCUtils的小范例,希望对读者有所帮助,如有不正之处,欢迎留言指正。