首页 > 其他分享 >jdbc笔试题

jdbc笔试题

时间:2023-10-11 14:55:49浏览次数:28  
标签:jdbc String 笔试 connection ID 部门 员工 id

公司组织机构图:

员工表:
其中UserId为用户帐号,UserName为姓名,DepartmentId为部门id。

部门表:
其中id为部门Id,DepartmentName为部门名称,ParentDepartmentId为上一级部门id,Layer为在组织机构图中的级别。

兼职表:
其中MapId为orguser表中id,departmentid为所兼职的部门id。

1、编写sql语句实现分页查询显示员工信息,每页显示4条记录,显示第二页的员工,要求显示序号,员工号,姓名,月薪,按照月薪降序排列

2、通过编写java程序实现当在main方法中输入任意一个用户的UserId时候返回当前部门中所有人员的UserId

说明:公司只有第一级是部门,部门下的都是组。如图:如果输入会计B组人员的账号,要输出财务部所有人员的账号。
例如输入”005”会返回”001 002 003 004 005 015 006 007”返回的顺序可能不一样,但是返回的人数必须完整,
由于用户有兼职,所以如果同一个用户出现了2次或以上只返回一次。


答案

1
SELECT (@row_number:=5) AS 序号,
       e.departmentid AS 员工号,
       e.username AS 姓名,
       e.sal AS 月薪
FROM (
         SELECT departmentid, username, sal
         FROM orguser
         ORDER BY sal DESC
         LIMIT 4 OFFSET 4
     ) AS e
         CROSS JOIN (SELECT @row_number:=0) AS dummy;

2
package src.com;


import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/*
select userid from orguser where departmentid in (6279,6278,6274,6270,6275);
*/
public class code2 {
    public static void main(String[] args) throws Exception {
        // 注册驱动,获取连接
        Class.forName("com.mysql.cj.jdbc.Driver");
        String url = "jdbc:mysql://localhost:3306/practice";
        String username = "root";
        String password = "1234";
        Connection connection = DriverManager.getConnection(url, username, password);

        /*
        * 根据员工id获取顶层部门id
        * 先获取员工所在部门,再递归获取部门的父部门,直到获取到顶层部门
        * 输入:员工id
        * 输出:顶层部门id
        * */
        String topLevelDepartmentId = getTopLevelDepartmentId(connection, "005");//输入员工id
        /*
        * 根据顶层部门查询其每个(子部门)并获取每个子部门下的(员工id)
        * 先根据顶层部门获取子部门,再递归获取子部门的子部门直到没有下一级,然后根据子部门查询里面的员工id
        * 输入:顶层部门id
        * 返回:员工id
        * */
        List<String> employeeIds = getEmployeesInDepartment(connection, topLevelDepartmentId);
        for (String employeeId : employeeIds) {
            System.out.println("员工id: "+employeeId);
        }

        connection.close();
    }



    /*
    * 查询当前部门id,并递归查询顶层部门的ID
    * 输入:员工id
    * 调用:递归方法getTopLevelDepartment()
    * 输出:员工所在顶级部门id
    */
    private static String getTopLevelDepartmentId(Connection connection, String userId) throws Exception {
        // 从员工表查询用户所在的部门
        String query = "SELECT departmentid FROM orguser WHERE userid = ?";
        PreparedStatement preparedStatement = connection.prepareStatement(query);
        preparedStatement.setString(1, userId);
        ResultSet resultSet = preparedStatement.executeQuery();
        if (resultSet.next()) {
            // 当前用户所在部门id
            String departmentId = resultSet.getString("departmentid");
            // 顶层id
            // 调用递归函数getTopLevelDepartment()获取每一个父级部门id
            String topLevelDepartmentId = getTopLevelDepartment(connection, departmentId);
            return topLevelDepartmentId;
        }
        // 用户不存在
        return null;
    }

    /*
    * 递归方法:递归查询顶层部门的ID
    * 输入:当前部门ID
    * 输出:当前部门的顶级部门的ID
    */
    private static String getTopLevelDepartment(Connection connection, String departmentId) throws Exception {
        //根据部门id查询父部门id和当前部门层级
        String query = "SELECT parentdepartmentid, layer FROM orgdepartment WHERE id = ?";
        PreparedStatement preparedStatement = connection.prepareStatement(query);
        preparedStatement.setString(1, departmentId);
        ResultSet resultSet = preparedStatement.executeQuery();

        if (resultSet.next()) {

            // 父部门id
            String parentDepartmentId = resultSet.getString("parentdepartmentid");
            // 当前部门层级
            int layer = resultSet.getInt("layer");


            if (layer == 2) {
                // 顶层部门
                return departmentId;
            } else {
                // 层级没有到顶级,继续递归
                return getTopLevelDepartment(connection, parentDepartmentId);
            }
        }

        // 部门不存在,返回null
        return null;
    }


    /*
    * 递归查询指定部门及其子部门下的所有员工ID
    * 输入:顶级部门ID
    * 输出:部门下(包括子部门)的所有员工ID
    *
    */
    private static List<String> getEmployeesInDepartment(Connection connection, String departmentId) throws Exception {
        List<String> employeeIds = new ArrayList<>();

        // 查询部门下的员工ID
        List<String> departmentEmployeeIds = getEmployeesInGroup(connection, departmentId);
        employeeIds.addAll(departmentEmployeeIds);


        // 查询指定部门下的子部门
        List<String> subDepartmentIds = getSubDepartments(connection, departmentId);


        // 对于每个子部门,递归查询员工ID
        for (String subDepartmentId : subDepartmentIds) {
            List<String> subDepartmentEmployeeIds = getEmployeesInDepartment(connection, subDepartmentId);
            employeeIds.addAll(subDepartmentEmployeeIds);
        }


        return employeeIds;
    }


