JDBC方式重连MySQL数据库-进行操作
采用JBDC的方式,重新连接数据库,对数据库进行增删改查操作
JdbcUtil工具类
package com.paas.process.utils;
import java.sql.*;
import java.util.List;
/**
* MySQL
* Jdbc工具类
* 用于切换数据源,对数据库进行操作
* @author scz
* @Date 2021-04-06
*/
public class JdbcUtil {
/**
* 连接
*/
public static Connection connection = null;
/**
* 预编译通道
*/
public static PreparedStatement preparedStatement = null;
/**
* 返回结果
*/
public static ResultSet resultSet = null;
/**
* 只写了 MySQL的
*/
static {
try {
// 加载MySql的驱动类
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 建立 Connection
* @param url 数据库url
* @param userName 用户名
* @param pwd 密码
* @return Connection
*/
private static Connection getConnection(String url, String userName, String pwd){
try {
// 建立数据库连接
connection = DriverManager.getConnection(url, userName, pwd);
} catch (Exception e) {
e.printStackTrace();
}
return connection;
}
/**
* 采用预编译通道
* @param url 数据库url
* @param userName 用户名
* @param pwd 密码
* @param sql sql
* @return PreparedStatement
*/
private static PreparedStatement getPreparedStatement(String url, String userName, String pwd,String sql){
try {
// 获取连接
connection = getConnection(url,userName,pwd);
// 预编译通道
preparedStatement = connection.prepareStatement(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return preparedStatement;
}
/**
* 不带参数的 查询 适合查询所有数据
* @param url 数据库url
* @param userName 用户名
* @param pwd 密码
* @param sql sql
* @return 结果集
*/
public static ResultSet queryAll(String url,String userName,String pwd,String sql){
try {
// 获取 预编译通道
preparedStatement = getPreparedStatement(url, userName, pwd,sql);
// 执行sql 得到结果
resultSet = preparedStatement.executeQuery();
} catch (Exception e) {
e.printStackTrace();
}
return resultSet;
}
/**
* 带参数的查询
* @param url 数据库url
* @param userName 用户名
* @param pwd 密码
* @param sql sql
* @param params 参数
* @return 结果集
*/
public static ResultSet queryByParam(String url,String userName,String pwd,String sql,List<String> params){
try {
// 获取预编译通道
preparedStatement = getPreparedStatement(url, userName, pwd, sql);
// 遍历参数
if (params != null && params.size() > 0){
for (int i = 0; i < params.size(); i++) {
// 参数对应占位符 占位符从1开始
preparedStatement.setObject((i + 1), params.get(i));
}
}
// 得到结果
resultSet = preparedStatement.executeQuery();
} catch (Exception e) {
e.printStackTrace();
}
return resultSet;
}
/**
* 增删改 的操作 不带参数
* @param url 数据库url
* @param userName 用户名
* @param pwd 密码
* @param sql sql
*/
public static void update(String url,String userName,String pwd,String sql){
try {
// 获取预编译通道
preparedStatement = getPreparedStatement(url,userName,pwd,sql);
// 执行sql 返回结果为 sql结果的总条数 比如:新增一条 返回结果为1 如果不为1 那么新增失败
// 这里暂时不用结果 一般来说需要
preparedStatement.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 增删改 的操作 带参数
* @param url 数据库url
* @param userName 用户名
* @param pwd 密码
* @param sql sql
* @param params 参数
*/
public static void update(String url,String userName,String pwd,String sql,List<String> params){
try {
// 获取预编译通道
preparedStatement = getPreparedStatement(url,userName,pwd,sql);
// 遍历参数 使之对应占位符
if (params != null && params.size() > 0) {
for (int i = 0; i < params.size(); i++) {
preparedStatement.setObject((i + 1), params.get(i));
}
}
// 执行sql
preparedStatement.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 增删改 批量的操作 带参数
* 批量
* @param url 数据库url
* @param userName 用户名
* @param pwd 密码
* @param sql sql
* @param params 参数
*/
public static void updateBatch(String url,String userName,String pwd,String sql,List<Object[]> params){
try {
// 获取预编译通道
preparedStatement = getPreparedStatement(url,userName,pwd,sql);
// 遍历参数 最外层
if (params != null && params.size() > 0) {
for (Object[] values : params) {
// 获取内层参数
// 遍历内层参数 并对应占位符
if (values != null && values.length > 0) {
for (int i = 0; i < values.length; i++) {
preparedStatement.setObject((i + 1), values[i]);
}
}
// 加入批量操作
preparedStatement.addBatch();
}
}
// 遍历结束 执行sql 进行批量操作
preparedStatement.executeBatch();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 关闭所有通道
* 执行完操作 别忘记关闭通道 一般在finally中执行
*/
public static void closeAll(){
try {
// 关闭结果集
if (resultSet != null) {
resultSet.close();
}
// 关闭预编译通道
if (preparedStatement != null) {
preparedStatement.close();
}
// 关闭连接
if (connection != null) {
connection.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
测试实例
public void test(){
// 数据库信息
String url = "jdbc:mysql://127.0.0.1:3306/source_db?useUnicode=true&characterEncoding=utf8&useSSL=false";
String userName = "root";
String pwd = "12345";
String sql = "select * from user";
// 一 : 无参数的 查询
ResultSet resultSet = JdbcUtil.queryAll(url, userName, pwd, sql);
try {
// 遍历结果
while (resultSet.next()) {
String name = resultSet.getString("name");
Integer age = resultSet.getInt("age");
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
// 关闭 别忘了
JdbcUtil.closeAll();
}
// 二 : 有参数的方法
String sqlByParam = "select * from user where id=?";
List<String> params = new ArrayList<>();
params.add("1");
// 得到结果
ResultSet resultSet1 = JdbcUtil.queryByParam(url, userName, pwd, sqlByParam, params);
// 结果操作
// 三 : 增删改
// 以上是查询 一般要返回结果
// 增删改的话 我这没有返回结果 需要的自己加
// 有单条的 有批量的
String insertSql = "insert into user values (?,?)";
// 参数
List<String> paramsList = new ArrayList<>();
paramsList.add("张三");
paramsList.add("20");
// 新增
JdbcUtil.update(url, userName, pwd, sqlByParam, paramsList);
// 批量操作
List<Object[]> paramBatch = new ArrayList<>();
paramBatch.add(new Object[]{"李四","21"});
paramBatch.add(new Object[]{"王五","22"});
paramBatch.add(new Object[]{"老六","23"});
// 批量新增
JdbcUtil.updateBatch(url, userName, pwd, sqlByParam, paramBatch);
/**
* 其余操作 可以自行测试
* 若有BUG 自己可以更改
*/
}