\documentclass[全部作业]{subfiles}
\input{mysubpreamble}

\begin{document}
\setcounter{chapter}{7}
\chapter{第八次作业}
\begin{enumerate}
    \item \choice[4]{(单选题, 7.6分) MySQL Connector/J是一个JDBC（  ）驱动
    A
    Type 1
    
    B
    Type 2
    
    C
    Type 3
    
    D
    Type 4
    
    }{4}
    \item \choice[2]{(单选题, 7.8分) 使用Class类的forName()加载驱动程序需要捕获（   ）异常。
    A
    SQLException
    
    B
    ClassNotFoundException 
    
    C
    IOException 
    
    D
    DBException 
    
    }{2}
    \item \choice[2]{(单选题, 7.8分) 使用Connection接口的（   ）方法可以建立一个PreparedStatement对象
    A
    createPrepareStatement()
    
    B
    createPreparedStatement() 
    
    C
    PrepareStatement() 
    
    D
    PreparedStatement() 
    
    }{3}
    \item \choice[2]{ (单选题, 7.8分) 在JDBC编程中执行下列SQL语句"SELECT id,name FROM employee"，获取结果集rs的第1列数据的代码是
    A
    rs.getString(1)
    
    B
    rs.getString(2) 
    
    C
    rs.getString(name) 
    
    D
    rs.getString(id) 
    
    }{1}
    \item \choice[2]{(单选题, 7.8分) 如果要创建带参数的SQL查询语句，应该使用(   )对象
    A
    Statement
    
    B
    PreparedStatement 
    
    C
    PrepareStatment 
    
    D
    CallableStatement
    
    }{2}
    \item \choice[1]{ (单选题, 7.8分)
    下面描述中不属于连接池的功能的是
    
    
    
    A
    可以缓解连接频繁的关闭和创建所造成的系统性能下降
    
    B
    可以限制客户端的连接数量 
    
    C
    可以大幅度提高查询语句的执行效率 
    
    D
    可以提高系统的伸缩性 
    
    }{3}
    \item \choice[1]{(单选题, 7.8分) 下面关于PreparedStatement的说法错误的是（   ）
    A
    PreparedStatement继承Statement 
    
    B
    PreparedStatement可以防止SQL注入，更加安全 
    
    C
    PreparedStatement不能用于批量更新操作 
    
    D
    PreparedStatement可以存储预编译的Statement，从而提升执行效率 
    
    }{3}
    \item \choice[1]{(单选题, 7.8分) 在使用JDBC连接数据库时，以下哪个选项描述了正确的连接流程？
    A
    建立数据库连接 -> 创建statement对象 -> 执行SQL语句 -> 处理结果集 -> 加载JDBC驱动程序
    
    B
    加载JDBC驱动程序 -> 建立数据库连接 -> 创建statement对象 -> 执行SQL语句 -> 处理结果集
    
    C
    创建statement对象 -> 建立数据库连接 -> 执行SQL语句 -> 处理结果集 -> 加载JDBC驱动程序
    
    D
    加载JDBC驱动程序 -> 建立数据库连接 -> 处理结果集 -> 创建statement对象 -> 执行SQL语句
    
    }{2}
    \item (多选题, 7.8分) 下面哪个JDBC方法可能会改变数据库中的已有数据？
    \begin{tasks}[](2)
        \task executeQuery()
        \task \fbox{executeUpdate()}
        \task executeInsert()
        \task \fbox{executeBatch()}
    \end{tasks}
    
    \questionandanswer[]{
        (简答题, 7.8分)
        加载JDBC驱动，使用Java连接university数据库，查询instructor表中salary大于70000的教师信息，按照dept_name的升序排列后用System.out.println()输出，各列数据之间用|分隔。
        
        ID|name|dept_name|salary
        
        将编写的Java类代码贴在下方输入框中，并给出输出结果。
    }{}
    {\kaishu
        \inputminted[frame=single]{java}{../实践作业/第八次作业/test-mysql/src/Question10.java}

        以下是输出结果：

        \begin{minted}[frame=single]{text}
连接数据库...
 实例化Statement对象...
76766|Crick|Biology|72000.0
45565|Katz|Comp. Sci.|75000.0
83821|Brandt|Comp. Sci.|92000.0
98345|Kim|Elec. Eng.|80000.0
12121|Wu|Finance|90000.0
76543|Singh|Finance|80000.0
22222|Einstein|Physics|95000.0
33456|Gold|Physics|87000.0
Goodbye!
        \end{minted}
    }
    \questionandanswer[]{
        (简答题, 7.8分)
查阅资料学习JDBC CallableStatements执行存储过程的方法：https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-usagenotes-statements-callable.html

（1）在Univerisity中编写一个带输入参数和输出参数的存储过程demoSp，功能自定，给出存储过程定义并说明自定义的功能。

（2）编写Java代码调用存储过程，指定输入参数，获取输出参数后输出。给出调用存储过程的关键代码并给出输出结果。
    }{}
    {\kaishu
        存储过程的作用为将输入的变量 +1。

        \inputminted[frame=single]{java}{../实践作业/第八次作业/test-mysql/src/Question11.java}

        以下是输出结果：

        \begin{minted}[frame=single]{text}
连接数据库...
实例化Statement对象...
调用存储过程，作用为将输入的变量+1：
输入变量：
0
调用结果：
1
Goodbye!
        \end{minted}
    }
    \pagebreak[4]
    \questionandanswer[]{
        (简答题, 7.8分)
        考虑两个都具有属性X的实体集A和B (其中另外的名称与此问题无关)。
        
        a.如果两个X完全不相关，那么应该如何改进设计呢?

    }{
        应该把两个X属性改名，以便区分这两个不相关的属性。
    }
    \questionandanswer[-]{
        b.如果这两个X代表相同的性质，并且它同时适用于A和B,那么应该如何改进设计呢?考虑三种子情况:

        · X是A的主码，但不是B的主码。
    }{
        可以将X作为B的外码，参考A的主码。

         \mintinline{SQL}{alter table B add foreign key (X) references A(X);} 
    }
    \questionandanswer[-]{
        · X是A和B的主码。
    }{
        在满足某些范式的情况下，可以把A和B合并起来，仍使用X作为主码。
    }
    \questionandanswer[-]{
        · X不是A或B的主码。
    }{
        将A和B概化出一个实体集，将X作为此实体集的属性，并将X从A和B中去除。
    }
    \questionandanswer[]{
        (简答题, 7.8分)
考虑实体集A和B之间的多对一联系R。假设由R生成的关系和由A生成的关系合并了。在SQL中，参与外码约束的属性可以为空。请解释如何使用SQL中的not null约束来强制实施A在R中的全部参与约束。
    }{}
    {\kaishu
    假设联系R的属性名为X，那么可以添加外键约束和非空约束如下：
        \begin{minted}{SQL}
        alter table A add foreign key (X) references B(X);
        alter table A modify X not null;
        alter table B modify X not null;
        \end{minted}
    }
\end{enumerate}
\end{document}