java web数据库面试_数据库面试技巧,通过JDBC展示自己专业性,摘自java web轻量级开发面试教程...

importjava.sql.Connection;2 importjava.sql.DriverManager;3 importjava.sql.ResultSet;4 importjava.sql.SQLException;5 importjava.sql.Statement;6 public classResultDemo {7 public static voidmain(String[] args) {8 try{9 //需要确保支持MySQL的jar能被读到

10 Class.forName("com.mysql.jdbc.Driver");11 } catch(ClassNotFoundException e) {12 System.out.println("Where is your MySQL JDBC Driver?");13 e.printStackTrace();14 return;15 }16 Connection connection = null;17 Statement stmt = null;18 try{19 //这里是连接字符串

20 connection =DriverManager.getConnection(21 "jdbc:mysql://localhost:3306/class3", "root", "123456");22 if (connection != null) {23 stmt =connection.createStatement();24 String query = "select ID,Name from student";25 ResultSet rs=stmt.executeQuery(query);26 while(rs.next())27 {28 System.out.println(rs.getString(“ID”));29 System.out.println(rs.getString("Name"));30 }31 } else{32 System.out.println("Failed to make connection!");33 }34 } catch(SQLException e) {35 System.out.println("Check the JDBC Driver or Connection!");36 e.printStackTrace();37 } finally{38 //close the connection

39 try{40 stmt.close();41 connection.close();42 } catch(SQLException e) {43 e.printStackTrace();44 }45 }46 }47 }

上述代码的业务非常简单,连接数据库后依次打印Student表里的ID和Name信息。但请大家关注一下这段代码带给我们的启示。

第一,在短短的业务逻辑里,我们分别在第8到第15行,第18到第44行,用了两块try…catch,而没有图省事用一块try…catch代码包含所有的业务方法,这遵循了“尽量缩小检测范围”的原则。

第二,在第35和36行的catch从句里,没有简单地抛出异常了事,而是输出了一些信息,根据这些信息,调试程序的开发人员能很快从中得到提示,从而很快地找到原因。

此外,在catch从句里,也可以输出一些面向使用者的提示信息,比如让使用者重启程序,总之一句话,需要把面向Java的异常翻译成让程序员或使用者能理解的提示信息。

第三,在第37到第44行的finally从句里,关闭了连接,因为不论发生了什么异常,或者是否发生异常,finally从句一定会被执行到,所以可以把关闭连接的代码放入其中。如果不关闭连接,这个数据库连接对象是无法被回收的(Java的垃圾回收机制也无法回收)。

2  预处理和批处理

这里对应的问题有:你有没有用过PreparedStatement对象?PreparedStatement和Statement有什么差别?

请大家说清楚两点,1 提升效率,2 避免SQL注入,从而保证系统的安全。

什么叫SQL注入?例如有下图所示的登录界面。

20180111002903588759.png

我们一般用如下SQL来验证身份:

Select userName from users where username = ‘输入的用户名’ and pwd = ‘输入的密码’

一般来说,如果用户名和密码不匹配,是无法通过验证的,但有人可以在User Name里输入1,在User Password部分输入:1’ and pwd = ‘1’ or ‘1’=’1

那么整个SQL语句就会变成:

Select userName from users where username = ‘1’ and pwd = ‘1’ or ‘1’=’1’

这样就能绕过验证。

而处理对象PrepareStatement能有效防止这个现象的发生,因为一个“?”就是一个占位符,无法扩展。下面来看一个预处理和批处理结合的例子,同样用到刚才提到的Student表,这次来批量插入数据。

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.SQLException;

import java.sql.Statement;

public class JDBCBatch {

public static void main(String[] args) {

try {

Class.forName("com.mysql.jdbc.Driver");

} catch (ClassNotFoundException e) {

System.out.println("Where is your MySQL JDBC Driver?");

e.printStackTrace();

return;

}

Connection connection = null;

PrepareStatement pstmt;

try {

//这里是连接字符串

connection = DriverManager.getConnection(

"jdbc:mysql://localhost:3306/class3", "root", "123456");

if (connection != null) {

String query = "insert into student values (?,?)";

pstmt = connection.preparedStatement(query);//开始设置参数

pstmt.setString(1,"1");

pstmt.setString(2,"Peter");

pstmt.addBatch();

//设置第二个参数

pstmt.setString(1,"2");

pstmt.setString(2,"Mike");

pstmt.addBatch();

//执行批处理

pstmt.executeBatch();

} else {

System.out.println("Failed to make connection!");

}

} catch (SQLException e) {

System.out.println("Some of Students were not inserted correctly, please check the student table and insert manually.");

e.printStackTrace();

} finally {

try {

connection.close();

} catch (SQLException e) {

e.printStackTrace();

}

}

}

}

这部分的逻辑也比较简单,用insert语句批量插入数据。但请大家注意如下两点:

① 在PrepareStatement里,占位符的编号是从1开始,而不是从0开始。

② 批量操作能提升效率,但一次性操作多少,才能让效率提升到最高?这在不同的数据库里是不同的,一般是每批操作500到1000条语句。但切记,别一次性把所有的insert语句都用addBatch放入,因为如果SQL语句过多,会撑爆缓存,从而出错。

PrepareStatement是个比较重要的JDBC对象。再重复一下,我们在面试的时候,有时会问这个问题:Statement和PrepareStatement有什么差别?答案要点是PrepareStatement能预处理,如果能展开一下,说明能防止SQL注入就更好了。

总结一下,这里大家可以通过叙述代码里的要点来阐释自己在JDBC方面的能力。

1 阐述try...catch...finally的用法。

2 详细阐述PreparedStatement的用法,包括预处理批处理和SQL注入两点。

20180111002903591689.jpg

数据库面试技巧,通过JDBC展示自己专业性,摘自java web轻量级开发面试教程

标签:面试官   failed   类型   .exe   出错   联系人   prepare   语句   student

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:http://www.cnblogs.com/JavaArchitect/p/7482769.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值