JDBC 中 CreateStatement 和 PrepareStatement 的区别与优劣。
来源:互联网 发布:js div class 编辑:程序博客网 时间:2024/06/05 12:08
本人的几点浅见,各位大大不喜勿喷。
先说下这俩到底是干啥的吧。其实这俩干的活儿都一样,就是创建了一个对象然后去通过对象调用executeQuery方法来执行sql语句。说是CreateStatement和PrepareStatement的区别,但其实说的就是Statement和PrepareStatement的区别,相信大家在网上已经看到过不少这方面的资料和博客,我在此处提几点,大家看到过的,就当重记忆,没看到就当补充~下面开始谈谈他们的区别。
最明显的区别,就是执行的sql语句格式不同。我们往上放两段代码来看看他们的区别把:
代码背景:我们有一个数据库,里面有一个user表,有username,userpwd两列。我们要查出这两列的数据。
这是使用CreateStatement方法创建了stmt对象,再通过他查询的一部分语句片段。
- String sql = "select * from users where username= '"+username+"' and userpwd='"+userpwd+"'";
- stmt = conn.createStatement();
- rs = stmt.executeQuery(sql);
- String sql = "select * from users where username=? and userpwd=?";
- pstmt = conn.prepareStatement(sql);
- pstmt.setString(1, username);
- pstmt.setString(2, userpwd);
- rs = pstmt.executeQuery();
相信写到这,大家很多人就能看出来了,原来PrepareStatement跟Statement的主要区别就是把上面sql语句中的变量抽出来了。这就是我要说的第一大优点,PrepareStatement可以提高代码的可读性。什么?你没觉得这有什么可以提高可读性的?那好,咱来看看下面这两段代码,看完你再说话。
代码背景:我们有一个数据库,里面有一个book表,有bookid,bookname,bookauthor,booksort,bookprice五列。我们要向这个表中添加一部分数据。
Statement版
- String sql = "insert into book (bookid,bookname,bookauthor,booksort,bookprice) values ('"+var1+"',
- '"+var2+"',"+var3+",'"+var4+","+var5+"')";
- stmt = conn.createStatement();
- rs = stmt.executeUpdate(sql);
ParperStatement版
- String sql = "insert into book (bookid,bookname,bookauthor,booksort,bookprice) values (?,?,?,?,?)";
- pstmt = conn.prepareStatement(sql);
- pstmt.setString(1,var1);
- pstmt.setString(2,var2);
- pstmt.setString(3,var3);
- pstmt.setString(4,var4);
- pstmt.setString(5,var5);
- pstmt.executeUpdate();
下面说说第二点优点。ParperStatement提高了代码的灵活性和执行效率。
PrepareStatement接口是Statement接口的子接口,他继承了Statement接口的所有功能。它主要是拿来解决我们使用Statement对象多次执行同一个SQL语句的效率问题的。ParperStatement接口的机制是在数据库支持预编译的情况下预先将SQL语句编译,当多次执行这条SQL语句时,可以直接执行编译好的SQL语句,这样就大大提高了程序的灵活性和执行效率。
最后但也是最重要的一个大大的比Statement好的优点,那就是安全!
你说啥?这还关安全啥事儿,那我给你一行代码,你来给我说说这是干嘛的。
- String sql = "select * from user where username= '"+varname+"' and userpwd='"+varpasswd+"'";
- stmt = conn.createStatement();
- rs = stmt.executeUpdate(sql);
- select * from user where username = 'user' and userpwd = '' or '1' = '1';
- String sql = "select * from user where username= '"+varname+"' and userpwd='"+varpasswd+"'";
- stmt = conn.createStatement();
- rs = stmt.executeUpdate(sql);
文章写到这就结束了。hope can help~
- 浅谈 JDBC 中 CreateStatement 和 PrepareStatement 的区别与优劣。
- 浅谈 JDBC 中 CreateStatement 和 PrepareStatement 的区别与优劣。
- 浅谈 JDBC 中 CreateStatement 和 PrepareStatement 的区别与优劣。
- 浅谈 JDBC 中 CreateStatement 和 PrepareStatement 的区别与优劣。
- JDBC 中 CreateStatement 和 PrepareStatement 的区别与优劣。
- JDBC中prepareStatement 与createStatement 区别
- createStatement与prepareStatement的区别
- JDBC中PrepareStatement与Statement的区别
- JDBC中prepareStatement 和Statement 的区别
- sql中的prepareStatement和createStatement的用法区别
- createStatement()和prepareStatement() 的参数说明
- JDBC中Statement和PrepareStatement的区别及特性
- JDBC中Statement和PrepareStatement的区别及特性
- JDBC中Statement和PrepareStatement的区别及特性
- JDBC中Statement和PrepareStatement的区别及特性
- JDBC中Statement和PrepareStatement的区别及特性
- JDBC中Statement和PrepareStatement的区别及特性
- JDBC中Statement和PrepareStatement的区别及特性
- (线性)单链表的C语言实现--保持有序
- android 7.0 加入 android:directBootAware之关机闹钟无声
- spring cloud之分布式配置(七)
- adobe acrobat x pro破解版
- PLSQL链接oracle报错--ORA-12154: TNS: 无法解析指定的连接标识符
- JDBC 中 CreateStatement 和 PrepareStatement 的区别与优劣。
- tiny4412 busybox制作根文件系统rootfs nfs 挂载 ubuntu 14.04
- java 学习路线
- jquery 使用dialog弹窗显示在整个屏幕上,而不是只遮盖当前的ifream或div,另附dialog中加返回按钮,设置高宽等
- RemoteViews探索
- JS中的函数(二):函数参数(你可能不知道的参数传递)
- 重新开始整本书的学习
- 关于 && 的一点思考
- Linux中安装多个Tomcat并设置开机启动