mysql 递归菜单查询函数 java jdbc简单实现

最简单的父子结构表

函数创建语句:

select version();
#5.7.26
show variables like "sql_mode";
#sql_mode ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

#set sql_mode='';
#我这个版本的mysql执行函数会报错把那个sqk——mode 里面的ONLY_FULL_RTOUP_BY去掉就可以执行了
set sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
#show variables like "sql_mode";
DELIMITER //
drop function if exists f1;
create function f1(tableId int)
returns VARCHAR(200)
begin
declare p1 varchar(2000);
declare p2 varchar(200);
declare p3 varchar(200);
set p1 ='';
set p3 ='';
set p2 = cast(tableId as char);
while p2 is not null do
set p1 = concat(p1,',',p2);
set p3 = p2;
select group_concat(id) into p2 from c
where find_in_set(pid,p2)>0;
end while;
return p1;
end//

Java调用一 直接调用函数:

package test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;


/*
* JDBC操作数据库的步骤:
* 1.注册驱动
* 告知JVM使用的是哪一个数据库的驱动
* 2.获得连接
* 使用JDBC中的类,完成对mysql数据库的连接(TCP协议)
* 3.获得语句执行平台
* 通过连接对象获取对SQL语句的执行者对象
* 4.执行sql语句
* 使用执行者对象,向数据库执行SQL语句
* 获取数据库的执行后的结果
* 5.处理结果
* 6.释放资源
* 调用一堆close
*/
public class JDBCTest {

public static void main(String[] args) throws Exception {

// 1. 注册驱动
// 使用java.sql.DriverManager类的静态方法registerDriver(Driver driver)
// Driver是一个接口,参数传递:MySQL驱动程序的实现类
// DriverManager.registerDriver(new Driver());
// 查看驱动类源码,注册两次驱动,浪费资源
Class.forName("com.mysql.jdbc.Driver");
// 2. 获得连接
// uri:数据库地址 jdbc:mysql://连接主机ip:端口号//数据库名字
String url = "jdbc:mysql://localhost:3306/test?useSSL=false";
// static Connection getConnection(String url, String user, String password)
// 返回值是java.sql.Connection接口的实现类,在MySQL驱动程序中
Connection conn = DriverManager.getConnection(url, "root", "root");
System.out.println(conn);// com.mysql.jdbc.JDBC4Connection@10d1f30
// 3. 获得语句执行平台,通过数据库连接对象,获取到SQL语句的执行者对象
//conn对象,调用方法 Statement createStatement() 获取Statement对象,将SQL语句发送到数据库
//返回的是Statement接口的实现类对象,在MySQL驱动程序中
Statement stat = conn.createStatement();
System.out.println(stat);//com.mysql.jdbc.StatementImpl@137bc9
// 4. 执行sql语句
//通过执行者对象调用方法执行SQL语句,获取结果
//int executeUpdate(String sql) 执行数据库中的SQL语句,仅限于insert,update,delete
//返回值int,操作成功数据库的行数
ResultSet rs = stat.executeQuery("select f1(2)");
while(rs.next()) {
String res = rs.getString(1);
System.out.println(res);
}
// 5. 释放资源
stat.close();
conn.close();
}

}

输出结果:

com.mysql.jdbc.JDBC4Connection@5a10411
com.mysql.jdbc.StatementImpl@2ef1e4fa
,2,5,6,11,12

Java调用二 查所有的:

package test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import com.mysql.jdbc.StringUtils;

