DAO设计模式

DAO即数据访问对象,是访问数据信息的类,包含对数据的增删改查操作,不涉及业务信息,可被子类继承或直接使用。使用JDBC编写DAO可能包含insert、delete、update等方法,还可进行多条记录查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值