jdbc中递归树封装查询

  • 一、递归树封装多次查询
    • 数据库驱动包.jar文件:
    • ①数据库数据准备(使用IDEA(64位)软件和phpstudy软件,即小皮系统(64位))
    • ②实体:为了使用通用 Dao 将 children 属性放入 ParentCategory 中。
    • ③实体Category类
    • ④需要用到的工具类
      • ①StringUtil类
      • ②DBUtil类
      • ③DataSource类
      • ④db.properties配置文件(记住要放在src目录下,数据根据个人情况而定)
    • ⑤测试类MainTest类
    • ⑥测试查询结果如下:
  • 二、单次查询,内存中拆分(这是目录一的优化)
    • ①起始条件是目录一中的条件:测试类如下:
    • ②单次查询,内存中拆分测试结果如下:

一、递归树封装多次查询

数据库驱动包.jar文件:

链接:https://pan.baidu.com/s/1zrA87rSYLA_A09hyZ9mieA
提取码:uh6r

①数据库数据准备(使用IDEA(64位)软件和phpstudy软件,即小皮系统(64位))

CREATE TABLE `category` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '分类id',`name` char(50) DEFAULT NULL COMMENT '分类名称',`parent_id` bigint(20) DEFAULT NULL COMMENT '父分类id',`level` int(11) DEFAULT NULL COMMENT '层级',`show_status` tinyint(4) DEFAULT '1' COMMENT '是否显示[0-不显示,1显示]',`sort_number` int(11) DEFAULT '0' COMMENT '排序',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1433 DEFAULT CHARSET=utf8mb4 COMMENT='商品三级分类';INSERT INTO `category` VALUES (1,'图书、音像、电子书刊',0,1,1,0);
INSERT INTO `category` VALUES (2,'手机',0,1,1,0);
INSERT INTO `category` VALUES (22,'电子书刊',1,2,1,2);
INSERT INTO `category` VALUES (23,'音像',1,2,1,6);
INSERT INTO `category` VALUES (24,'英文原版',1,2,1,1);
INSERT INTO `category` VALUES (25,'文艺',1,2,1,12);
INSERT INTO `category` VALUES (34,'手机通讯',2,2,1,11);
INSERT INTO `category` VALUES (35,'运营商',2,2,1,7);
INSERT INTO `category` VALUES (36,'手机配件',2,2,1,2);
INSERT INTO `category` VALUES (165,'电子书',22,3,1,102);
INSERT INTO `category` VALUES (166,'网络原创',22,3,1,153);
INSERT INTO `category` VALUES (167,'数字杂志',22,3,1,129);
INSERT INTO `category` VALUES (168,'多媒体图书',22,3,1,17);
INSERT INTO `category` VALUES (169,'音乐',23,3,1,32);
INSERT INTO `category` VALUES (170,'影视',23,3,1,108);
INSERT INTO `category` VALUES (171,'教育音像',23,3,1,106);
INSERT INTO `category` VALUES (172,'少儿',24,3,1,35);
INSERT INTO `category` VALUES (173,'商务投资',24,3,1,27);
INSERT INTO `category` VALUES (174,'英语学习与考试',24,3,1,29);
INSERT INTO `category` VALUES (175,'文学',24,3,1,64);
INSERT INTO `category` VALUES (176,'传记',24,3,1,58);
INSERT INTO `category` VALUES (177,'励志',24,3,1,98);
INSERT INTO `category` VALUES (178,'小说',25,3,1,141);
INSERT INTO `category` VALUES (179,'文学',25,3,1,55);
INSERT INTO `category` VALUES (180,'青春文学',25,3,1,26);
INSERT INTO `category` VALUES (181,'传记',25,3,1,149);
INSERT INTO `category` VALUES (182,'艺术',25,3,1,122);
INSERT INTO `category` VALUES (225,'手机',34,3,1,201);
INSERT INTO `category` VALUES (226,'对讲机',34,3,1,103);
INSERT INTO `category` VALUES (227,'合约机',35,3,1,134);
INSERT INTO `category` VALUES (228,'选号中心',35,3,1,137);
INSERT INTO `category` VALUES (229,'装宽带',35,3,1,52);
INSERT INTO `category` VALUES (230,'办套餐',35,3,1,77);
INSERT INTO `category` VALUES (231,'移动电源',36,3,1,0);
INSERT INTO `category` VALUES (232,'电池/移动电源',36,3,1,1);
INSERT INTO `category` VALUES (233,'蓝牙耳机',36,3,1,2);
INSERT INTO `category` VALUES (234,'充电器/数据线',36,3,1,10);
INSERT INTO `category` VALUES (235,'苹果周边',36,3,1,42);
INSERT INTO `category` VALUES (236,'手机耳机',36,3,1,184);
INSERT INTO `category` VALUES (237,'手机贴膜',36,3,1,86);
INSERT INTO `category` VALUES (238,'手机存储卡',36,3,1,113);
INSERT INTO `category` VALUES (239,'充电器',36,3,1,69);
INSERT INTO `category` VALUES (240,'数据线',36,3,1,7);
INSERT INTO `category` VALUES (241,'手机保护套',36,3,1,65);
INSERT INTO `category` VALUES (242,'车载配件',36,3,1,64);
INSERT INTO `category` VALUES (243,'iPhone 配件',36,3,1,127);
INSERT INTO `category` VALUES (244,'手机电池',36,3,1,198);
INSERT INTO `category` VALUES (245,'创意配件',36,3,1,123);
INSERT INTO `category` VALUES (246,'便携/无线音响',36,3,1,18);
INSERT INTO `category` VALUES (247,'手机饰品',36,3,1,213);
INSERT INTO `category` VALUES (248,'拍照配件',36,3,1,22);
INSERT INTO `category` VALUES (249,'手机支架',36,3,1,217);

