使用前提:
使用本类中的方法需要定义一个函数式接口IRowMapper,如下:
import java.sql.ResultSet;
@FunctionalInterface
public interface IRowMapper {
void rowMapper(ResultSet resultSet);
}
DBUtil源代码:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 数据库工具类
*
* @author 肥胖的企鹅
*/
public class DBUtil {
static {
try {
Class.forName("com.mysql.jdbc.Driver");//加载驱动
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 获取数据库链接
*
* @author 肥胖的企鹅
*/
private static Connection connect(){
try {
DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test", "root", "root");
}catch (SQLException e) {
e.printStackTrace();
}
return null;
}
/**
* 修改数据
*
* @author 肥胖的企鹅
*/
public static boolean upDate(String sql) {
Connection connection =null;
Statement statement = null;
connect();
try {
connection=connect();
statement = connection.createStatement();//创建语句
int result = statement.executeUpdate(sql);//执行语句
return result > 0;//返回结果
} catch (Exception e) {
e.printStackTrace();
}finally {
close(statement,connection);//释放资源
}
return false;
}
/**
* 修改数据
*
* @author 肥胖的企鹅
*/
public static boolean upDate(String sql,Object ... params) {
Connection connection =null;
Statement statement = null;
try {
connection=connect();
PreparedStatement preparedStatement = connection.prepareStatement(sql);//创建语句
for (int i = 1; i <= params.length; i++) {
preparedStatement.setObject(i,params[i-1] );//执行语句
}
int effectRows = preparedStatement.executeUpdate();
return effectRows > 0;//返回结果
} catch (Exception e) {
e.printStackTrace();
}finally {
close(statement,connection);//释放资源
}
return false;
}
/**
* 判断是否存在
*
* @author 肥胖的企鹅
*/
public static boolean exist(String sql) {
class RowMapper implements IRowMapper{
boolean state=false;
@Override
public void rowMapper(ResultSet resultSet) {
try {
if(resultSet.next()) {
state = true;
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
RowMapper rowMapper = new RowMapper();
select(sql,rowMapper);
return rowMapper.state;
}
/**
* 判断数据是否存在
*
* @author 肥胖的企鹅
*/
public static boolean exist(String sql,Object ... params) {
class RowMapper implements IRowMapper{
boolean state=false;
@Override
public void rowMapper(ResultSet resultSet) {
try {
state = resultSet.next();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
RowMapper rowMapper = new RowMapper();
select(sql,rowMapper,params);
return rowMapper.state;
}
/**
* 查询数据
*
* @author 肥胖的企鹅
*/
public static void select(String sql,IRowMapper rowMapper) {//参数传递
Connection connection =null;
Statement statement = null;
ResultSet resultSet = null;
try {
connection=connect();
statement = connection.createStatement();//创建语句
resultSet = statement.executeQuery(sql);//执行语句
rowMapper.rowMapper(resultSet);
} catch (Exception e) {
e.printStackTrace();
}finally {//释放资源
close(statement,resultSet,connection);
}
}
/**
* 查询数据
*
* @author 肥胖的企鹅
*/
public static void select(String sql,IRowMapper rowMapper,Object ... params) {
Connection connection =null;
ResultSet resultSet = null;
PreparedStatement preparedStatement = null;
try {
connection = connect();
preparedStatement = connection.prepareStatement(sql);//创建语句
for(int i =1;i<=params.length;i++) {
preparedStatement.setObject(i, params[i-1]);
}
resultSet = preparedStatement.executeQuery();//preparedStatement对象中已经存在sql语句,无需再次赋值
rowMapper.rowMapper(resultSet);
} catch (Exception e) {
e.printStackTrace();
}finally {//释放资源
close(preparedStatement,resultSet,connection);
}
}
/**
* 批处理方法
*
* @author 肥胖的企鹅
*/
public static boolean batch(String ... sqls) {
Connection connection=null;
Statement statement = null;
try {
Class.forName("com.mysql.jdbc.Driver");
connection = connect();
connection.setAutoCommit(false);//必须在创建语句之前
statement = connection.createStatement();
for (String sql : sqls) {
statement.addBatch(sql);//将给定的 SQL 命令添加到此 Statement 对象的当前命令列表中。通过调用方法 executeBatch 可以批量执行此列表中的命令。
}
statement.executeBatch();//将一批命令提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。
connection.commit();
return true;
} catch (Exception e) {
e.printStackTrace();
if (connection!=null) {//避免空指针异常
try {
connection.rollback();//如果异常则回滚,撤销缓存中的所有语句
} catch (Exception e1) {
e1.printStackTrace();
}
}
} finally {
close(statement, connection);
}
return false;
}
/**
* 批处理方法
*
* @author 肥胖的企鹅
*/
public static boolean batch(String sql,Object []... params) {//注意这种防SQL注入的方法仅适用于使用同一个SQL语句模板添加多个不同数据
Connection connection=null;
PreparedStatement preparedStatement = null;
try {
Class.forName("com.mysql.jdbc.Driver");
connection = connect();
connection.setAutoCommit(false);//必须在创建语句之前
preparedStatement = connection.prepareStatement(sql);
for(int i=0;i<params.length;i++) {
for(int j=1;j<=params[i].length;j++) {
preparedStatement.setObject(j,params[i][j-1]);
}
preparedStatement.addBatch();
}
preparedStatement.executeBatch();//将一批命令提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。
connection.commit();
return true;
} catch (Exception e) {
e.printStackTrace();
if (connection!=null) {//避免空指针异常
try {
connection.rollback();//如果异常则回滚,撤销缓存中的所有语句
} catch (Exception e1) {
e1.printStackTrace();
}
}
} finally {
close(preparedStatement,connection);
}
return false;
}
/**
* 释放资源
*
* @author 肥胖的企鹅
*/
private static void close(Statement statement,ResultSet resultSet,Connection connection) {
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
close(statement,connection);
}
/**
* 释放资源
*
* @author 肥胖的企鹅
*/
private static void close(Statement statement,ResultSet resultSet,Connection connection) {
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
close(statement,connection);
}
/**
* 释放资源
*
* @author 肥胖的企鹅
*/
private 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();
}
}
}
}