/*
* JDBC操作数据库的步骤:
* 1.注册驱动
* 告知JVM使用的是哪一个数据库的驱动
* 2.获得连接
* 使用JDBC中的类,完成对mysql数据库的连接(TCP协议)
* 3.获得语句执行平台
* 通过连接对象获取对SQL语句的执行者对象
* 4.执行sql语句
* 使用执行者对象,向数据库执行SQL语句
* 获取数据库的执行后的结果
* 5.处理结果
* 6.释放资源
* 调用一堆close
*/
public class JDBCTest2 {

public static void main(String[] args) throws Exception {

// 1. 注册驱动
// 使用java.sql.DriverManager类的静态方法registerDriver(Driver driver)
// Driver是一个接口,参数传递:MySQL驱动程序的实现类
// DriverManager.registerDriver(new Driver());
// 查看驱动类源码,注册两次驱动,浪费资源
Class.forName("com.mysql.jdbc.Driver");
// 2. 获得连接
// uri:数据库地址 jdbc:mysql://连接主机ip:端口号//数据库名字
String url = "jdbc:mysql://localhost:3306/test?useSSL=false";
// static Connection getConnection(String url, String user, String password)
// 返回值是java.sql.Connection接口的实现类,在MySQL驱动程序中
Connection conn = DriverManager.getConnection(url, "root", "root");
// System.out.println(conn);// com.mysql.jdbc.JDBC4Connection@10d1f30
// 3. 获得语句执行平台,通过数据库连接对象,获取到SQL语句的执行者对象
// conn对象,调用方法 Statement createStatement() 获取Statement对象,将SQL语句发送到数据库
// 返回的是Statement接口的实现类对象,在MySQL驱动程序中
Statement stat = conn.createStatement();
// System.out.println(stat);//com.mysql.jdbc.StatementImpl@137bc9

// 4. 执行sql语句
// 通过执行者对象调用方法执行SQL语句,获取结果
// int executeUpdate(String sql) 执行数据库中的SQL语句,仅限于insert,update,delete
// 返回值int,操作成功数据库的行数
// int row = stat.executeUpdate("INSERT INTO sort(sname,sprice,sdesc)
// VALUES('汽车用品',50000,'疯狂涨价')");
// ResultSet rs = stat.executeQuery("select id from c)");
StringBuffer res = new StringBuffer();
ResultSet rs = stat.executeQuery("select id,pid from c ");
List<HashMap<String, String>> all = new ArrayList<HashMap<String, String>>();
List<HashMap<String, String>> resList = new ArrayList<HashMap<String, String>>();
String id, pid;
while (rs.next()) {
id = rs.getString(1);
pid = rs.getString(2);
HashMap<String, String> e = new HashMap<String, String>();
e.put("id", id);
e.put("pid", pid);
all.add(e);
// getAllChild(stat,res,pid);
}
getAllChild(resList, all, "1");
for (int i = 0; i < resList.size(); i++) {
System.out.println("id=" + resList.get(i).get("id") + ",pid=" + resList.get(i).get("pid"));
}
// 5. 释放资源
stat.close();
conn.close();
}

private static void getAllChild(List<HashMap<String, String>> resList, List<HashMap<String, String>> all,
String aid) {
for (int i = 0; i < all.size(); i++) {
HashMap<String, String> map = all.get(i);
String id = map.get("id");
String pid = map.get("pid");
if (id.equals(aid)) {
resList.add(map);
}
if (pid.equals(aid)) {
resList.add(map);
getChild(resList, all, id);
}
}
}

private static void getChild(List<HashMap<String, String>> resList, List<HashMap<String, String>> all, String aid) {
for (int i = 0; i < all.size(); i++) {
HashMap<String, String> map = all.get(i);
String pid = map.get("pid");
if (pid.equals(aid)) {
resList.add(map);
}
}
}

}

输出结果:

id=1,pid=0
id=3,pid=1
id=7,pid=3
id=8,pid=3
id=4,pid=1
id=9,pid=4
id=10,pid=4

Java调用三 查所有的并且拼成树形结构:

package test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.mysql.jdbc.StringUtils;

