通用的增删改操作
//通用的增删改操作
public int update(String sql,Object...args) {// sql中占位符的个数与可变形参的长度相同!
Connection conn=null;
PreparedStatement ps=null;
try {
// 1.获取数据库的连接
conn = JDBCUtils.getConnection();
// 2.预编译sql语句,返回PreparedStatement的实例
ps = conn.prepareStatement(sql);
// 3.填充占位符
for(int i=0;i<args.length;i++){
ps.setObject(i+1, args[i]);
}
// 4.执行
return ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally{
// 5.资源的关闭
JDBCUtils.closeResource(conn, ps);
}
return 0;
}
@Test
public void testInsert(){
Scanner scanner=new Scanner(System.in);
System.out.print("请输入用户名:");
String name = scanner.next();
System.out.print("请输入邮箱:");
String email = scanner.next();
System.out.print("请输入生日:");
String birthday = scanner.next();//'1992-09-08'
String sql="insert into customers(name,email,birth)values(?,?,?)";
int insertCount = update(sql,name,email,birthday);
if(insertCount>0){
System.out.println("添加成功");
}else{
System.out.println("添加失败");
}
}
使用PreparedStatement实现针对于不同表的通用的查询操作
public <T> List<T> getForList(Class<T> clazz,String sql,Object...args){
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
try {
conn = JDBCUtils.getConnection();
ps = conn.prepareStatement(sql);
for(int i=0;i<args.length;i++){
ps.setObject(i+1, args[i]);
}
rs = ps.executeQuery();
// 获取结果集的元数据 :ResultSetMetaData
ResultSetMetaData rsmd = rs.getMetaData();
// 通过ResultSetMetaData获取结果集中的列数
int columnCount = rsmd.getColumnCount();
//创建集合对象
ArrayList<T> list = new ArrayList<T>();
while(rs.next()){
T t = clazz.newInstance();
// 处理结果集一行数据中的每一个列:给t对象指定的属性赋值
for(int i=0;i<columnCount;i++){
// 获取列值
Object columnValue = rs.getObject(i+1);
// 获取每个列的列名
String columnLabel = rsmd.getColumnLabel(i+1);
// 给t对象指定的columnName属性,赋值为columValue:通过反射
Field field = clazz.getDeclaredField(columnLabel);
field.setAccessible(true);
field.set(t, columnValue);
}
list.add(t);
}
return list;
} catch (Exception e) {
e.printStackTrace();
}finally{
JDBCUtils.closeResource(conn, ps, rs);
}
return null;
}