JDBC连接的几个步骤
-
String url = "jdbc:hsqldb:hsql://localhost";//连接数据库的url
-
String driver = "org.hsqldb.jdbcDriver"; //建立hsqldb的驱动
-
String user="sa"; //用户名
-
String pass=""; //密码
-
Class.forName(driver);//手动加载,将驱动类的class文件装载到内存,并且形成一个描述此驱动类结构的Class类实例,并且初始化此驱动类,这样jvm就可以使用它了。
-
String sql="select * from stu where username=? and pass=?";//定义sql语句
-
Connection con = DriverManager.getConnection(url, user, pass);//jdbc建立连接
-
PreparedStatement pstmt=con.prepareStatement(sql); Statement stat = con.createStatement(sql); //准备Statement或者prepareStatement执行sql语句
-
//PrepareStatement的setString()方法从1到n插入值(表单提交的name)
pstmt.setString(1,username);
pstmt.setString(2,password);
ResultSet rs=pstmt.executeQuery();
if(rs.next()){
return "success";
}else{
return "error";
}
-
关闭资源
Statement和PrepareStatement区别
Statement
每次都会执行SQL语句,相关数据库都要执行SQL语句的编译。
Statement为一条Sql语句生成执行计划,
如果要执行两条sql语句
select colume from table where colume=1;
select colume from table where colume=2;
会生成两个执行计划
一千个查询就生成一千个执行计划!
1.创建Statement对象
Connection con = DriverManager.getConnection(url, user, pass);
String sql = "";
Statement stat = con.createStatement(sql);
ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table2");
2.使用Statement对象执行语句
Statement 接口提供了三种执行 SQL 语句的方法:executeQuery、executeUpdate 和execute。使用哪一个方法由 SQL 语句所产生的内容决定。
stat.exceuteQuery():
返回值是一个结果集Result。该结果集永远不能为null。
用于产生单个结果集的语句,例如 SELECT 语句
Statement stat = con.createStatement(sql);
ResultSet rs = stat.executeQuery();
stat.executeUpdate():
返回值是int型数据。该值代表执行insert,update,delete语句后的更新行数。若为0,则表示没有执行成功!
用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQLDDL(数据定义语言)语句,例如 CREATE TABLE 和 DROP TABLE。
stat.executeUpdate(sql);
stat.execute():
用于执行返回多个结果集、多个更新计数或二者组合的语句。
PrepareStatement
用于处理动态SQL语句,在执行前会有一个预编译过程,这个过程是有时间开销的,虽然相对数据库的操作,该时间开销可以忽略不计,
但是PreparedStatement的预编译结果会被缓存,下次执行相同的预编译语句时,就不需要编译,只要将参数直接传入编译过的语句执行代码
中就会得到执行,所以,对于批量处理可以大大提高效率。
(1) PreparedStatement接口继承Statement,PreparedStatement 实例包含已编译的 SQL 语句, 所以其执行速度要快于 Statement 对象。 (2)作为 Statement 的子类,PreparedStatement 继承了 Statement 的所有功能。 三种方法execute、 executeQuery 和 executeUpdate 已被更改以使之不再需要参数
1.创建prepareStatement对象
Connection con = DriverManager.getConnection(url, user, pass);
String sql = "";
PrepareStatement pstmt = con.PrepareStatement(sql);
ResultSet rs = pstmt.executeQuery("SELECT a, b, c FROM Table2");
2.使用PaepareStatement对象执行语句
PreparedStatement接口继承Statement。所以也为executeQuery、executeUpdate 和execute三种。
pstmt.exceuteQuery():
返回值是一个结果集Result。该结果集永远不能为null。
用于产生单个结果集的语句,例如 SELECT 语句
Statement stat = con.createStatement(sql);
ResultSet rs = stat.executeQuery();
pstmt.executeUpdate():
返回值是int型数据,该值代表执行insert,update,delete语句后的更新行数。若为0,则表示没有执行成功!
用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQLDDL(数据定义语言)语句,例如 CREATE TABLE 和 DROP TABLE。
stat.executeUpdate(sql);
pstmt.execute():
用于执行返回多个结果集、多个更新计数或二者组合的语句。
该语句可以是任何种类的 SQL 语句
execute 方法返回一个 boolean 值,以指示第一个结果的形式。必须调用 getResultSet 或 getUpdateCount 方法来检索结果,并且必须调用 getMoreResults 移动到任何后面的结果。
返回:
如果第一个结果是 ResultSet 对象,则返回 true;如果第一个结果是更新计数或者没有结果,则返回 false
意思就是如果是查询的话返回true,如果是更新或插入的话就返回false了;
PrePareStatement的优势
1.代码的可读性和可维护性更强
stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");//stmt是Statement对象实例
perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)");
pstmt.setString(1,var1);
pstmt.setString(2,var2);
pstmt.setString(3,var3);
pstmt.setString(4,var4);
pstmt.executeUpdate(); //prestmt是 PreparedStatement 对象实例
2.PrePareStatement更加提升性能
3.极大的提高了安全性
可防止暴力传密码。