zoukankan      html  css  js  c++  java
  • 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;">





  • 相关阅读:
    Restful WCF问题总结
    vs2010发布、打包安装程序(超全超详细)
    WCF and Android Part I
    GCC安装及配置
    mysql5.58的编译安装(转)
    源于魔兽!《植物大战僵尸》成功奥秘 (转)
    mysql5.5.8安装问题解决方法(转)
    RHEL5(CentOS)下nginx+php+mysql+tomcat+memchached配置全过程(转)
    已经安装curses,但cmake安装mysql时,依然提示No curses/termcap library found(转)
    centos5安装飞信机器人监控web服务器(转)
  • 原文地址:https://www.cnblogs.com/xuxaut-558/p/10035882.html
Copyright © 2011-2022 走看看