通用的更新方法
1、适用于删除、插入、更新操作
2、conn连接数据库和closeResource关闭资源的方法参考CRUD增删改查方法
/**
* //通用更新方法
* @param conn
* @param sql sql语句
* @param params Object... 可变参数
* @return
*/
public boolean update(Connection conn,String sql,Object... params){
//创建PrepareStatement对象
PreparedStatement pstmt = null;
//记录更新成功的条数
int count = 0;
try{
pstmt = conn.prepareStatement(sql);
//给占位符赋值
for (int i = 0; i < params.length; i++) {
pstmt.setObject((i+1),params[i]);
}
//执行sql
count = pstmt.executeUpdate();
}catch (Exception e){
e.printStackTrace();
}finally {
//关闭资源
DBUtils.closeResource(conn,pstmt,null);
}
return count > 0;
}
通用查询方法
1、List使用了泛型,可以适用于所有的表类,List前面也需要指明是泛型,不然会报错,编译器会认为它是一个类,不是泛型
2、clazz用来指明需要查询的类,调用该方法时,该参数只需指明类名.class即可
3、 pstmt.setObject() 给占位符赋值是将传入的参数依次赋值给sql语句中需要传值的位置,下标从1开始
4、 ResultSet结果集中保存了查询结果,该结果集中保存的是数据库的对象,列名可能于类中定义的不一样,所以需要使用反射获取Java对象对应的属性
5、ResultSetMetaData rsmd,首先要从结果集中获得表的字段信息rs.getMetaData(),然后根据表的字段信息获取表中列的数量rsmd.getColumnCount()
6、循环遍历结果集,将它封装成Java对象
7、使用newInstance()进行实例化,实例化的对象就是你需要查询的表,使用泛型,可以随意查任意一张表
8、先获取表中列的字段别名rsmd.getColumnLabel((i + 1)),下标从1开始,获取别名是因为我们在书写sql语句时,可能表中的列名和我们类中定义的列名不一样,所以sql语句中我们会取一个别名,获取字段名的方式为rsmd.getColumnName(),获取字段名可能会报错,无法识别列名
9、在获取字段值,这里的值从结果集中获取 rs.getObject((i + 1)),下标从1开始
10、根据获取的字段别名反射出Java类中对应的属性clazz.getDeclaredField(),取别名的时候最好是和类中属性名一样的,方便查询
11、一般类中定义的属性都是private私有的,所以需要设置数据可访问性declaredField.setAccessible(true)
12、在给java对象的属性进行赋值declaredField.set(Object,Value) Object就是Java对象
13、for循环完成一次,就查询出了表中一行的数据,list.add()保存到list中
/**
* //通用查询方法
* @param clazz 数据库表映射的对象类型
* @param conn 数据库连接
* @param sql sql语句
* @param params sql语句需要的参数
* @param <T>
* @return
*/
public <T>List<T> query(Class<T> clazz,Connection conn,String sql,Object... params){
//创建预编译的PreparedStatement对象
PreparedStatement pstmt = null;
ResultSet rs = null;
//List保存查询后的数据,需要将数据库对象封装成Java对象输出,用到反射
List<T> list = new ArrayList<>();
try{
pstmt = conn.prepareStatement(sql);
//设置sql语句占位符的数据
for (int i = 0; i < params.length; i++) {
pstmt.setObject((i+1),params[i]);
}
//执行sql,保存数据到ResultSet结果集中
rs = pstmt.executeQuery();
//需要结果集的元数据对象,从该对象可以获取表字段信息
ResultSetMetaData rsmd = rs.getMetaData();
//获取结果集中列的数量
int columnCount = rsmd.getColumnCount();
//遍历结果集,封装成Java对象
while (rs.next()){
//创建Java类对象
T t = clazz.newInstance();
//获取查询的字段名,返回的可能有多个列,需遍历所有的列
for (int i = 0; i < columnCount; i++) {
//获取字段别名
String columnName = rsmd.getColumnLabel((i + 1));
//获取字段值
Object columnValue = rs.getObject((i + 1));
//通过反射获取Java对象对应的属性
Field declaredField = clazz.getDeclaredField(columnName);
//设置数据可访问性
declaredField.setAccessible(true);
//给Java对象属性进行赋值操作
declaredField.set(t,columnValue);
}
//将对象添加到集合中
list.add(t);
}
}catch (Exception e){
e.printStackTrace();
}finally {
DBUtils.closeResource(conn,pstmt,rs);
}
return list;
}