JAVA入门到精通-第65讲-sql server JDBC
int i=sm.executeUpdate()
![](https://img2018.cnblogs.com/blog/1167156/201811/1167156-20181129001149334-1321450132.png)
![](https://img2018.cnblogs.com/blog/1167156/201811/1167156-20181129001149621-142933056.png)
--ResultSet结果集
rs表示结果集的游标;指向第一行记录的最上面;指向头;
![](https://img2018.cnblogs.com/blog/1167156/201811/1167156-20181129001149886-512483032.png)
rs.next ( ) 取出第一条;
![](https://img2018.cnblogs.com/blog/1167156/201811/1167156-20181129001150206-1871898660.png)
rs.getInt(1)
![](https://img2018.cnblogs.com/blog/1167156/201811/1167156-20181129001150429-1202836305.png)
![](https://img2018.cnblogs.com/blog/1167156/201811/1167156-20181129001152145-1383572647.png)
![](https://img2018.cnblogs.com/blog/1167156/201811/1167156-20181129001152429-1378263749.png)
需要首先需要rs.next();
这会导致rs游标向下指一下;
rs.getInt(1)
rs.getString(2)
![](https://img2018.cnblogs.com/blog/1167156/201811/1167156-20181129001152828-611950622.png)
![](https://img2018.cnblogs.com/blog/1167156/201811/1167156-20181129001153154-155436989.png)
这时,rs可以取出数据库中需要的信息了;
---预编译
statement 把sql语句发送给数据库
数据库拿到sql,会对sql语句解释和编译;
速度会有一定的影响,数据库会 慢很多;
preparedstatement 预编译,
(1)减轻数据库的压力,先把sql语句编译 成二进制,
然后把结果发送数据库,这时数据库立即执行,不需要编译;
(2)有智能记忆功能,有缓存;会把压力减轻;
将来数据库是并发的;胖服务器,应该把压力分散给应用程序,
缓解数据库的压力;
电驴,下载的时候自己客户端是服务器;
(3)有效防止漏洞注入;
--SQL注入漏洞
![](https://img2018.cnblogs.com/blog/1167156/201811/1167156-20181129001153470-43509263.png)
![](https://img2018.cnblogs.com/blog/1167156/201811/1167156-20181129001154271-892439483.png)
or 1='1'
本身是一个漏洞;
--PreparedStatement
![](https://img2018.cnblogs.com/blog/1167156/201811/1167156-20181129001154575-1873763491.png)
![](https://img2018.cnblogs.com/blog/1167156/201811/1167156-20181129001155218-1192845663.png)
查询:
ps.setInt(1, 20); 查编号为20的
ps.setString(2, "dd"); 查询地址为dd的
部门号为20 ,地址在dd的结果;
Preparedstatement通过?机制,防止漏洞注入;
parepareStatement不会有任何结果,防止注入漏洞;
最好不用字符拼接的方式去执行,用问号?机制去执行编程;
--------------------
![](https://img2018.cnblogs.com/blog/1167156/201811/1167156-20181129001156030-438012270.png)
---------------------
![](https://img2018.cnblogs.com/blog/1167156/201811/1167156-20181129001156292-1491587126.png)
java程序操作sql server
Statement和PreparedStatement的区别(1)
Statement和PreparedStatement都可以用于把sql语句从java程序中发送到指定数据库,并执行sql语句,但是他们也存在区别:
1、直接使用Statement,驱动程序一般不会对sql语句作处理而直接交给数据库;使用PreparedStamen,形成预编译的过程,并且会对语句作字符集的转换(至少在sql server)中如此。
如此,有两个好处:对于多次重复执行的语句,使用PreparedStament效率会更高一点,并且在这种情况下也比较适合使用batch;另外,可以比较好地解决系统的本地化问题。
2、PreparedStatement还能有效的防止危险字符的注入,也就是sql注入的问题。
PreparedStatement的使用[Sql_test2.java]
/** * PreparedStatement使用CRUD * 1、PreparedStatement可以提高执行效率(因为它有预编译的功能) * 2、PreparedStatement可以防止SQL注入,但是要求用?赋值的方式才可以 */ package com.sqlserver; import java.sql.*; public class Sql_test2 { public static void main(String[] args) { Connection ct=null; PreparedStatement ps=null; ResultSet rs=null; try { //1、加载驱动(把需要的驱动程序加入内存) Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //2、得到连接(指定连接到哪个数据源、数据库的用户名和密码) ct=DriverManager.getConnection("jdbc:odbc:mytest","sa","sa"); //3、创建PreparedStatement //PreparedStatement用处:主要用于发送SQL语句到数据库 ps=ct.prepareStatement("select * from dept where deptno=? and loc=?"); //给?赋值(可防止SQL注入漏洞问题),不要直接使用拼接的方式 ps.setInt(1, 20); ps.setString(2, "dallas"); //演示:查询,显示所有的部门信息 //ResultSet结果集,大家可以把ResultSet理解成返回一张表行的结果集 rs=ps.executeQuery(); //循环取出 while(rs.next()){ int a=rs.getInt(1); String b=rs.getString(2); System.out.println(a+"\t"+b+"\t"+c); } //使用PreparedStetement添加一条记录 ps=ct.prepareStatement("insert into dept values(?,?,?)"); ps.setInt(1, 60); ps.setString(2, "安全部"); ps.setString(3, "上海"); //执行 int i=ps.executeUpdate(); if(i==1){ System.out.println("添加成功"); }else{ System.out.println("添加失败"); } //使用PreparedStetement修改一条记录从dept表中修改loc=上海 deptno改为50 ps=ct.prepareStatement("update dept set deptno=? where loc='上海'"); ps.setInt(1, 50); //执行 int i=ps.executeUpdate(); if(i==1){ System.out.println("修改成功"); }else{ System.out.println("修改失败"); } //使用PreparedStetement删除一条记录 ps=ct.prepareStatement("delete from dept where deptno=?"); ps.setInt(1, 50); int i=ps.executeUpdate(); if(i==1){ System.out.println("删除成功"); }else{ System.out.println("删除失败"); } } catch (Exception e) { e.printStackTrace(); }finally{ //关闭资源,关闭顺序先创建后关闭,后创建先关闭 try { if(rs!=null){ rs.close(); } if(ps!=null){ ps.close(); } if(ct!=null){ ct.close(); } } catch (SQLException e) { e.printStackTrace(); } } } }
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">