一、说明
DAO(Data Access Object)是数据访问信息类,包含了对数据的增删改查操作,而不包括任何业务相关的信息。
好处:有DAO层有利于实现功能的模块化,有利于代码的维护和升级。
1.使用JDBC编写DAO包含的方法:
(1)update(String sql,Object … args): INSERT、UPDATE、DELETE
(2)< T > T select(Class< T> clazz,String sal,Object … args);查询一条记录,返回对应对象
(3)< T> List< T> select(Class< T> clazz,String sql,Object … args);查询多条记录,返回对应的对象的集合
(4)< T> T getValue(String sql,Object … args);返回某条记录的某一个字段的值,或者一个统计值
二、DAO代码
1 | public class DAO{ |
//导入beanutilshe commons-logging的jar包
Object obj=new Student();
BeanUtils.setProperty(obj,”name”,”zx”);//obj对象,name属性名,zx属性值
//获取属性值
Object value=BeanUtils.getProperty(obj,”name”);1
2
3
#### 最终简化
1.所简化的方法
//获取结果集的ColumnLabel对应的List,列的集合
private List
List
ResultSetMetaData rsmd=rs.getMetaData();
for(int i=0;i<rsmd.getColumnCount();i++){
labels.add(rsmd.getColumnLabel(i+1));
}
return labels;
}
//处理结果集,得到Map的一个List,其中Map对应一条记录
public List<Map<String,Object>> handleResultSetToMapList(ResultSet resultSet)throws Exception{
List<Map<String,Object>> values=new ArrayList<>();
List
Map<String,Object>map=null;
//处理rs,用while循环
while(rs.next()){
map=new HashMap<>();
for(String columnLabel:columnLabels){
Object value = resultSet.getObject(columnLabel);
map.put(columnLabel,value);
}
//把一条记录的一个Map对象放入2准备的List中
values.add(map);
}
}
/////
public
List
T Bean=null;
if(values.size()>0){
for(Map<String,Object> map:values){
for(Map.Entry<String,Object> entry:map.entrySet()){
String fieldName=entry.getKey();
Object value=entry.getValue();
BeanUtils.setProperty(entity,fieldName,value);
}
result.add(bean);
}
}
return result;
}1
2.最终DAO类(要导入1中的方法)
public class DAO{
// 1.INSERT、UPDATE、DELETE
public static void updata(String sql,Object … args){//Object数组,可变参数,来应对对象不同属性
Connection conn=null;
PreparedStatement pst=null;
ResultSet rs=null;
try{
conn=ToolOfDB.getConnection();
pst=conn.prepareStatement(sql);
for(int i=0;i<args.legth;i++){
preparedStatement.setObject(i+1;args[i]);//设置值,数组从0开始,表从1开始,由于未知所以setObject
}
preparedStatement.executeUpdata();//执行更新操作
}catch(Exception e){
e.printStackTrace();
}finally{
ToolOfDB.releaseResource(null,preparedStatement,conn);//关闭连接,null是ResultSet
}
}
//2.查询一条记录,返回对应对象
public
//利用取多条的
List
if(result.size()>0){
return result.get(0);
}
return null;
}catch(Exception e){
e.printStackTrace();
}finally{
ToolOfDB.releaseResource(rs,pst,conn);//关闭数据库连接
}
}
//3.查询多条记录,返回对应的对象的集合
public
List
Connection conn=null;
PreparedStatement pst=null;
ResultSet rs=null;
try{
//1.获取结果集
conn=ToolOfDB.getConnection();//获取连接
pst=conn.prepareStatement(sql);//创建PreparedStatement对象
//赋值
for(int i=0;i<args.length;i++){
pst.setObject(i+1,args[i]);//为占位符赋值
}
rs=pst.executeQuery();//获取结果集
//2.准备一个List<Map<String,Object>>:
//键:存放列名 值:存放列的值。其中一个Map对象对应一条记录
List<Map<String,Object>> values=handleResultSetToMapList(rs);
list=transfterMapListToBeanList(clazz,values);
}catch(Exception e){
e.printStackTrace();
}finally{
ToolOfDB.releaseResource(rs,pst,conn);//关闭数据库连接
}
return list;
}
//4.记录的某一个字段的值,或者一个统计值
public
Connection conn=null;
PreparedStatement pst=null;
ResultSet rs=null;
try{
conn=ToolOfDB.getConnection();
pst=conn.prepareStatement(sql);
for(int i=0;i<args.legth;i++){
pst.setObject(i+1,args[i]);//设置值,数组从0开始,表从1开始,由于未知所以setObject
}
rs=pst.executeQuery();
if(rs.next()){
return
}
}catch(Exception e){
e.printStackTrace();
}finally{
ToolOfDB.releaseResource(null,preparedStatement,conn);//关闭连接,null是ResultSet
}
}
}
`