总体就是图所表示所表示的转换,由数据库 => Java对象转换,代码比较简单,但对数据库压力可以大一点,多次查询.
主要是对象之间建立关联 No.2 : MapToTree()
思路为: 用pid(父id)作分组 ,这样每一个组的父节点是同一样,换句话说就是同一分组里,所有节点pid是相同的.
这样就针对分组操作,建立关联.
用Map做封装,key为父ID, value为分组List
用到了QueryRunner
这个是数据库工具,只要在网上找,下载就可以,能直接查询List.
QueryRunner jar包名=> commons-dbutils-1.5.jar
DTO代码:tree 类的代码.Javabean:
public class Tree{ private String AREA_ID; //主键ID private String AREA_NAME; //用来显示的名称 private String PARENT_ID; //父亲 参照AREA_ID private List<Tree> children = new ArrayList<Tree>(); //子节点
执行代码:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ColumnListHandler; /** * 数据库中树结构数据,转换为Java对象树结构( 多叉树结构 ) * @author liupengyuan * */ public class ListToTree { public static void main(String[] args) throws Exception { // No.1:从数据库中查询所以分组的节点 Map<String, List<Tree>> arrMap = queryGroupToMap(); // No.2:让节点与子节点之间彼此关联 MapToTree(arrMap); //从map里把根找到.返回List . 可能有多个根 List<Tree> list = arrMap.get("root"); System.out.println(list.size()); } /** * No.1: * 用父ID分组,用Map封装. key为父ID, value是所有父ID为KEY的节点数组array. * 每个数组里都是一组子节点,他们的根是同一个. 换句话说它们的父ID相同, 而Map的Key就是他们是父ID * @return * @throws SQLException */ @SuppressWarnings({ "deprecation", "unchecked", "rawtypes" }) public static Map<String,List<Tree>> queryGroupToMap() throws SQLException{ /* * 该表为中国地区组织,到 区县级 * 比如,中国下分:北京市,河北省,山东省... * 山东下分:济南市,青岛市,烟台市... * */ // QueryRunner 这个是数据库工具,只要在网上找下载就可以 commons-dbutils-1.5.jar QueryRunner qr = new QueryRunner(); Connection connection = getJdbcConnection("jdbc:oracle:thin:@192.168.3.34:1521:ORCL", "DSD_ZJK", "DSD_ZJK", "oracle.jdbc.driver.OracleDriver"); String sqlGroup = "select parent_id from HM_F_AREA t group by t.parent_id"; List<String> sqlGroupList = (List<String>)qr.query(connection, sqlGroup, new String[]{}, new ColumnListHandler("PARENT_ID")); Map<String,List<Tree>> arrMap = new HashMap<String,List<Tree>>(sqlGroupList.size()); for(int i=0; i <sqlGroupList.size(); i++){ String _pid = sqlGroupList.get(i); String sql = "select area_id , area_name , parent_id from HM_F_AREA t where t.parent_id = '"+_pid + "'"; List<Tree> listTree = (List<Tree>) qr.query(connection, sql, new String[]{} , new BeanListHandler(Tree.class)); arrMap.put( _pid , listTree ); } DbUtils.close(connection); return arrMap; } /** * No.2: * 让节点与子节点之间彼此关联 * 数据库格式并没有换,只是建立了关联 * @param arrMap */ public static void MapToTree(Map<String, List<Tree>> arrMap){ //所以pid的集成 Set<String> pidSet = arrMap.keySet(); //遍历所有的父ID,然后与所以的节点比对,父id与id相同的 //找出对应的tree节点,然后将该节点的 for (Iterator<String> it = pidSet.iterator(); it.hasNext();) { String pid = (String) it.next(); /* * 按分组的方式与pid比对. * 如果找到,那么将该pid分组的List,做为子节点 赋值给该找到的节点的 setChildren(list) * */ for (Iterator<String> it2 = pidSet.iterator(); it2.hasNext();) { String key = (String) it2.next(); //不查找自己的分组 if(pid.equals(key)){ break; } List<Tree> list = arrMap.get(key); // No.3:找出对应的tree节点,然后将该节点的 Tree tree = indexOfList(list , pid); //通过pid在Map里找出节点的子节点. List<Tree> list2 = arrMap.get(pid); if(tree!=null){ //TODO 这里是我自己定义的变成成,都不一样.所以需要自定义 // 把子节点List赋值给Tree节点的Children tree.setChildren(list2); } } } } /** * No.3: * 找出 list 中元素的id与pid相关的并返回.对应关系为: id与父id相同 * @param list * @param pid * @return */ public static Tree indexOfList(List<Tree> list , String pid){ for(int i=0 ;i<list.size();i++){ Tree tree = list.get(i); /* * pid:是 父ID * area_id:是 ID */ //TODO 这里是我自己定义的变成成,都不一样.所以需要自定义 if(pid.equals(tree.getAREA_ID())){ return tree; } } return null; } /** * 数据库连接 * @param url * @param username * @param password * @param driverClassName * @return */ public static Connection getJdbcConnection(String url, String username, String password, String driverClassName){ Connection connection = null; try { Properties props =new Properties(); props.put("user",username); props.put("password",password); props.put("remarksReporting","true"); try { Class.forName(driverClassName).newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } connection=DriverManager.getConnection(url,props); } catch (SQLException e) { e.printStackTrace(); } return connection; } }
时间: 2024-10-13 16:20:27