首先,我们要搭建环境:
一、导入jar包
这是我们要加入的jar包 。
二、创建德鲁伊的配置文件
三、获取链接:
这是整个的基础,有很多方法都要调用该链接用来给数据库传值;
public class sql_lianjie {
//创建变量
private static Connection connection;
/**
* 建立链接
*
* @return
* @throws SQLException
*/
//
public static Connection getConnection() throws SQLException {
//创建一个对象用来存储和加载配置文件
Properties properties = new Properties();
//try catch输出错误
try {
//使用FileInputStream读取名为dur.properties的文件
// 使用load方法将文件内容加载到properties对象中
properties.load(new FileInputStream("src/dur.properties"));
//使用`DruidDataSourceFactory`的`createDataSource`静态方法,传入前面加载的`properties`对象。
// 这个方法根据配置创建一个`DataSource`对象,`DataSource`是JDBC中用于获取数据库连接的对象。
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
//调用`DataSource`对象的`getConnection`方法来获取一个数据库`Connection`。
// 这个`Connection`对象是与数据库交互的基础,所有的SQL操作都需要通过这个对象执行。
connection = dataSource.getConnection();
//打印获取到的`Connection`对象。这通常用于调试目的,显示连接是否成功获取。
// System.out.println(connection);
} catch (Exception e) {
e.printStackTrace();
}
//最后,方法返回获取的`Connection`对象。
return connection;
}
四、 关闭链接:
为了不占用电脑的资源,每次访问完成都要关闭链接;
//名为closeAll,它接受一个可变参数列表(varargs)类型为AutoCloseable。AutoCloseable是一个功能接口
// 用于自动管理资源的类。类型为AutoCloseable。AutoCloseable是一个功能接口,参数它指的是要关闭的资源。
public static void closeAll(AutoCloseable... yaoguanbidemingcheng) {
//首先检查传入的参数数组是否非空且长度大于零,以确保有资源需要处理。
if (yaoguanbidemingcheng != null && yaoguanbidemingcheng.length > 0) {
//使用Java 8的流(Stream)API来遍历AutoCloseable对象数组。
// forEach方法接收一个Lambda表达式,对每个元素执行给定的操作。
Arrays.stream(yaoguanbidemingcheng).forEach(x -> {
//将捕获该异常并打印堆栈跟踪信息。这样可以避免因为单个资源的关闭失败而导致整个程序的崩溃。
if (x != null) {
try {
x.close();
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}
五、预编译:
创建并返回一个预编译的SQL语句对象(PreparedStatement)它接受三个参数:一个SQL语句(String sql),一个数据库连接对象(Connection connection), 以及一个可变参数列表(Object... parameters),用于传递SQL语句中的参数值。
public static PreparedStatement getPrepar(String sql, Connection connection, Object... parameters) throws SQLException {
//使用Connection对象和提供的SQL语句创建一个PreparedStatement对象。
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//获取PreparedStatement对象的元数据,这提供了关于SQL语句中参数的信息,包括参数的数量和类型。
ParameterMetaData parameterMetaData = preparedStatement.getParameterMetaData();
//首先,获取参数的预期数量parameterCount
int parameterCount = parameterMetaData.getParameterCount();
//检查是否有参数需要设置,以及传入的参数列表是否非空,最后确认传入参数的数量是否与SQL语句中参数的数量相匹配。
if (parameterCount != 0 && parameters != null && parameters.length == parameterCount) {
//如果参数数量和传入的参数列表一致,则循环遍历所有参数。
for (int i = 0; i < parameterCount; i++) {
// 并使用setObject方法将每个参数值设置到PreparedStatement对象中。这里i + 1是因为参数索引是从1开始的,而数组索引是从0开始的
preparedStatement.setObject(i + 1, parameters[i]);
}
}
//方法返回配置好的PreparedStatement对象,以便后续调用者可以执行具体的数据库操
return preparedStatement;
}
其次、写方法:
六、 写"增删改"的封装方法:
它用于执行SQL更新操作(如插入、更新或删除),并返回受影响的行数。
//它接受两个参数:一个SQL更新语句(String sql)和一个可变参数列表(Object... parametes)
// 用于传递SQL语句中的参数值。方法返回一个整型值(int),表示更新操作影响的行数,
public static int update(String sql, Object... parametes) throws SQLException {
//sql_lianjie的对象来获取数据库连接(Connection)。getConnection()是获取数据库连接的标准方法。
Connection connection = sql_lianjie.getConnection();
//将sql语句和参数返回给getPrepar()方法送去预编译处理
PreparedStatement prepar = getPrepar(sql, connection, parametes);
//使用PreparedStatement对象的executeUpdate()方法来执行SQL更新操作。
//此方法返回一个整数,表示数据库中受影响的行数。
int i = prepar.executeUpdate();
return i;
}
七、写查的方法:
查多个数据:
1、将数据存储在List中以集合保存:
public static <T> List<T> selduo(String sql, Class<T> cls, Object... parameters) throws SQLException, InstantiationException, IllegalAccessException, InvocationTargetException {
//定义 ArrayList 用于存储结果对象
ArrayList<T> objects = new ArrayList<>();
//数据库连接 (connection)
Connection connection = null;
//预编译的 SQL 语句 (preparedStatement)
PreparedStatement preparedStatement = null;
//结果集 (resultSet)
ResultSet resultSet = null;
T t = null;
//2,获取链接
connection = sql_lianjie.getConnection();
//3,获取sql预编译对象
preparedStatement = sql_lianjie.getPrepar(sql, connection, parameters);
//4,执行查询结果,得到结果集
resultSet = preparedStatement.executeQuery();
//5,反编译对象,从结果集中获取表的元素
ResultSetMetaData metaData = resultSet.getMetaData();
// System.out.println(metaData);
while (resultSet.next()) {
//实例化空的bean对象,用来封装数据
t = cls.newInstance();
int count = metaData.getColumnCount();
for (int i = 1; i <= count; i++) {
// 将结果集中的列值设置到对象的属性上。
BeanUtils.setProperty(t, metaData.getColumnName(i), resultSet.getObject(i));
}
//然后将对象添加到结果列表中。
objects.add(t);
}
sql_lianjie.closeAll(connection, preparedStatement, resultSet);
return objects;
}
2、将数据存储在Map中以集合保存:
public static ArrayList<Map> chamap(String sql, Object... parameters) throws SQLException {
//定义需要的变量
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
ArrayList<Map> map = new ArrayList<>();
//2.获取链接
connection = sql_lianjie.getConnection();
//3.获取预编译对象
PreparedStatement prepar = sql_lianjie.getPrepar(sql, connection, parameters);
//4.执行查询,得到结果集
resultSet = prepar.executeQuery();
//5.反编译对象,从结果集中获取表的元数据
ResultSetMetaData metaData = resultSet.getMetaData();
int count = metaData.getColumnCount();
while (resultSet.next()) {
HashMap<Object, Object> objectObjectHashMap = new HashMap<>();
for (int i = 1; i <= count; i++) {
objectObjectHashMap.put(metaData.getColumnName(i), resultSet.getObject(i));
}
map.add(objectObjectHashMap);
}
sql_lianjie.closeAll(connection, preparedStatement, resultSet);
return map;
}
3、查询多条记录,以数组集合(集合中的数据是数组)的数据状态返回
public static List<Object[]> queryArraylist(String sql, Object... parameters) throws SQLException {
//定义需要的变量
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
ArrayList<Object[]> objects = new ArrayList<>();
//2.获取链接
connection = sql_lianjie.getConnection();
//3.获取预编译对象
preparedStatement = sql_lianjie.getPrepar(sql, connection, parameters);
//4.执行查询,得到结果集
resultSet = preparedStatement.executeQuery();
//5.反编译对象,从结果集中获取表的元数据
ResultSetMetaData metaData = resultSet.getMetaData();
int count = metaData.getColumnCount();
while (resultSet.next()) {
Object[] o = new Object[count];
for (int i = 0; i < count; i++) {
o[i] = resultSet.getObject(i + 1);
}
objects.add(o);
}
sql_lianjie.closeAll(connection, preparedStatement, resultSet);
return objects;
}
查一条数据:
1、查询一条记录,以键值对形式返回:
public static Map<String, Object> yiMap(String sql, Object... parameters) throws SQLException {
//定义需要的变量
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
//2.获取链接
connection = sql_lianjie.getConnection();
//3.获取预编译对象
preparedStatement = sql_lianjie.getPrepar(sql, connection, parameters);
//4.执行查询,得到结果集
resultSet = preparedStatement.executeQuery();
//5.反编译对象,从结果集中获取表的元数据
ResultSetMetaData metaData = resultSet.getMetaData();
int count = metaData.getColumnCount();
HashMap<String, Object> map = new HashMap<>();
resultSet.next();
for (int i = 1; i <= count; i++) {
map.put(metaData.getColumnName(i), resultSet.getObject(i));
}
sql_lianjie.closeAll(connection, preparedStatement, resultSet);
return map;
}
2、 查询一条记录以数组方式输出:
public static Object[] queryArray(String sql, Object... parameters) throws SQLException {
//定义需要的变量
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
//2.获取链接
connection = sql_lianjie.getConnection();
//3.获取预编译对象
preparedStatement = sql_lianjie.getPrepar(sql, connection, parameters);
//4.执行查询,得到结果集
resultSet = preparedStatement.executeQuery();
//5.反编译对象,从结果集中获取表的元数据
ResultSetMetaData metaData = resultSet.getMetaData();
int count = metaData.getColumnCount();
Object[] o = new Object[count];
resultSet.next();
for (int i = 0; i < count; i++) {
o[i] = resultSet.getObject(i + 1);
}
sql_lianjie.closeAll(connection, preparedStatement, resultSet);
mod stu = new mod();
return o;
}
3、 查一条数据以Javabean的方式返回
public static <T> T selyi(String sql, Class<T> cls, Object... parameters) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
T t = null;
//2,获取链接
try {
connection = sql_lianjie.getConnection();
//3,获取sql预编译对象
preparedStatement = sql_lianjie.getPrepar(sql, connection, parameters);
//4,执行查询结果,得到结果集
resultSet = preparedStatement.executeQuery();
//5,反编译对象,从结果集中获取表的元素
ResultSetMetaData metaData = resultSet.getMetaData();
resultSet.next();//这个方法只会拿限定的需要的数据,不会有其他内容
t = cls.newInstance();//实例化空的bean对象,用来封装数据
int count = metaData.getColumnCount();
for (int i = 1; i <= count; i++) {
BeanUtils.setProperty(t, metaData.getColumnName(i), resultSet.getObject(i));
}
sql_lianjie.closeAll(connection, preparedStatement, resultSet);
} catch (Exception e) {
return null;
}
return t;
}