《Java基础入门第2版》--黑马程序员 课后答案及其详解 第9章 JDBC
文章目录一、填空题二、判断题三、选择题四、简答题五、编程题六、原题及其解析一、填空题1、 Java Database Connectivity2、 java.sql.*3、 classpath4、 registerDriver()5、next()二、判断题1、对2、错3、对4、错5、错三、选择题1、A2、C3、A4、D5、AC四、简答题1、JDBC是一套用于执行SQL语句的Java API。应用程
一、填空题
1、 Java Database Connectivity
2、 java.sql.*
3、 classpath
4、 registerDriver()
5、 next()
二、判断题
1、对 2、错 3、对 4、错 5、错
三、选择题
1、A 2、C 3、A 4、D 5、AC
四、简答题
1、JDBC是一套用于执行SQL语句的Java API。应用程序可通过这套API连接到关系型数据库,并使用SQL语句来完成对数据库中数据的查询、新增、更新和删除等操作。
2、(1)加载数据库驱动
(2)通过DriverManager获取数据库连接
(3)通过Connection对象获取Statement对象
(4)使用Statement执行SQL语句
(5)操作ResultSet结果集
(6)关闭连接,释放资源
3、(1)代码的可读性和可维护性
(2)PreparedStatement尽最大可能提高性能,因为预编译语句有可能被重复调用,所以语句在被DB的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中(相当于一个函数)就会得到执行。
(3)极大地提高了安全性传。递给PreparedStatement对象的参数可以被强制进行类型转换,使开发人员可以确保在插入或查询数据时与底层的数据库格式匹配;在公共Web站点环境下,防止Sq注入问题。
五、编程题
1.public static void main(String[] args) throws Exception {
// int i = insert();
// int i = delete();
// int i = update();
select();
// System.out.println(i);
}
// 获取连接对象
private static Connection getConn() {
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/javatest";
String username = "root";
String password = "1234";
Connection conn = null;
try {
Class.forName(driver); // classLoader,加载对应驱动
conn = DriverManager.getConnection(url, username, password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
// 插入操作
private static int insert() {
Connection conn = getConn();
int i = 0;
String sql = "insert into tb_user(name,sex,email,birthday) values(?,?,?,?)";
PreparedStatement pstmt;
try {
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "itcast");
pstmt.setString(2, "男");
pstmt.setString(3, "itcast@126.com");
pstmt.setString(4, "2000-01-01");
i = pstmt.executeUpdate();
pstmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
return i;
}
// 删除操作
private static int delete() {
Connection conn = getConn();
int i = 0;
String sql = "delete from tb_user where name=?";
PreparedStatement pstmt;
try {
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "itcast");
i = pstmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}
return i;
}
// 更新操作
private static int update() {
Connection conn = getConn();
int i = 0;
String sql = "update tb_user set name=? where name =?";
PreparedStatement pstmt;
try {
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "itcast");
pstmt.setString(2, "abc");
i = pstmt.executeUpdate();
System.out.println("resutl: " + i);
pstmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
return i;
}
// 查询操作
private static void select() {
Connection conn = getConn();
String sql = "select * from tb_user";
PreparedStatement pstmt;
try {
pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
int id = rs.getInt("id"); // 通过列名获取指定字段的值
String name = rs.getString("name");
String sex = rs.getString("sex");
String email = rs.getString("email");
Date birthday = rs.getDate("birthday");
System.out.println(id + " | " + name + " | " + sex + " | " + email + " | " + birthday);
}
pstmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
2.import java.sql.*;
public class Test {
public static void main(String[] args) throws Exception {
transferAccounts(2, 1, 100);
}
public static void transferAccounts(int fromid,int toid,int transferMoney) throws Exception{
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/jdbc";
Connection con = DriverManager.getConnection(url,"root", "root");
int fromMoney = getMoney(fromid);
// 转出账户
String sql = "update tb_count set money=? where id =?";
PreparedStatement ps = con.prepareStatement(sql);
ps.setInt(1, fromMoney-transferMoney);
ps.setInt(2, fromid);
// 转入账户
int toMoney = getMoney(toid);
String sql2 = "update tb_count set money=? where id =?";
PreparedStatement ps2 = con.prepareStatement(sql2);
ps2.setInt(1, toMoney+transferMoney);
ps2.setInt(2, toid);
ps.executeUpdate();
ps2.executeUpdate();
ps.close();
ps2.close();
con.close();
}
// 获取当前账户id的账户余额
public static int getMoney(int id) throws Exception{
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/jdbc";
Connection con = DriverManager.getConnection(url,"root", "root");
String sql = "select money from tb_count where id =?";
PreparedStatement ps = con.prepareStatement(sql);
ps.setInt(1, id);
ResultSet resultSet = ps.executeQuery();
int money = 0;
while(resultSet.next()){
money = resultSet.getInt(1);
}
ps.close();
con.close();
return money;
}
}
六、原题及其解析
一.填空题
1.JDCB是( )的缩写,简称Java数据库连接。Java Database Connectivity
2.JDBC API主要位于( )包中。 java.sql.*
3.在编写JDBC程序时,必须要把所使用的数据库驱动程序或类库加载到项目的( )中。classpath
4.DriverManager类的( )方法可用于向DriverManager中注册给定的JDBC驱动程序。registerDriver( )
5.在ResultSet接口内部有一个指向表格数据行的游标(或指针),ResultSet对象初始化时,游标在表格的第一行之前,调用( )方法可将游标移动到下一行。next( )
二.判断题
1.JDBC(Java Database Connectivity,Java 数据库连接),它是一套用于执行SQL语句的Java API。( )对√
2.Statement是Java执行数据库操作的一个重要接口,它用于执行动态的SQL语句,并返回一个结果对象。( )错×
3.PreparedStatement是Statement的子接口,用于执行预编译的SQL语句。( )对√
4.PreparedStatement接口中的setData( )方法可以设置日期内容,但参数Date的类型必须是java.util.Date。( )错×
5.ResultSet接口既可以通过字段的名称来获取指定数据,也可以通过字段的索引来获取指定的数据,字段的索引是从0开始编号的。( )
错×
三.选择题
1.JDBC是一套用于执行什么的Java API ? ( ) A
A.SQL语句 B.数据库连接
C.数据库操作 D.数据库驱动
2.当应用程序使用JDBC访问特定的数据库时,只需要通过不同的什么与其对应的数据库进行连接,连接后即可对数据库进行响应的操作? ( ) C
A. Java API B.JDBC API
C.数据库驱动 D.JDBC驱动
3.JDBC API主要位于哪个包中,该包定义了一系列访问数据库的接口和类?( ) A
A.java.sql B.java.util
C.java.jdbc D.java.lang
4.在编写JDBC程序时,必须要把所使用的数据库驱动程序或类库加载到项目的什么位置?( ) D
A.根目录下 B.JDBC程序所在目录下
C.任意目录下 D.classpath
5.下面是Statement接口中常用的执行SQL语句的方法,哪些说明是正确的?(多选)( ) AC
A.execute(String sql)用于执行各种SQL语句,该方法返回一个boolean类型的值
B.executeUpdate(String sql)用于执行SQL中的query、insert、update和delete语句
C.executeQuery(String sql)用于执行SQL中的select语句
D.executeUpdate(String sql)用于执行各种SQL并返回int类型结果
四.简答题
1.请简述什么是JDBC。
答:JDBC是一套用于执行SQL语句的Java API。应用程序可通过这套API连接到关系型数据库,并使用SQL语句来完成对数据库中数据的查询、新增、更新和删除等操作。
2.简述JDBC的编程步骤。
(1)加载数据库驱动
(2)通过DriverManager获取数据库连接
(3)通过Connection对象获取Statement对象
(4)使用Statement执行SQL语句
(5)操作ResultSet结果集
(6)关闭连接,释放资源
3.简述PreparedStatement相比Statement优点。
(1)代码的可读性和可维护性
(2)PreparedStatement尽最大可能提高性能,因为预编译语句有可能被重复调用,所以语句在被DB的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中(相当于一个函数)就会得到执行。
(3)极大地提高了安全性传。递给PreparedStatement对象的参数可以被强制进行类型转换,使开发人员可以确保在插入或查询数据时与底层的数据库格式匹配;在公共Web站点环境下,防止Sq注入问题。
五.编程题
1.编写一个JDBC程序,要求如下:
(1)查询tb_user表数据进行操作,表设计可参考9.3.2节表。
(2)使用JDBC分别完成数据的插入、修改、查询和删除操作。
public static void main(String[] args) throws Exception {
// int i = insert();
// int i = delete();
// int i = update();
select();
// System.out.println(i);
}
// 获取连接对象
private static Connection getConn() {
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/javatest";
String username = "root";
String password = "1234";
Connection conn = null;
try {
Class.forName(driver); // classLoader,加载对应驱动
conn = DriverManager.getConnection(url, username, password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
// 插入操作
private static int insert() {
Connection conn = getConn();
int i = 0;
String sql = "insert into tb_user(name,sex,email,birthday) values(?,?,?,?)";
PreparedStatement pstmt;
try {
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "itcast");
pstmt.setString(2, "男");
pstmt.setString(3, "itcast@126.com");
pstmt.setString(4, "2000-01-01");
i = pstmt.executeUpdate();
pstmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
return i;
}
// 删除操作
private static int delete() {
Connection conn = getConn();
int i = 0;
String sql = "delete from tb_user where name=?";
PreparedStatement pstmt;
try {
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "itcast");
i = pstmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}
return i;
}
// 更新操作
private static int update() {
Connection conn = getConn();
int i = 0;
String sql = "update tb_user set name=? where name =?";
PreparedStatement pstmt;
try {
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "itcast");
pstmt.setString(2, "abc");
i = pstmt.executeUpdate();
System.out.println("resutl: " + i);
pstmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
return i;
}
// 查询操作
private static void select() {
Connection conn = getConn();
String sql = "select * from tb_user";
PreparedStatement pstmt;
try {
pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
int id = rs.getInt("id"); // 通过列名获取指定字段的值
String name = rs.getString("name");
String sex = rs.getString("sex");
String email = rs.getString("email");
Date birthday = rs.getDate("birthday");
System.out.println(id + " | " + name + " | " + sex + " | " + email + " | " + birthday);
}
pstmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
2.编写一个JDBC程序,要求如下:
(1)设计一个tb_count表,表设计可参考9.3.2节表,并加上int类型的money字段。
(2)使用JDBC连接MySQL数据库插入两条数据,在不考虑事务的情况下完成两个用户之间的转账功能。
import java.sql.*;
public class Test {
public static void main(String[] args) throws Exception {
transferAccounts(2, 1, 100);
}
public static void transferAccounts(int fromid,int toid,int transferMoney) throws
Exception{
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/jdbc";
Connection con = DriverManager.getConnection(url,"root", "root");
int fromMoney = getMoney(fromid);
// 转出账户
String sql = "update tb_count set money=? where id =?";
PreparedStatement ps = con.prepareStatement(sql);
ps.setInt(1, fromMoney-transferMoney);
ps.setInt(2, fromid);
// 转入账户
int toMoney = getMoney(toid);
String sql2 = "update tb_count set money=? where id =?";
PreparedStatement ps2 = con.prepareStatement(sql2);
ps2.setInt(1, toMoney+transferMoney);
ps2.setInt(2, toid);
ps.executeUpdate();
ps2.executeUpdate();
ps.close();
ps2.close();
con.close();
}
// 获取当前账户id的账户余额
public static int getMoney(int id) throws Exception{
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/jdbc";
Connection con = DriverManager.getConnection(url,"root", "root");
String sql = "select money from tb_count where id =?";
PreparedStatement ps = con.prepareStatement(sql);
ps.setInt(1, id);
ResultSet resultSet = ps.executeQuery();
int money = 0;
while(resultSet.next()){
money = resultSet.getInt(1);
}
ps.close();
con.close();
return money;
}
}
更多推荐
所有评论(0)