zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    [转]大型网站架构设计的体系演变
    [转]木桶理论已死,长板理论告诉你:优势才是王道!
    UHF RFID编码之TPP编码
    Git使用笔记
    使用Open Live Writer写博客
    频谱分析仪
    相位噪声
    峰值因子,峰均比,Reference Level
    SeeSharpTools.JXI.DSP.Spectrum 使用
    dyld: Library not loaded: /usr/lib/libstdc++.6.dylib
  • 原文地址:https://www.cnblogs.com/xzhg/p/11774713.html
Copyright © 2011-2022 走看看