JDBC入门汇总及范例讲解(五)

2015-07-24 07:47:26 · 作者: · 浏览: 3
executeQuery(); while (res.next()) { // 先获取数据 int sid = res.getInt("sid"); String sname = res.getString("sname"); int age = res.getInt("age"); // 打印结果 System.out.print("sid: " + sid); System.out.print(" sname: " + sname); System.out.println(" age: " + age); } } catch (SQLException e1) { e1.printStackTrace(); } SqlDB.close(preparedStatement, connection); } } 然后有需要时,直接使用:

?

?

              SqlDB sqlDB=new SqlDB();
		sqlDB.CreatTable();
		sqlDB.InsertData(309, "小红",12);
		sqlDB.InsertData(33, "小灰",34);
		sqlDB.InsertData(23, "阿大",145);
	    sqlDB.SelectDataWithId(33);
\

?

在这里,我们使用了PreparedStatement来进行数据库操作,下面说说它们的区别

Statement 与 PreparedStatement的区别:

1.语法不同

Statement只支持静态编译,SQL语句是写死的。

PreparedStatement支持预编译,用?号来占位。

2.效率不同

Statement每次都要发送一条SQL语句,不支持缓存,执行效率低。

PreparedStatement支持预编译,缓存在数据库,只需发送参数,执行效率快。

3.安全性不同

Statement容易被注入。

注入:狡猾的分子可以编写特殊的SQL语句来入侵数据库。

例如:要查询某个用户的信息

一般情况:SELECT * FROM user_list where username=xxx and password=xxx;(这里的xxx本应为用户填写自己的用户名和密码)

注入情况:SELECT * FROM user_list where username='abc' or 1=1 -- password=xxx;

这样1=1恒等,而且在password前加上了“--”号,后面的内容成为了注释不被执行。也就是说,这样就能不用密码地查询所有的用户信息。

PreparedStatement,因为规定了SQL语句中的参数,所以可以防止注入。

结论:建议使用PreparedStatement,因为它更快更安全。


七、JDBC用法小结

?

DriverManger:驱动管理器类

要操作数据库,必须先与数据库创建连接,得到连接对象

public static Connection getConnection(String url, String username,String password){}

Connection:连接接口:

通过DriverManger类的getConnection方法,将获得连接对象,执行sql语句必须借助语句对象(Statement)

Statement createStatement();

Statement:语句接口

通过连接对象的createStatement方法获得语句对象后,语句对象即可执行sql语句,Statement中提供了executeUpdate、executeQuery语句,分别执行不同的sql语句

int executeUpdate(String sql):执行增删改操作的语句,返回值为操作的总行数

ResultSet executeQuery(String sql):执行查询语句,返回值为查询结果集合

ResultSet:结果集接口

boolean next():该方法可以使结果集游标向下移动,如果仍有记录返回true,如果已经遍历结束,返回false

getXXX(String columnName):该系列方法用来根据字段名返回字段的值结果集接口里面有大量的getXXX(String columnName)方法,如getString,getInt等

getXXX(int index):该系列方法用来根据字段在结果集中的索引值返回字段的值,结果集中有大量的getXXX方法,与 上面的类似,用来根据索引值,获取该字段的值,XXX是该字段的数据类型。

JDBC语句对象:
Statement:如上 stmt = conn.createStatement();
PrepareStatement:称为预编译的语句对象,是Statement的子接口 stmt = conn.prepareStatement(String sql),和Statement的不同之处