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注入?例如有下图所示的登录界面。

我们一般用如下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注入两点。

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

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

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

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

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

  1. 面试时,当你有权提问时,别客气,这是个逆转的好机会(内容摘自Java Web轻量级开发面试教程)...

    前些天,我在博客园里写了篇文章,如何在面试中介绍自己的项目经验,收获了2千多个点击,这无疑鼓舞了我继续分享的热情,今天我来分享另外一个面试中的甚至可以帮助大家逆转的技巧,本文来是从 java web轻 ...

  2. (java web后端方向)如何让你的简历为你争取到更多的面试机会,内容来自java web轻量级开发面试教程...

    我们在做培训时,会发现一个不合理的情况,一些程序员能力不错,在公司里也是技术牛人,但发出去的简历往往会石沉大海,没有回复.对于刚毕业的大学生或工作年限在2年之内的程序员,这个情况会更严重. 这种情况下 ...

  3. 根据实践经验,讲述些学习Java web能少走的弯路,内容摘自java web轻量级开发面试教程...

    在和不少比较上进的初级程序员打交道的过程中,我们总结出了一些能帮到合格程序员尽快进阶的经验,从总体上来讲,多学.多实践不吃亏.本文来是从 java web轻量级开发面试教程从摘录的. 1  哪些知识点 ...

  4. java web轻量级开发面试教程内容精粹:哪些简历得不到面试机会

    看到一本较好的实践性比较强的书,java web轻量级开发面试教程,里面的一些内容很有实践意义. 问题点 很难获得面试机会的原因 学历不符,比如要求是本科以上,但学历是大专 学历是硬指标,所以达不到学 ...

  5. Java综合知识总结_数据库篇

    JavaMySQL 一.JDBC连接数据库步骤(以MYSQL为例) 1.加载JDBC驱动程序: 通过Class类的forName方法实现,并将驱动地址放进去 成功加载后,会将Driver类的实例注册到 ...

  6. java mysql数据库回退_数据库事务及Java中的处理

    事 务是指一组相互依赖的操作行为,举一个举得不能再被举的例子就是银行交易,当然还有其他像网上购物,电子货币交易等等,事务的成功取决于这些相互依赖的操 作行为是否都能执行成功,只要有一个操作行为失败,就 ...

  7. java 实验十 数据库实验_数据库实验十[荟萃内容]

    <数据库实验十[荟萃内容]>由会员分享,可在线阅读,更多相关<数据库实验十[荟萃内容](9页珍藏版)>请在人人文库网上搜索. 1.北京建筑大学理学院 信息与计算科学专业 实验报 ...

  8. 元组可以直接添加进数据库吗_数据库篇-第一章:数据库基本概念

    面试必备基础数据库知识,扫码关注公众号提升 01 第一,什么是数据库? 维基百科上是这样定义的: 所谓"数据库"是以一定方式储存在一起.能予多个用户共享.具有尽可能小的冗余度.与应 ...

  9. mysql数据库算法_数据库:MySQL索引背后的数据结构及算法原理【转】

    原文:http://blog.codinglabs.org/articles/theory-of-mysql-index.html 摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话 ...

最新文章

  1. 数据库和缓存的双写一致性问题
  2. 【REST SOAP】REST和SOAP Web Service的区别比较
  3. (一) shario教程资料
  4. LeetCode 1184. 公交站间的距离
  5. 用递归方法判断字符串是否是回文(Recursion Palindrome Python)
  6. 马斯克:特斯拉电动皮卡Cybertruck能在水上漂一会儿
  7. 用ikvm 来把java类库转换成_net类库,IKVM.NET
  8. Android系统启动过程详解
  9. dispatcherServlet流程图
  10. oracle ORA01017问题
  11. CTPN/CRNN的OCR自然场景文字识别理解(一)
  12. Excel大家来找茬,两列数据对比找出不同数据
  13. 1-15 Burpsuite Sequencer介绍
  14. DRM系列(3)之DRM_IOCTL_MODE_MAP_DUMB
  15. FastAPI 教程翻译 - 用户指南 26 - 安全性
  16. 微信小程序—刷脸实名认证
  17. Shell脚本之正则表达式以及文本编辑器
  18. 基于真实案例,浅谈EPC项目成本管理控制
  19. 中国人不骗中国人,我的猜拳平平无奇。。
  20. 微软最走运、最倒霉的十个瞬间

热门文章

  1. DateTime和DateTime2
  2. 链接列Uva 6176 Faulhaber's Triangle
  3. [转]ExtJs中使用中碰到的三个问题的解决方法
  4. 洛谷 P1048 采药 01背包入门
  5. 1.3计算机硬件的主要指标
  6. mysql之查询排序
  7. Ibatis SqlMapclient对象
  8. 求助:字符的显示问题
  9. 【C】C语言内存字节对齐
  10. 关于python安装scipy模块的问题