DAO:Date Access Object,访问数据信息的类,包含了对数据的增删改查,而不包含任何业务相关的信息。DAO可以被子类继承或直接使用
使用JDBC编写DAO可能会包含的方法:insert delete update
void update(String sql,Object ... args);
//查询一条记录,返回对应的对象
<T> T get(Class<T> clazz,String sql,Object ... args);
//查询多条记录,返回对应对象的集合
<T> List<T> getForList(Class<T> clazz,String sql,Object ... args)
//返回某条记录的某一个字段的值或一个统计的值
<E> E getForValue(Strign sql,Object ... args);
public void update(String sql,Object ... args){
Connection connection = null;
PreparedStatement preparedStatement =null;
try {
connection=JdbcTool.getConnection();
preparedStatement=connection.prepareStatement(sql);
for (int i=0;i<args.length;i++){
preparedStatement.setObject(i+1,args[i]);
}
preparedStatement.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcTool.release(null,preparedStatement,connection);
}
}
//1.查询一条记录,返回对应的对象
public <T> T get(Class<T> clazz,String sql,Object ... args){
T entity =null;
Connection connection=null;
PreparedStatement preparedStatement=null;
ResultSet resultSet=null;
try {
//1.获取Connection
connection = JdbcTool.getConnection();
//2.获取PreparedStatment
preparedStatement = connection.prepareStatement(sql);
//3.填充占位符
for (int i = 0; i < args.length; i++) {
preparedStatement.setObject(i + 1, args[i]);
}
//4.进行查询,得到ResultSet
ResultSet=preparedStatement.executeQuery();
//5.准备Map<String ,Object>;键:存放列的别名,值:存放列的值
if (resultSet.next()) {
Map<String, Object> values = new HashMap<String, Object>();
//6.得到ResultSetMetaDate对象
ResultSetMetaData rsmd = resultSet.getMetaData();
//7.处理ResultSet,把指针下移
//8.由ResultSetMetaDate对象得到的结果集中有多少列
int columnCount = rsmd.getColumnCount();
//9.由ResultSetMetaDate得到每一列的别名,由ResultSet得到具体每一列的值
for (int i = 0; i < columnCount; i++) {
String columnLabel = rsmd.getColumnLabel(i + 1);
Object columnValue = resultSet.getObject(i + 1);
//10.填充Map对象
values.put(columnLabel, columnValue);
}
//11.用反射创建Class对应的对象
entity = clazz.newInstance();
//12.遍历Map对象,用反射填充对象的属性值:属性名为Map中的key,属性值为Map中的value值
for (Map.Entry<String, Object> entry : values.entrySet()) {
String propertyName = entry.getKey();
Object value = entry.getValue();
ReflectinUtils.setFieldValue(entity, propertyName, value);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcTool.release(resultSet,preparedStatement,connection);
}
return entity;
}
查询多条记录:
//2.查询多条记录,返回对应对象的集合
public <T> List<T> getForList(Class<T> clazz, String sql, Object ... args){
List list =new ArrayList();
Connection connection = null;
PreparedStatement preparedStatement =null;
ResultSet resultset=null;
//5.准备多个Map<String ,Object>;键:存放列的别名,值:存放列的值
List<Map<String,Object>> values=new ArrayList();
ResultSetMetaData rsmd =reultSet.getMetaData();
List<String> columnLabels =getColumnLabels(resultSet);
Map<String,Object> map=null;
//7.处理ResultSet,使用while循环
while(reultSet.next()){
map=new HashMap<>();
for(int i=0;i<getColumnLabel.size();i++){
String columnLabel =ColumnLabel(i);
Object value=resultSet.getObject(columnLabel);
map.put(columnLabel,value);
}
}
//11.把填充好的Map对象放到5准备的List中
values.add(map);
//12.判断List是否为空集合,若不为空则遍历,把得到的Map对象转换为一个Class参数对应的Object对象
T bean =null;
if(values.size()>0){
for(Map<String,Object> m:values){
bean=clazz.newInstance();
for(Map.Entry<String,Object> entry:m.entrySet()){
String propertyName=entry.getKey();
Object value =entry.getValue();
BeanUtils.setProperty(bean,propertyName,values);
}
}
}
//13.把Object对象放入到list中
list.add(bean);
return null;
}