/*
* JDBC操作数据库的步骤:
* 1.注册驱动
* 告知JVM使用的是哪一个数据库的驱动
* 2.获得连接
* 使用JDBC中的类,完成对mysql数据库的连接(TCP协议)
* 3.获得语句执行平台
* 通过连接对象获取对SQL语句的执行者对象
* 4.执行sql语句
* 使用执行者对象,向数据库执行SQL语句
* 获取数据库的执行后的结果
* 5.处理结果
* 6.释放资源
* 调用一堆close
*/
public class JDBCTest3 {

public static void main(String[] args) throws Exception {

// 1. 注册驱动
// 使用java.sql.DriverManager类的静态方法registerDriver(Driver driver)
// Driver是一个接口,参数传递:MySQL驱动程序的实现类
// DriverManager.registerDriver(new Driver());
// 查看驱动类源码,注册两次驱动,浪费资源
Class.forName("com.mysql.jdbc.Driver");
// 2. 获得连接
// uri:数据库地址 jdbc:mysql://连接主机ip:端口号//数据库名字
String url = "jdbc:mysql://localhost:3306/test?useSSL=false";
// static Connection getConnection(String url, String user, String password)
// 返回值是java.sql.Connection接口的实现类,在MySQL驱动程序中
Connection conn = DriverManager.getConnection(url, "root", "root");
// System.out.println(conn);// com.mysql.jdbc.JDBC4Connection@10d1f30
// 3. 获得语句执行平台,通过数据库连接对象,获取到SQL语句的执行者对象
// conn对象,调用方法 Statement createStatement() 获取Statement对象,将SQL语句发送到数据库
// 返回的是Statement接口的实现类对象,在MySQL驱动程序中
Statement stat = conn.createStatement();
// System.out.println(stat);//com.mysql.jdbc.StatementImpl@137bc9

// 4. 执行sql语句
// 通过执行者对象调用方法执行SQL语句,获取结果
// int executeUpdate(String sql) 执行数据库中的SQL语句,仅限于insert,update,delete
// 返回值int,操作成功数据库的行数
// int row = stat.executeUpdate("INSERT INTO sort(sname,sprice,sdesc)
// VALUES('汽车用品',50000,'疯狂涨价')");
// ResultSet rs = stat.executeQuery("select id from c)");
StringBuffer res = new StringBuffer();
ResultSet rs = stat.executeQuery("select id,pid from c ");
List<Map<String, Object>> all = new ArrayList<Map<String, Object>>();
Map<String, Object> resMap = new HashMap<String, Object>();
String id, pid;
while (rs.next()) {
id = rs.getString(1);
pid = rs.getString(2);
Map<String, Object> e = new HashMap<String, Object>();
e.put("id", id);
e.put("pid", pid);
all.add(e);
// getAllChild(stat,res,pid);
}
getAllChild(resMap, all, "1");
System.out.println(resMap);

resMap = new HashMap<String, Object>();
getAllChild(resMap, all, "2");
System.out.println(resMap);
// 5. 释放资源
stat.close();
conn.close();
}

private static void getAllChild(Map<String, Object> resMap, List<Map<String, Object>> all,
String aid) {
for (int i = 0; i < all.size(); i++) {
Map<String, Object> map = all.get(i);
String id = map.get("id").toString();
String pid = map.get("pid").toString();
if (id.equals(aid)) {
resMap.put("id",id);
resMap.put("pid",pid);
}
if (pid.equals(aid)) {
getChild(map, all, id);
if(resMap.get("child")==null) {
resMap.put("child",new ArrayList<Map<String, Object>>());
}
((ArrayList<Map<String, Object>>) resMap.get("child")).add(map);
}
}
}

private static void getChild(Map<String, Object> resMap, List<Map<String, Object>> all, String aid) {
for (int i = 0; i < all.size(); i++) {
Map<String, Object> map = all.get(i);
String pid = map.get("pid").toString();
if (pid.equals(aid)) {
getChild(map, all, map.get("id").toString());
if(resMap.get("child")==null) {
resMap.put("child",new ArrayList<Map<String, Object>>());
}
((ArrayList<Map<String, Object>>) resMap.get("child")).add(map);
}
}
}

}

输出结果:

{pid=0, id=1, child=[{pid=1, id=3, child=[{pid=3, id=7}, {pid=3, id=8}]}, {pid=1, id=4, child=[{pid=4, id=9}, {pid=4, id=10}]}]}
{pid=0, id=2, child=[{pid=2, id=5, child=[{pid=5, id=11}]}, {pid=2, id=6, child=[{pid=6, id=12}]}]}

如果要转成前段json字符串可以参考

https://mvnrepository.com/artifact/net.sf.json-lib/json-lib/2.4    依赖的jar包及其相关配置

https://www.cnblogs.com/heqiyoujing/p/9840424.html

如果大家觉得我弄得不行或者有跟好的方式欢迎分享。

猜你喜欢

转载自www.cnblogs.com/xzhg/p/11774713.html