②实体:为了使用通用 Dao 将 children 属性放入 ParentCategory 中。

import java.util.List;public class ParentCategory {private List<Category> children;public List<Category> getChildren() {return children;}public void setChildren(List<Category> children) {this.children = children;}
}

③实体Category类

public class Category extends ParentCategory{private long id;private String name;private long parentId;private Integer level;private Integer showStatus;private Integer sortNumber;@Overridepublic String toString() {StringBuffer s = new StringBuffer();for (int i = 1; i < level; i++) {s.append("\t");}return "\n"+s+"Category{" +"id=" + id +", name='" + name + '\'' +", parentId=" + parentId +", level=" + level +", showStatus=" + showStatus +", sortNumber=" + sortNumber +",  \n\t-->children=" + getChildren() +'}';}public long getId() {return id;}public void setId(long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public long getParentId() {return parentId;}public void setParentId(long parentId) {this.parentId = parentId;}public Integer getLevel() {return level;}public void setLevel(Integer level) {this.level = level;}public Integer getShowStatus() {return showStatus;}public void setShowStatus(Integer showStatus) {this.showStatus = showStatus;}public Integer getSortNumber() {return sortNumber;}public void setSortNumber(Integer sortNumber) {this.sortNumber = sortNumber;}
}

④需要用到的工具类

①StringUtil类

public class StringUtil {/*** 驼峰转下划线* @param camelCaseName 驼峰字符串* @return 下划线字符串*/public static String underscoreName(String camelCaseName) {StringBuffer result = new StringBuffer();if (camelCaseName != null && camelCaseName.length() > 0) {result.append(camelCaseName.substring(0, 1).toLowerCase());//拿到第一字母,直接转小写for (int i = 1; i < camelCaseName.length(); i++) {char ch = camelCaseName.charAt(i);//取第i个位置的字符if (Character.isUpperCase(ch)) {//判断该字符是不是大写字母result.append("_");//如果是大写,则拼接下划线result.append(Character.toLowerCase(ch));//将自己转为小写加入result} else {result.append(ch);}}}return result.toString();}
}

②DBUtil类

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;public class DBUtil {//8.where 条件和 条件中的参数一并传入,完成相应的查询效果public static <T> List<T> select(Connection connection, Class<T> clazz, String sql, Object[] objects) throws SQLException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {StringBuffer stringBuffer = new StringBuffer("select ");Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {stringBuffer.append("`"+StringUtil.underscoreName(field.getName())+"`,");}stringBuffer.deleteCharAt(stringBuffer.length()-1);stringBuffer.append(" from `"+StringUtil.underscoreName(clazz.getSimpleName())+"` "+sql);PreparedStatement statement = connection.prepareStatement(stringBuffer.toString());for (int i = 0; i < objects.length; i++) {System.out.println(i + ":" + objects[i]);statement.setObject(i+1,objects[i]);}ResultSet resultSet = statement.executeQuery();List<T> list = new ArrayList<>();while (resultSet.next()) {T tt = clazz.getDeclaredConstructor().newInstance();for (Field field : fields) {field.setAccessible(true);Object object = resultSet.getObject(StringUtil.underscoreName(field.getName()));field.set(tt,object);}list.add(tt);}System.out.println(stringBuffer);resultSet.close();statement.close();return list;}//7.查询第1页的10条数据public static <T> List<T> pageData(Connection connection, Class<T> clazz , int page, int number) throws SQLException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {StringBuffer stringBuffer = new StringBuffer("select ");Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {stringBuffer.append("`"+StringUtil.underscoreName(field.getName())+"`,");}stringBuffer.deleteCharAt(stringBuffer.length()-1);stringBuffer.append(" from `"+StringUtil.underscoreName(clazz.getSimpleName())+"` limit "+(page-1)*number+","+number);PreparedStatement statement = connection.prepareStatement(stringBuffer.toString());ResultSet resultSet = statement.executeQuery();List<T> list = new ArrayList<>();while (resultSet.next()) {T tt = clazz.getDeclaredConstructor().newInstance();for (Field field : fields) {field.setAccessible(true);Object object = resultSet.getObject(StringUtil.underscoreName(field.getName()));field.set(tt,object);}list.add(tt);}System.out.println(stringBuffer.toString());resultSet.close();statement.close();return list;}//6.删除id为2的数据public static boolean deleteById(Connection connection, Class<?> clazz, int id) throws SQLException {StringBuffer stringBuffer = new StringBuffer("delete from `"+StringUtil.underscoreName(clazz.getSimpleName())+"` where id="+id);PreparedStatement statement = connection.prepareStatement(stringBuffer.toString());int i = statement.executeUpdate();statement.close();System.out.println(stringBuffer);return i!=0;}//5.获取id为2的数据public static <T> T findById(Connection connection, Class<T> clazz, int i) throws SQLException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {StringBuffer stringBuffer = new StringBuffer("select ");Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {stringBuffer.append("`"+StringUtil.underscoreName(field.getName())+"`,");}stringBuffer.deleteCharAt(stringBuffer.length()-1);stringBuffer.append(" from `"+StringUtil.underscoreName(clazz.getSimpleName())+"` where id="+i);PreparedStatement statement = connection.prepareStatement(stringBuffer.toString());ResultSet resultSet = statement.executeQuery();T tt=null;while (resultSet.next()) {tt = clazz.getDeclaredConstructor().newInstance();for (Field field : fields) {field.setAccessible(true);Object object = resultSet.getObject(StringUtil.underscoreName(field.getName()));field.set(tt,object);}}resultSet.close();statement.close();System.out.println(stringBuffer);//检验SQL语句是否正确return tt;}//4.返回数据库的总条数public static long allCount(Connection connection, Class<?> clazz) throws SQLException {StringBuffer stringBuffer = new StringBuffer("select count(*) from "+"`"+StringUtil.underscoreName(clazz.getSimpleName())+"`");PreparedStatement statement = connection.prepareStatement(stringBuffer.toString());ResultSet resultSet = statement.executeQuery();long allCount=0;while (resultSet.next()) {allCount = resultSet.getLong(1);}resultSet.close();statement.close();return allCount;}//3.反射编写通用查询public static <T> List<T> findAll(Class<T> clazz, Connection connection) throws SQLException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {StringBuffer stringBuffer = new StringBuffer("select ");Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {field.setAccessible(true);stringBuffer.append("`"+StringUtil.underscoreName(field.getName())+"`,");}stringBuffer.deleteCharAt(stringBuffer.length()-1);stringBuffer.append(" from `"+StringUtil.underscoreName(clazz.getSimpleName())+"`");PreparedStatement statement = connection.prepareStatement(stringBuffer.toString());ResultSet resultSet = statement.executeQuery();List<T> list=new ArrayList<>();while (resultSet.next()) {//创建对象T obj = clazz.getDeclaredConstructor().newInstance();for (Field field : fields) {Object object = resultSet.getObject(StringUtil.underscoreName(field.getName()));field.set(obj,object);}list.add(obj);}System.out.println(stringBuffer.toString());resultSet.close();statement.close();return list;}//2.反射编写通用修改数据public static boolean updateData(Object obj, Connection connection) throws SQLException, IllegalAccessException, NoSuchFieldException {Class<?> clazz = obj.getClass();StringBuffer stringBuffer = new StringBuffer("update `"+StringUtil.underscoreName(clazz.getSimpleName()+"` set"));Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {field.setAccessible(true);if (field.getName().equals("id")) {continue;}stringBuffer.append(" `"+StringUtil.underscoreName(field.getName())+"`=?,");}stringBuffer.deleteCharAt(stringBuffer.length()-1);stringBuffer.append(" where id=?");PreparedStatement statement = connection.prepareStatement(stringBuffer.toString());for (int i = 0; i < fields.length; i++) {fields[i].setAccessible(true);if (fields[i].getName().equals("id")) {continue;}statement.setObject(i,fields[i].get(obj));}Field id=clazz.getDeclaredField("id");id.setAccessible(true);if (id.get(obj)==null) {throw new RuntimeException("id不能为空");}statement.setObject(fields.length,id.get(obj));int i = statement.executeUpdate();System.out.println(stringBuffer.toString());statement.close();return i!=0;}//1.反射编写通用插入数据public static boolean insertData(Object obj, Connection connection) throws SQLException, IllegalAccessException {Class<?> clazz = obj.getClass();StringBuffer stringBuffer = new StringBuffer("insert into `"+StringUtil.underscoreName(clazz.getSimpleName())+"`(");Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {field.setAccessible(true);if(field.getName().equals("id")){continue;}stringBuffer.append("`"+StringUtil.underscoreName(field.getName())+"`,");}stringBuffer.deleteCharAt(stringBuffer.length()-1);stringBuffer.append(") values (");for (int i = 0; i < fields.length-1; i++) {stringBuffer.append("?,");}stringBuffer.deleteCharAt(stringBuffer.length()-1);stringBuffer.append(")");PreparedStatement statement = connection.prepareStatement(stringBuffer.toString());for (int i = 0; i < fields.length; i++) {if(fields[i].getName().equals("id")){continue;}Object o = fields[i].get(obj);statement.setObject(i,o);System.out.println(i + "-->" + o);}int i = statement.executeUpdate();System.out.println(stringBuffer.toString());statement.close();//关闭资源,释放内存return i!=0;}
}

③DataSource类

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.LinkedList;
import java.util.Properties;public class DataSource {private static LinkedList<Connection> pool = new LinkedList<>();private static final int CONNECTION_COUNT = 5;private  DataSource(){}static {try {InputStream stream = DataSource.class.getClassLoader().getResourceAsStream("db.properties");Properties properties = new Properties();properties.load(stream);String driverClassName = properties.getProperty("jdbc.driverClassName");String url = properties.getProperty("jdbc.url");String username = properties.getProperty("jdbc.username");String password = properties.getProperty("jdbc.password");Class.forName(driverClassName);for (int i = 0; i < CONNECTION_COUNT; i++) {Connection connection = DriverManager.getConnection(url, username, password);pool.add(connection);}} catch (Exception e) {e.printStackTrace();}}public static Connection getConnection() {return pool.getFirst();}public static void closeConnection(Connection connection) {pool.addLast(connection);}
}

④db.properties配置文件(记住要放在src目录下,数据根据个人情况而定)

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mydb?characterEncoding=utf8&useSSL=false
jdbc.username=root
jdbc.password=123456

⑤测试类MainTest类

import cn.hxzy.demo1124.entity.Category;
import cn.hxzy.demo1124.util.DBUtil;
import cn.hxzy.demo1124.util.DataSource;import java.lang.reflect.InvocationTargetException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;public class MainTest {public static void main(String[] args) throws InvocationTargetException, SQLException, InstantiationException, IllegalAccessException, NoSuchMethodException {Connection connection = DataSource.getConnection();List<Category> selectData = DBUtil.select(connection,Category.class,"where parent_id =?",new Object[]{0});for (Category category : selectData) {setChildren(connection,category);}for (Category category : selectData) {System.out.println(category);}}private static void setChildren(Connection connection, Category category) throws InvocationTargetException, SQLException, InstantiationException, IllegalAccessException, NoSuchMethodException {List<Category> children = DBUtil.select(connection,Category.class,"where parent_id =?",new Object[]{category.getId()});for (Category child : children) {//反复调用它自身的方法(递归调用)setChildren(connection,child);}category.setChildren(children);}
}

⑥测试查询结果如下:

F:\software\jdk-11\bin\java.exe -javaagent:F:\software\ideaIU-2020.1\lib\idea_rt.jar=11170:F:\software\ideaIU-2020.1\bin -Dfile.encoding=UTF-8 -classpath E:\IdeaProjects\jdbc\out\production\jdbc;E:\IdeaProjects\jdbc\mysql-connector-java-5.1.48.jar;E:\IdeaProjects\jdbc\druid-1.2.8.jar cn.hxzy.demo1124.MainTest
0:0
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:1
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:22
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:165
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:166
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:167
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:168
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:23
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:169
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:170
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:171
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:24
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:172
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:173
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:174
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:175
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:176
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:177
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:25
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:178
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:179
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:180
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:181
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:182
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:2
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:34
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:225
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:226
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:35
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:227
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:228
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:229
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:230
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:36
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:231
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:232
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:233
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:234
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:235
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:236
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:237
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:238
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:239
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:240
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:241
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:242
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:243
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:244
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:245
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:246
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:247
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:248
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?
0:249
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category` where parent_id =?Category{id=1, name='图书、音像、电子书刊', parentId=0, level=1, showStatus=1, sortNumber=0,  -->children=[Category{id=22, name='电子书刊', parentId=1, level=2, showStatus=1, sortNumber=2,  -->children=[Category{id=165, name='电子书', parentId=22, level=3, showStatus=1, sortNumber=102,  -->children=[]}, Category{id=166, name='网络原创', parentId=22, level=3, showStatus=1, sortNumber=153,  -->children=[]}, Category{id=167, name='数字杂志', parentId=22, level=3, showStatus=1, sortNumber=129,  -->children=[]}, Category{id=168, name='多媒体图书', parentId=22, level=3, showStatus=1, sortNumber=17,  -->children=[]}]}, Category{id=23, name='音像', parentId=1, level=2, showStatus=1, sortNumber=6,  -->children=[Category{id=169, name='音乐', parentId=23, level=3, showStatus=1, sortNumber=32,  -->children=[]}, Category{id=170, name='影视', parentId=23, level=3, showStatus=1, sortNumber=108,  -->children=[]}, Category{id=171, name='教育音像', parentId=23, level=3, showStatus=1, sortNumber=106,  -->children=[]}]}, Category{id=24, name='英文原版', parentId=1, level=2, showStatus=1, sortNumber=1,  -->children=[Category{id=172, name='少儿', parentId=24, level=3, showStatus=1, sortNumber=35,  -->children=[]}, Category{id=173, name='商务投资', parentId=24, level=3, showStatus=1, sortNumber=27,  -->children=[]}, Category{id=174, name='英语学习与考试', parentId=24, level=3, showStatus=1, sortNumber=29,  -->children=[]}, Category{id=175, name='文学', parentId=24, level=3, showStatus=1, sortNumber=64,  -->children=[]}, Category{id=176, name='传记', parentId=24, level=3, showStatus=1, sortNumber=58,  -->children=[]}, Category{id=177, name='励志', parentId=24, level=3, showStatus=1, sortNumber=98,  -->children=[]}]}, Category{id=25, name='文艺', parentId=1, level=2, showStatus=1, sortNumber=12,  -->children=[Category{id=178, name='小说', parentId=25, level=3, showStatus=1, sortNumber=141,  -->children=[]}, Category{id=179, name='文学', parentId=25, level=3, showStatus=1, sortNumber=55,  -->children=[]}, Category{id=180, name='青春文学', parentId=25, level=3, showStatus=1, sortNumber=26,  -->children=[]}, Category{id=181, name='传记', parentId=25, level=3, showStatus=1, sortNumber=149,  -->children=[]}, Category{id=182, name='艺术', parentId=25, level=3, showStatus=1, sortNumber=122,  -->children=[]}]}]}Category{id=2, name='手机', parentId=0, level=1, showStatus=1, sortNumber=0,  -->children=[Category{id=34, name='手机通讯', parentId=2, level=2, showStatus=1, sortNumber=11,  -->children=[Category{id=225, name='手机', parentId=34, level=3, showStatus=1, sortNumber=201,  -->children=[]}, Category{id=226, name='对讲机', parentId=34, level=3, showStatus=1, sortNumber=103,  -->children=[]}]}, Category{id=35, name='运营商', parentId=2, level=2, showStatus=1, sortNumber=7,  -->children=[Category{id=227, name='合约机', parentId=35, level=3, showStatus=1, sortNumber=134,  -->children=[]}, Category{id=228, name='选号中心', parentId=35, level=3, showStatus=1, sortNumber=137,  -->children=[]}, Category{id=229, name='装宽带', parentId=35, level=3, showStatus=1, sortNumber=52,  -->children=[]}, Category{id=230, name='办套餐', parentId=35, level=3, showStatus=1, sortNumber=77,  -->children=[]}]}, Category{id=36, name='手机配件', parentId=2, level=2, showStatus=1, sortNumber=2,  -->children=[Category{id=231, name='移动电源', parentId=36, level=3, showStatus=1, sortNumber=0,  -->children=[]}, Category{id=232, name='电池/移动电源', parentId=36, level=3, showStatus=1, sortNumber=1,  -->children=[]}, Category{id=233, name='蓝牙耳机', parentId=36, level=3, showStatus=1, sortNumber=2,  -->children=[]}, Category{id=234, name='充电器/数据线', parentId=36, level=3, showStatus=1, sortNumber=10,  -->children=[]}, Category{id=235, name='苹果周边', parentId=36, level=3, showStatus=1, sortNumber=42,  -->children=[]}, Category{id=236, name='手机耳机', parentId=36, level=3, showStatus=1, sortNumber=184,  -->children=[]}, Category{id=237, name='手机贴膜', parentId=36, level=3, showStatus=1, sortNumber=86,  -->children=[]}, Category{id=238, name='手机存储卡', parentId=36, level=3, showStatus=1, sortNumber=113,  -->children=[]}, Category{id=239, name='充电器', parentId=36, level=3, showStatus=1, sortNumber=69,  -->children=[]}, Category{id=240, name='数据线', parentId=36, level=3, showStatus=1, sortNumber=7,  -->children=[]}, Category{id=241, name='手机保护套', parentId=36, level=3, showStatus=1, sortNumber=65,  -->children=[]}, Category{id=242, name='车载配件', parentId=36, level=3, showStatus=1, sortNumber=64,  -->children=[]}, Category{id=243, name='iPhone 配件', parentId=36, level=3, showStatus=1, sortNumber=127,  -->children=[]}, Category{id=244, name='手机电池', parentId=36, level=3, showStatus=1, sortNumber=198,  -->children=[]}, Category{id=245, name='创意配件', parentId=36, level=3, showStatus=1, sortNumber=123,  -->children=[]}, Category{id=246, name='便携/无线音响', parentId=36, level=3, showStatus=1, sortNumber=18,  -->children=[]}, Category{id=247, name='手机饰品', parentId=36, level=3, showStatus=1, sortNumber=213,  -->children=[]}, Category{id=248, name='拍照配件', parentId=36, level=3, showStatus=1, sortNumber=22,  -->children=[]}, Category{id=249, name='手机支架', parentId=36, level=3, showStatus=1, sortNumber=217,  -->children=[]}]}]}Process finished with exit code 0

注意:过程当中导包不要导错

二、单次查询,内存中拆分(这是目录一的优化)

①起始条件是目录一中的条件:测试类如下:

import cn.hxzy.demo1124.entity.Category;
import cn.hxzy.demo1124.util.DBUtil;
import cn.hxzy.demo1124.util.DataSource;import java.lang.reflect.InvocationTargetException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;public class MainTest {public static void main(String[] args) throws InvocationTargetException, SQLException, InstantiationException, IllegalAccessException, NoSuchMethodException {Connection connection = DataSource.getConnection();List<Category> list = DBUtil.findAll(Category.class, connection);List<Category> weNeed=new ArrayList<>();list.forEach(c->{if(c.getParentId()==0){setChildren(c,list);weNeed.add(c);}});for (Category category : weNeed) {System.out.println(category);}DataSource.closeConnection(connection);}private static void setChildren(Category c, List<Category> list) {List<Category> weNeed=new ArrayList<>();for (Category category : list) {if (c.getId()==category.getParentId()) {//反复调用它自身的方法(递归调用)setChildren(category,list);weNeed.add(category);}}weNeed.sort(new Comparator<Category>() {@Overridepublic int compare(Category o1, Category o2) {return o1.getSortNumber()-o2.getSortNumber();}});//上述排序第二种简化方式//weNeed.sort((o1, o2) -> o1.getSortNumber()-o2.getSortNumber());//上述排序第三种简化方式// weNeed.sort(Comparator.comparingInt(Category::getSortNumber));c.setChildren(weNeed);}
}

②单次查询,内存中拆分测试结果如下:

F:\software\jdk-11\bin\java.exe -javaagent:F:\software\ideaIU-2020.1\lib\idea_rt.jar=11397:F:\software\ideaIU-2020.1\bin -Dfile.encoding=UTF-8 -classpath E:\IdeaProjects\jdbc\out\production\jdbc;E:\IdeaProjects\jdbc\mysql-connector-java-5.1.48.jar;E:\IdeaProjects\jdbc\druid-1.2.8.jar cn.hxzy.demo1124.MainTest
select `id`,`name`,`parent_id`,`level`,`show_status`,`sort_number` from `category`Category{id=1, name='图书、音像、电子书刊', parentId=0, level=1, showStatus=1, sortNumber=0,  -->children=[Category{id=24, name='英文原版', parentId=1, level=2, showStatus=1, sortNumber=1,  -->children=[Category{id=173, name='商务投资', parentId=24, level=3, showStatus=1, sortNumber=27,  -->children=[]}, Category{id=174, name='英语学习与考试', parentId=24, level=3, showStatus=1, sortNumber=29,  -->children=[]}, Category{id=172, name='少儿', parentId=24, level=3, showStatus=1, sortNumber=35,  -->children=[]}, Category{id=176, name='传记', parentId=24, level=3, showStatus=1, sortNumber=58,  -->children=[]}, Category{id=175, name='文学', parentId=24, level=3, showStatus=1, sortNumber=64,  -->children=[]}, Category{id=177, name='励志', parentId=24, level=3, showStatus=1, sortNumber=98,  -->children=[]}]}, Category{id=22, name='电子书刊', parentId=1, level=2, showStatus=1, sortNumber=2,  -->children=[Category{id=168, name='多媒体图书', parentId=22, level=3, showStatus=1, sortNumber=17,  -->children=[]}, Category{id=165, name='电子书', parentId=22, level=3, showStatus=1, sortNumber=102,  -->children=[]}, Category{id=167, name='数字杂志', parentId=22, level=3, showStatus=1, sortNumber=129,  -->children=[]}, Category{id=166, name='网络原创', parentId=22, level=3, showStatus=1, sortNumber=153,  -->children=[]}]}, Category{id=23, name='音像', parentId=1, level=2, showStatus=1, sortNumber=6,  -->children=[Category{id=169, name='音乐', parentId=23, level=3, showStatus=1, sortNumber=32,  -->children=[]}, Category{id=171, name='教育音像', parentId=23, level=3, showStatus=1, sortNumber=106,  -->children=[]}, Category{id=170, name='影视', parentId=23, level=3, showStatus=1, sortNumber=108,  -->children=[]}]}, Category{id=25, name='文艺', parentId=1, level=2, showStatus=1, sortNumber=12,  -->children=[Category{id=180, name='青春文学', parentId=25, level=3, showStatus=1, sortNumber=26,  -->children=[]}, Category{id=179, name='文学', parentId=25, level=3, showStatus=1, sortNumber=55,  -->children=[]}, Category{id=182, name='艺术', parentId=25, level=3, showStatus=1, sortNumber=122,  -->children=[]}, Category{id=178, name='小说', parentId=25, level=3, showStatus=1, sortNumber=141,  -->children=[]}, Category{id=181, name='传记', parentId=25, level=3, showStatus=1, sortNumber=149,  -->children=[]}]}]}Category{id=2, name='手机', parentId=0, level=1, showStatus=1, sortNumber=0,  -->children=[Category{id=36, name='手机配件', parentId=2, level=2, showStatus=1, sortNumber=2,  -->children=[Category{id=231, name='移动电源', parentId=36, level=3, showStatus=1, sortNumber=0,  -->children=[]}, Category{id=232, name='电池/移动电源', parentId=36, level=3, showStatus=1, sortNumber=1,  -->children=[]}, Category{id=233, name='蓝牙耳机', parentId=36, level=3, showStatus=1, sortNumber=2,  -->children=[]}, Category{id=240, name='数据线', parentId=36, level=3, showStatus=1, sortNumber=7,  -->children=[]}, Category{id=234, name='充电器/数据线', parentId=36, level=3, showStatus=1, sortNumber=10,  -->children=[]}, Category{id=246, name='便携/无线音响', parentId=36, level=3, showStatus=1, sortNumber=18,  -->children=[]}, Category{id=248, name='拍照配件', parentId=36, level=3, showStatus=1, sortNumber=22,  -->children=[]}, Category{id=235, name='苹果周边', parentId=36, level=3, showStatus=1, sortNumber=42,  -->children=[]}, Category{id=242, name='车载配件', parentId=36, level=3, showStatus=1, sortNumber=64,  -->children=[]}, Category{id=241, name='手机保护套', parentId=36, level=3, showStatus=1, sortNumber=65,  -->children=[]}, Category{id=239, name='充电器', parentId=36, level=3, showStatus=1, sortNumber=69,  -->children=[]}, Category{id=237, name='手机贴膜', parentId=36, level=3, showStatus=1, sortNumber=86,  -->children=[]}, Category{id=238, name='手机存储卡', parentId=36, level=3, showStatus=1, sortNumber=113,  -->children=[]}, Category{id=245, name='创意配件', parentId=36, level=3, showStatus=1, sortNumber=123,  -->children=[]}, Category{id=243, name='iPhone 配件', parentId=36, level=3, showStatus=1, sortNumber=127,  -->children=[]}, Category{id=236, name='手机耳机', parentId=36, level=3, showStatus=1, sortNumber=184,  -->children=[]}, Category{id=244, name='手机电池', parentId=36, level=3, showStatus=1, sortNumber=198,  -->children=[]}, Category{id=247, name='手机饰品', parentId=36, level=3, showStatus=1, sortNumber=213,  -->children=[]}, Category{id=249, name='手机支架', parentId=36, level=3, showStatus=1, sortNumber=217,  -->children=[]}]}, Category{id=35, name='运营商', parentId=2, level=2, showStatus=1, sortNumber=7,  -->children=[Category{id=229, name='装宽带', parentId=35, level=3, showStatus=1, sortNumber=52,  -->children=[]}, Category{id=230, name='办套餐', parentId=35, level=3, showStatus=1, sortNumber=77,  -->children=[]}, Category{id=227, name='合约机', parentId=35, level=3, showStatus=1, sortNumber=134,  -->children=[]}, Category{id=228, name='选号中心', parentId=35, level=3, showStatus=1, sortNumber=137,  -->children=[]}]}, Category{id=34, name='手机通讯', parentId=2, level=2, showStatus=1, sortNumber=11,  -->children=[Category{id=226, name='对讲机', parentId=34, level=3, showStatus=1, sortNumber=103,  -->children=[]}, Category{id=225, name='手机', parentId=34, level=3, showStatus=1, sortNumber=201,  -->children=[]}]}]}Process finished with exit code 0

jdbc中递归树封装查询数据相关推荐

  1. django model filter_django中探索如何提高查询数据效率

    平时用到django时候挺多, 最近有在搞数据库表分区的实践, 所以顺便尝试在django如何提高查询效率, 也就尝试在django中加入线程和协成的代码, 看一下效果 相关工具 django + p ...

  2. WPF中嵌套charts图表查询数据

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 开发工具与关键技术:WPF .Charts 撰写日期:2020年09月16 ...

  3. Excel 中使用SQL 语句查询数据(七)-----用LIKE 运算符进行模糊匹配查询

    这篇博文要和大家分享的是用LIKE 运算符进行模糊匹配查询下图数据源商品代号包含数字的数据. 我们用Microsoft query连接数据源,步骤请参考本系列第一篇博文.语句如下图 其中 LIKE ' ...

  4. jdbc中如何实现模糊查询

    情况如何 再利用jdbc执行sql语句的时候,对于其他的句子的执行没什么太大的问题:加上占位符,然后设置占位符的值. 但是在模糊查询的时候,一直都写不对,这里提供了两种可选的解决办法,以供参考. 解决 ...

  5. JAVA的JDBC连接MYSQL数据库并查询数据

    目录 一.使用工具 1)MYSQL数据库 2)Navicat可视化软件 3)IDEA编译java工具 二.MYSQL里创建一个数据库 1)Navicat连接数据库 2)创建新的数据库和表 1.新建数据 ...

  6. 如何在Access2007中使用日期类型查询数据

    select * from 表 where datediff("d",日期型的字段,#2008-09-01#)=0 或 select * from 表 where 日期型的字段 & ...

  7. 【算法】FLANN中kd树构建和查询的简明分析

    flann源码参考:flann: https://github.com/flann-lib/flannsudo apt install libflann-dev 目录 K-最近邻搜索(K-Neares ...

  8. OpenTSDB 开发指南之 查询数据

    前面博主写了一篇文章去介绍opentsdb的http接口的使用方法,但是某一些接口的使用还是比较复杂,这篇文章会通过example来详细讲述opentsdb的一些特性. 本文的举的例子有这些: 基本的 ...

  9. jdbc mysql 存储过程查询数据_JDBC连接(MySql)数据库步骤,以及查询、插入、删除、更新等十一个处理数据库信息的功能。...

    主要内容: JDBC连接数据库步骤. 一个简单详细的查询数据的例子. 封装连接数据库,释放数据库连接方法. 实现查询,插入,删除,更新等十一个处理数据库信息的功能.(包括事务处理,批量更新等) 把十一 ...

最新文章

  1. 程序升级触发阿里云自身安全机制导致的莫名问题
  2. postgresql 数据库 客户端认证
  3. 使用DLL封装窗体和业务类
  4. .NET Core on K8S学习实践系列文章索引(持续更新)
  5. PHP检查微信域名屏蔽接口,微信域名检测API接口,实时查询域名是否被微信拦截...
  6. [读书笔记] 计算机组成原理 唐朔飞 (一)基本概念
  7. Google去广告——Adblock插件使用
  8. 《计算机网络 PDF》炸了!!!
  9. 在Mac里读取NTFS格式的盘
  10. 【办公-WORD】Word 背景颜色层次分析
  11. 带有资源混淆的打补丁过程
  12. lnmp下配置PHP虚拟主机vhost
  13. 集成学习Bagging与Boosting的区别
  14. 如何具有更好的凝聚力,我的团队
  15. 从底层源码认知Arraylist
  16. 2.8 CSS3新特性
  17. 机房运维神器之远程监控网络设备
  18. 虚拟机无法启用 虚拟化引擎 Inter VT-x/EPT,mumu模拟器报错Hyper-v 开启,无法启动模拟器
  19. 微信小程序详细图文教程-10分钟完成微信小程序开发部署发布 小程序趟过的坑,你遇到几个??
  20. 在前端培训班内该如何学习入门

热门文章

  1. 中央处理器的体系架构可以分为:冯·诺依曼结构和哈佛结构
  2. pancake闪电贷攻击学习
  3. 欧姆定律的c语言编程例题,欧姆定律应用题带答案
  4. 转载一张照片,现代版的阿里巴巴与四十大盗
  5. 如何几行代码看到网恋对象的原型
  6. 拟合(Fitting)
  7. Wordpress漏洞利用WPscan使用
  8. 汉字转拼音工具类pinyin4j
  9. 如果没有Java 人类就像不会说话的婴儿
  10. jQuery过滤性选择器