    /*
    * 查询指定组下的员工ID
    * 输入:员工部门ID
    * 输入:部门下的员工ID
    *
    */
    private static List<String> getEmployeesInGroup(Connection connection, String groupId) throws Exception {
        List<String> employeeIds = new ArrayList<>();
        String query = "SELECT ou.userid FROM orguser ou WHERE ou.departmentid = ?";
        PreparedStatement preparedStatement = connection.prepareStatement(query);
        preparedStatement.setString(1, groupId);
        ResultSet resultSet = preparedStatement.executeQuery();
        while (resultSet.next()) {
            employeeIds.add(resultSet.getString("userid"));
        }

        return employeeIds;
    }


    /*
    * 查询指定部门下的子部门ID
    * 需要递归调用到每个子部门的子部门
    * 输入:部门ID
    * 输出:子部门ID
    */
    private static List<String> getSubDepartments(Connection connection, String departmentId) throws Exception {
        List<String> subDepartmentIds = new ArrayList<>();
        String query = "SELECT id FROM orgdepartment WHERE parentdepartmentid = ?";
        PreparedStatement preparedStatement = connection.prepareStatement(query);
        preparedStatement.setString(1, departmentId);
        ResultSet resultSet = preparedStatement.executeQuery();
        while (resultSet.next()) {
            subDepartmentIds.add(resultSet.getString("id"));
        }

        return subDepartmentIds;
    }

}

标签:jdbc,String,笔试,connection,ID,部门,员工,id
From: https://www.cnblogs.com/lmcool/p/17757076.html

相关文章

  • jdbc
    创建工程,导入驱动jar包注册驱动获取连接定义sql获取执行sql的对象执行sql处理结果释放资源1、DriverManager:驱动管理类注册驱动mysql5之后驱动包可省略,自动加载META包中的驱动类获取数据库连接禁用安全连接方式,解决警告提示:useSSL=false2、Connection:数据库连......
  • DataFrame通过JDBC读写数据读写到数据mysql
    #coding:utf8importtimefrompyspark.sqlimportSparkSessionfrompyspark.sql.typesimportStructType,StringType,IntegerTypeimportpandasaspdfrompyspark.sqlimportfunctionsasFif__name__=='__main__':#0.构建执行环境入口对象SparkSes......
  • sharding-jdbc分库分表
    数据库分片思想垂直切分按照业务拆分的方式称为垂直分片,又称为纵向拆分,它的核心理念是专库专用。水平切分水平分片又称为横向拆分。相对于垂直分片,它不再将数据根据业务逻辑分类,而是通过某个字段(或某几个字段),根据某种规则将数据分散至多个库或表中,每个分片仅包含数据的一部分。例......
  • Sharding-JDBC教程:Spring Boot整合Sharding-JDBC实现分库分表+读写分离
    在工程的application中做sharding-jdbc的分库分表配置,代码如下:sharding.jdbc.datasource.names=ds-master-0,ds-master-1,ds-master-0-slave-0,ds-master-0-slave-1,ds-master-1-slave-0,ds-master-1-slave-1sharding.jdbc.datasource.ds-master-0.type=com.alibaba.dr......
  • Sharding-JDBC 简介
    在介绍Sharding-JDBC之前,有必要先介绍下Sharding-JDBC的大家族ShardingSphere。在介绍ShardingSphere之后,相信大家会对ShardingSphere的整体架构以及Sharding-JDBC扮演的角色会有更深的了解。ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、......
  • Sharding-JDBC
    一、什么是Sharding-JDBCSharding-JDBC定位为轻量级Java框架,在Java的JDBC层提供的额外服务。它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。二、Sharding-JDBC能做什么分库&分表读写分离分布式主键分布式事务......
  • 使用Sharding-JDBC 分库分表
    当mysql单表数据量比较大时往往需要分库分表,Sharding-JDBC是当当网开源的数据库分库分表中间件。Sharding-JDBC定位为轻量级java框架,使用客户端直连数据库,以jar包形式提供服务,无proxy代理层,无需额外部署,无其他依赖,DBA也无需改变原有的运维方式。本文主要讲述该框架与spring+mybatis......
  • springboot -- 整合 sharding-jdbc 读写分离+分库分表配置(进阶)
    sharding-jdbc说明:1、分库分表不能中途更改,取模算法的id会出错2、不支持特殊sql,包括去重,子sql,聚合等3、查询会给所有表发查询sql,带上分库,分表的字段的查询只发一条,4、查询数据要注意使用,尽量带上分库或分表字段来查询,避免多表查询sql过多取模算法假设2个表,test_0,test_1,分......
  • jdbc-批量插入mssql数据库-原
    packagecom.swift.aaa;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.SQLException;importjava.text.SimpleDateFormat;importjava.util.Date;publicclassTest2{//staticintcount=......
  • jdbc-批量插入百万数据-5秒
    packagecom.swift.aaa;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.SQLException;importjava.sql.Statement;importorg.junit.Test;publicclassAPP1{publicstaticvoidmain(String......