目的:
针对于以上两个目的,我们需要解决的问题如下:
首先,我们需要知道PreparedStatement预处理?有多少个,参数传入方式和顺序问题。
对于这个地方我们需要了解元数据(中介数据,就是用来描述数据的)MetaData。
数据库元数据
通过java.sql.Connection获取对应的元数据,Connection对象调用getMetaData()
SQL语句元数据
通过java.sql.PreparedStatement获取对应的元数据,PreparedStatement对象调用getParameterMetaData()
数据库结果集元数据
通过java.sql.ResultSet获取对应的元数据,ResultSet对象getMetaData()
其次,我们进行数据展示的时候(查询结果的解析),我们可以可以使用BeanUtils工具类,它提供了对于符合JavaBean规范的实体类进行赋值,取值,拷贝操作的一系列方法,可以自动完成数据类型的转换。
public int update(String sql, Object[] parameters) {
int affectedRows = 0;
Connection connection = null;
PreparedStatement preparedStatement = null;
try{
connection = JdbcUtil.getConnection();
preparedStatement = connection.prepareStatement(sql);
//获取sql语句的参数个数
int parameterCount = preparedStatement.getParameterMetaData().getParameterCount();
//这说明我sql语句的参数个数和传入的参数在数量上必须一致
if (parameterCount !=0 && parameters != null && parameterCount == parameters.length){
for (int i = 0; i < parameters.length; i++) {
//sql参数的下标是从1开始的
preparedStatement.setObject(i + 1, parameters[i])
}
}
//执行
affectedRows = preparedStatement.executeUpdate();
}catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtil.close(connection, preparedStatement);
}
return affectedRows;
}
使用的时候
//以更新和删除为例
//更新
User user = new User(20, "小磊哥", "6666");
String sql = "update user set userName = ?, password = ? where id = ?";
Object[] parameters = {user.getUserName(), user.getPassword(), user.getId()};
int update = super.update(sql, parameters);
//1的话就是成功
System.out.println(update);
//删除,这样写也是可以的
int id = 20;
String sql = "delete from user where id = " + id;
int update = super.update(sql, null);
System.out.println(update);
因为我们要使用BeanUtils,所以说我们需要引入对应的jar包
public <T> List<T> query(String sql, Object[] parameters, Class<T> cls) {
ResultSet resultSet = null;
Connection connection = null;
PreparedStatement preparedStatement = null;
List<T> list = new ArrayList<>();
try{
connection = JdbcUtil.getConnection();
preparedStatement = connection.prepareStatement(sql);
int parameterCount = preparedStatement.getParameterMetaData().getParameterCount();
if (parameterCount != 0 && parameters != null && parameterCount == parameters.length) {
for (int i = 0; i < parameters.length; i++) {
preparedStatement.setObject(i + 1, parameters[i]);
}
}
// 执行SQL语句,得到结果集对象
resultSet = preparedStatement.executeQuery();
// 结果集元数据
ResultSetMetaData metaData = resultSet.getMetaData();
// 字段个数
int columnCount = metaData.getColumnCount();
while (resultSet.next()) {
//反射
T t = cls.getConstructor().newInstance();
for (int i = 1; i <= columnCount; i++) {
// 获取字段名
String fieldName = metaData.getColumnName(i);
// 获取对应字段数据
Object value = resultSet.getObject(fieldName);
//类t,成员变量名fieldName,值value
BeanUtils.setProperty(t, fieldName, value);
}
list.add(t);
} catch (SQLException | NoSuchMethodException | InstantiationException| IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
} finally {
JdbcUtil.close(connection, preparedStatement, resultSet);
}
//判断结果
return list.size() != 0 ? list : null;
}
}
使用的时候
String sql = "select * from user";
List<User> list = super.query(sql, null, User.class);
if (list != null) {
for (User user : list) {
System.out.println(user);
}
} else {
System.out.println("Not Found!");
}