java连接数据库实现多功能查询
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* およそ神
*/
public class DbUtils {
private static final String DRIVER = "com.mysql.cj.jdbc.Driver";
private static final String URL = "jdbc:mysql://127.0.0.1:3306/fan?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai";
private static final String USER ="root";
private static final String PASSWORD = "root";
//2.注册驱动
static{
try {
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//3.提供连接数据库的方法
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(URL, USER, PASSWORD);
}
//4.通用的关闭连接,释放资源的方法
public static void closeAll(Connection connection, PreparedStatement preparedStatement, ResultSet resultSet) {
//ctrl + alt + t, 选择这三行close的代码,选择try - catch将代码包裹
try {
//关闭时的顺序: resultSet > preparedStatement -> connection
if (resultSet != null) resultSet.close();
if (preparedStatement != null) preparedStatement.close();
if (connection != null) connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
//5.通用的增、删、改的方法
public static int genericDML(String sql, Object... params) {
//注意:此处的connection和preparedStatement需要提升作用域,
// 否则在finally中无法访问到try{}中的connection和preparedStatement
Connection connection = null;
PreparedStatement preparedStatement = null;
try{
//第一步:获取与数据库的连接
connection = getConnection();
//第二步:预处理SQL语句
preparedStatement = connection.prepareStatement(sql);
//第三步:为SQL语句参数赋值
if (params != null) {
for (int i = 0; i < params.length; i++) {
Object param = params[i];
preparedStatement.setObject(i + 1, param);
}
}
//第四步:执行SQL语句,得到数据库受影响的行数,最终返回结果
return preparedStatement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
closeAll(connection,preparedStatement,null);
}
return 0;
}
/**
* <p>通用的查询方法</p>
* <p>根据SQL查询的列名组装为Map集合</p>
* <p>列名为Map集合的键,值为列对应的值</p>
* <p>每一行数据组装为一个Map集合</p>
* @param sql
* @param params
* @return sql查询得到的所有数据
*/
public static List<Map<String, Object>> genericQuery(String sql, Object... params) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
List<Map<String, Object>> list = new ArrayList<>();//用来装所有数据的集合
try{
//第一步:建立连接
connection = getConnection();
//第二步:预处理SQL语句
preparedStatement = connection.prepareStatement(sql);
//第三步:给SQL语句中的参数赋值
preparedSql(preparedStatement,sql, params);
//第四步:执行sql语句,得到结果集
resultSet = preparedStatement.executeQuery();
//第五步:获取执行的SQL语句的元数据
ResultSetMetaData metaData = resultSet.getMetaData();
//第六步:获取执行的SQL语句查询的列的个数
int columnCount = metaData.getColumnCount();
//第七步:循环结果集,从结果集中获取每一行的数据
while (resultSet.next()) {
//每次循环,移动指针到当前行,一行数据封装到一个Map集合中
Map<String, Object> row = new HashMap<>();
for (int i = 0; i < columnCount; i++) {
//依次取出每一列的列名 键值
String columnLabel = metaData.getColumnLabel(i + 1);
//取出列所对应的值
Object value = resultSet.getObject(i + 1);
row.put(columnLabel, value);
}
//将一行数据的map集合添加到代表整张表的list集合中
list.add(row);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
closeAll(connection,preparedStatement,resultSet);
}
return list;
}
private static void preparedSql(PreparedStatement preparedStatement,String sql, Object[] params) throws SQLException {
//第三步:给参数赋值
if (params != null) {
for (int i = 0; i < params.length; i++) {
Object param = params[i];
preparedStatement.setObject(i + 1, param);
}
}
}
}