227 lines
6.5 KiB
TeX
227 lines
6.5 KiB
TeX
|
\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}
|