发布网友 发布时间:2022-04-08 18:01
共2个回答
懂视网 时间:2022-04-08 22:22
class DAO { public int update(String sql, Object ... args){ Connection conn = null; PreparedStatement ps = null; int rowNum = 0; try{ conn = JDBCUtils.getConnection(); ps = conn.prepareStatement(sql); for(int i = 0; i < args.length; i++){ ps.setObject(i + 1, args[i]); } rowNum = ps.executeUpdate(); return rowNum; }catch(Exception e){ e.printStackTrace(); }finally{ JDBCUtils.release(conn, ps, null); } return rowNum; } public <T> T get(Class<T> clazz, String sql, Object ...args){ T entity = null; 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(); Map<String, Object> map = new HashMap<String, Object>(); List<String> columnLabels = getColumnLabels(rs); if(rs.next()){ for(String columnLabel : columnLabels){ Object columnValue = rs.getObject(columnLabel); map.put(columnLabel, columnValue); } } if(map.size() > 0){ entity = clazz.newInstance(); for(Map.Entry<String, Object> entry : map.entrySet()){ String fieldName = entry.getKey(); Object value = entry.getValue(); //使用BeanUtils工具类来为属性赋值 BeanUtils.setProperty(entity, fieldName, value); /**使用反射的方式为属性赋值 Field field = clazz.getDeclaredField(key); field.setAccessible(true); field.set(entity, value);*/ } return entity; } }catch(Exception e){ e.printStackTrace(); }finally{ JDBCUtils.release(conn, ps, rs); } return entity; } public <T> List<T> getForList(Class<T> clazz, String sql, Object ... args){ List<T> list = new ArrayList<>(); 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(); /** * 将得到的ResultSet结果集转换为Map<String, Object>列表, * 其中key值为rs表的别名,value值为对应别名的值 */ List<Map<String, Object>> data = handleResultSetToMapList(rs); /** * 将MapList转换为对应的BeanList */ list = transferMapListToBeanList(clazz, data); }catch(Exception e){ e.printStackTrace(); }finally{ JDBCUtils.release(conn, ps, rs); } return list; } private <T> List<T> transferMapListToBeanList(Class<T> clazz,List<Map<String, Object>> data) throws Exception { List<T> list = new ArrayList<>(); if(data.size() > 0){ for(Map<String, Object> map : data){ T entity = clazz.newInstance(); for(Map.Entry<String, Object> entry : map.entrySet()){ String fieldName = entry.getKey(); Object value = entry.getValue(); BeanUtils.setProperty(entity, fieldName, value);; } list.add(entity); } } return list; } public static <E> E getForValue(String sql, Object ... args){ E entity = null; 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(); if(rs.next()){ return (E)rs.getObject(1); } }catch(Exception e){ e.printStackTrace(); }finally{ JDBCUtils.release(conn, ps, rs); } return entity; } /** * 将获取到的结果集处理成MapList * @param rs * @return * @throws Exception */ private List<Map<String, Object>> handleResultSetToMapList(ResultSet rs) throws Exception { List<String> columnLabels = getColumnLabels(rs); List<Map<String, Object>> data = new ArrayList<Map<String, Object>>(); while(rs.next()){ Map<String, Object> map = new HashMap<String, Object>(); for(String columnLabel : columnLabels){ Object columnValue = rs.getObject(columnLabel); map.put(columnLabel, columnValue); } data.add(map); } return data; } /** * 根据结果集获取所有列的别名 * @param rs * @return * @throws Exception */ private List<String> getColumnLabels(ResultSet rs) throws Exception{ List<String> list = new ArrayList<>(); ResultSetMetaData rsmd = rs.getMetaData(); for(int i = 0; i < rsmd.getColumnCount(); i++){ list.add(rsmd.getColumnLabel(i + 1)); } return list; } }
JDBC--DAO设计模式
标签:
热心网友 时间:2022-04-08 19:30
一共23种设计模式! 引用《软件秘笈-设计模式那点事》书籍: 按照目的来分,设计模式可以分为创建型模式、结构型模式和行为型模式。 创建型模式用来处理对象的创建过程;结构型模式用来处理类或者对象的组合;行为型模式用来对类或对象怎样交互和怎样分配职责进行描述。 创建型模式用来处理对象的创建过程,主要包含以下5种设计模式: 工厂方法模式(Factory Method Pattern) 抽象工厂模式(Abstract Factory Pattern) 建造者模式(Builder Pattern) 原型模式(Prototype Pattern) 单例模式(Singleton Pattern) 结构型模式用来处理类或者对象的组合,主要包含以下7种