《Java基础入门第2版》--黑马程序员 课后答案及其详解 第9章 JDBC

一、填空题

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;
	}
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

香鱼嫩虾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值