JAVA查询所有菜单mysql_mysql 递归菜单查询函数 java jdbc简单实现

这篇博客介绍了如何在MySQL中创建一个递归查询菜单的函数,并使用Java JDBC进行调用。首先展示了创建MySQL函数的SQL代码,然后演示了两种Java方法来查询所有菜单项,一种直接调用函数,另一种遍历查询结果并构造树形结构。最后给出了两种Java调用方式的输出结果。
摘要由CSDN通过智能技术生成

cae1e60fec8cbc8ccac711a81b1bed26.png

最简单的父子结构表

函数创建语句:

select version();

#5.7.26

show variables like "sql_mode";

#sql_modeONLY_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);

declarep3 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//

c51b5ca64ba7fb4bf8ea47c81bedeef1.png

a0ce7a9ce0832832fed754aadd327bca.png

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> all = new ArrayList>();

List> resList = new ArrayList>();

String id, pid;

while (rs.next()) {

id = rs.getString(1);

pid = rs.getString(2);

HashMap e = new HashMap();

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> resList, List> all,

String aid) {

for (int i = 0; i < all.size(); i++) {

HashMap 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> resList, List> all, String aid) {

for (int i = 0; i < all.size(); i++) {

HashMap 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> all = new ArrayList>();

Map resMap = new HashMap();

String id, pid;

while (rs.next()) {

id = rs.getString(1);

pid = rs.getString(2);

Map e = new HashMap();

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();

getAllChild(resMap, all, "2");

System.out.println(resMap);

// 5. 释放资源

stat.close();

conn.close();

}

private static void getAllChild(Map resMap, List> all,

String aid) {

for (int i = 0; i < all.size(); i++) {

Map 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>());

}

((ArrayList>) resMap.get("child")).add(map);

}

}

}

private static void getChild(Map resMap, List> all, String aid) {

for (int i = 0; i < all.size(); i++) {

Map 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>());

}

((ArrayList>) 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字符串可以参考

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值