数据库的 CRUD的通用操作
JDBC的基本操作
为了使代码复用,提高开发效率,设计JDBC数据库的增删改查非常有必要。
JDBC 操作数据步骤一般分为如下五个步骤:
一、加载数据库驱动类
Class.forName("com.mysql.cj.jdbc.Driver");
二、建立连接(Connection)
Connection connection = DriverManager.getConnection(url,user,password);
三、创建用于向数据库发送 SQL 的 PrepareStatement 对象,并发送 sql
PrepareStatement statement = connection.PrepareStatement(sql);
四、从结果集的 ResultSet 中取出返回数据。
ResultSet resultSet = statement.excuteQuery();
五、关闭相关资源,并释放内存
*.close()
使用Properties对象
Properties 对象可以保存了一组关键数值。它通过调用 getConnection() 方法,将驱动程序属性传递给驱动程序。
在根目录(位置可以任意)新建一个jdbc.properties
文件
mysql8需要设置时区,有cj目录,mysql5没有。时区可设置为GMT8表示东八区
url=jdbc:mysql://58.42.239.163:3306/jdbc?serverTimezone=Asia/Shanghai&characterEncoding=UTF8&useSSL=false
user=star
password=Star@123456
说明:
-
Properties prot = new Properties();
创建配置文件对象,或者使用IO流读取
-
InputStream input = JDBC1.class.getClassLoader().getResourceAsStream("jdbc.properties");
通过loader加载配置文件
-
prot.load(input);
通过输入流读取配置文件信息
-
prot.getProperty("url")
通过getXXX()读取配置数据
增删改查工具类
加载数据库驱动类
通过Class.forName
反射加载mysql8驱动类
因为每次对数据库操作都会加载驱动类,通过使用static
代码块,可以直接在类加载的时候就加载,只执行一次,就不用每次都去加载
public class JDBCUtility {
//加载mysql驱动类
static {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
建立连接(Connection)
将连接封装成工具方法
/**
* 获取连接
*
* @return 返回得到创建的连接
*/
public static Connection getConnection() {
Properties properties = new Properties();
Connection connection = null;
try (
FileInputStream fis = new FileInputStream("jdbc.properties");
) {
properties.load(fis);
connection = DriverManager.getConnection(properties.getProperty("url"), properties);
} catch (Exception e) {
e.printStackTrace();
}
return connection;
}
关闭connection和statement
重载三个Close()
方法,在使用完资源后,调方法关闭资源
/**
* 关闭connection连接
*
* @param connection 连接
*/
public static void Close(Connection connection) {
if (connection != null) {
try {
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
/**
* 关闭statement连接
*
* @param statement 连接
*/
public static void Close(Statement statement) {
if (statement != null) {
try {
statement.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
/**
* 关闭connection和statement连接
*
* @param connection 连接
*/
public static void Close(Connection connection, Statement statement) {
Close(statement);
Close(connection);
}
增删改操作的通用代码
传递需要执行的sql语句,参数可以选择满足条件的参数
PrepareStatement是预编译,一次编译,多次执行,提高效率,sql条件使用”?“可以防止sql注入问题
/**
* 增删改的通用操作
*
* @param sql 需要执行的sql语句
* @param params 条件参数
* @return 返回受影响的行数
*/
public static int executeUpdate(String sql, Object... params) {
Connection connection = getConnection();
PreparedStatement statement = null;
int rows = -1;
if (connection == null) {
return rows;
}
try {
connection.setAutoCommit(false);
statement = connection.prepareStatement(sql);
for (int i = 0; i < params.length; i++) {
statement.setObject(i + 1, params[i]);
}
rows = statement.</