JAVA入门到精通-第65讲-sql server JDBC

int i=sm.executeUpdate()
 
 
--ResultSet结果集
rs表示结果集的游标;指向第一行记录的最上面;指向头
rs.next ( ) 取出第一条;
rs.getInt(1)  
 
需要首先需要rs.next();
这会导致rs游标向下指一下;
rs.getInt(1)
rs.getString(2)
 
 
这时,rs可以取出数据库中需要的信息了;
 
---预编译
statement 把sql语句发送给数据库
数据库拿到sql,会对sql语句解释和编译;
速度会有一定的影响,数据库会 慢很多;
 
preparedstatement 预编译
(1)减轻数据库的压力,先把sql语句编译 成二进制,
然后把结果发送数据库,这时数据库立即执行,不需要编译;
(2)有智能记忆功能,有缓存;会把压力减轻;
将来数据库是并发的;胖服务器,应该把压力分散给应用程序,
缓解数据库的压力;
电驴,下载的时候自己客户端是服务器;
(3)有效防止漏洞注入;
 
--SQL注入漏洞
 
 
or 1='1'
本身是一个漏洞;
 
--PreparedStatement
 
查询:
ps.setInt(1, 20);             查编号为20的
ps.setString(2, "dd");     查询地址为dd的
部门号为20 ,地址在dd的结果;
 
Preparedstatement通过?机制,防止漏洞注入;
 
parepareStatement不会有任何结果,防止注入漏洞;
 
最好不用字符拼接的方式去执行,用问号?机制去执行编程
--------------------
---------------------
 
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+"	"+b+"	"+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;">





原文地址:https://www.cnblogs.com/xuxaut-558/p/10035882.html