Java 数据库操作

JDBC连接数据库

首先要下载Connector/J地址:http://www.mysql.com/downloads/connector/j/

这是MySQL官方提供的连接方式:

解压后得到jar库文件,需要在工程中导入该库文件

下面是百度经验分享方式,不再介绍

[http://jingyan.baidu.com/article/ca41422fc76c4a1eae99ed9f.html]

JDBC操作数据库步骤:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

/**
 * 测试使用JDBC连接oracle数据库
 * @author Administrator
 */
public class JDBCDemo {
    public static void main(String[] args){
        try{
            //加载驱动
            /*
             * 当出现了:
             * java.lang.ClassNotFoundException:
             *  oracle.jdbc.driver.OracleDriver
             *
             * 这个异常时,说明数据库的驱动jar包没有
             * 导入到项目中。
             * 若导入了jar包还报这个错误,大部分原因是
             * 书写的驱动有错误
             */
            Class.forName("oracle.jdbc.driver.OracleDriver");
            /*
             * 第二步:
             * 通过DriverManager获取数据库连接
             * 注意:
             * 导入的包都在java.sql.*
             *
             * DriverManager连接ORACLE时的路径格式
             * jdbc:oracle:thin:@<host>:<port>:<sid>
             *
             * Mysql的路径 端口号通常是:3306
             * jdbc:mysql://<host>:<port>/<dbname>
             */
            Connection conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/test","chuanqi","chuanqi");

            /*
             * 通过Connection创建Statement
             * 用来执行sql语句
             */
            Statement state = conn.createStatement();

            /*
             * 通过Statement执行查询语句
             * 查询emp表中的信息
             * SELECT empno,ename,sal,deptno
             * FROM emp
             */
            String sql = "SELECT empno,ename,sal,deptno " +"FROM emp_fanchuanqi";

            //输出sql,用于检查拼写是否有错误
            System.out.println(sql);
            /*
             * 使用executeQuery来执行DQL语句
             * 并且查询后会得到一个查询结果集
             */
            ResultSet rs = state.executeQuery(sql);
            /*
             * 需要注意的是,ResultSet表示的
             * 是查询结果集,但实际上查询的结果集
             * 在ORACLE数据库服务器上,并没有全部
             * 保存在本地,所以,我们通过ResultSet
             * 的next方法获取下一条记录时,ResultSet
             * 会发送请求至服务端获取数据,若连接已经
             * 关闭,那么会抛出异常。
             */
            while(rs.next()){
                int empno = rs.getInt("empno");
                String ename = rs.getString("ename");
                int sal = rs.getInt("sal");
                int deptno = rs.getInt("deptno");
                System.out.println(
                        empno+","+ename+","+
                        sal+","+deptno);
            }
            //关闭连接
            conn.close();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

创建一个以JDBC连接数据库的程序,包含7个步骤:

1、加载JDBC驱动程序:

在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.lang.Class类的静态方法forName(String className)实现。

  try{
    //加载MySql的驱动类
    Class.forName("com.mysql.jdbc.Driver") ;
    }catch(ClassNotFoundException e){
    System.out.println("找不到驱动程序类 ,加载驱动失败!");
    e.printStackTrace() ;
    }   

成功加载后,会将Driver类的实例注册到DriverManager类中。

2、提供JDBC连接的URL

?连接URL定义了连接数据库时的协议、子协议、数据源标识。

?书写形式:协议:子协议:数据源标识

协议:在JDBC中总是以jdbc开始

子协议:是桥连接的驱动程序或是数据库管理系统名称。

数据源标识:标记找到数据库来源的地址与连接端口。

   jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=gbk ;` 

useUnicode=true:表示使Unicode字符集。如果characterEncoding设置为 gb2312或GBK,本参数必须设置为true 。characterEncoding=gbk:字符编码方式。

3、创建数据库的连接

?要连接数据库,需要向java.sql.DriverManager请求并获得Connection对象,

该对象就代表一个数据库的连接。

?使用DriverManager的getConnectin(String url , String username ,

String password )方法传入指定的欲连接的数据库的路径、数据库的用户名和

密码来获得。

 //连接MySql数据库,用户名和密码都是root
     String url = "jdbc:mysql://localhost:3306/test" ;
     String username = "root" ;
     String password = "root" ;
     try{
    Connection con =
             DriverManager.getConnection(url , username , password ) ;
     }catch(SQLException se){
    System.out.println("数据库连接失败!");
    se.printStackTrace() ;
     }   

4、创建一个Statement

?要执行SQL语句,必须获得java.sql.Statement实例,Statement实例分为以下3 种类型:

1、执行静态SQL语句。通常通过Statement实例实现。

2、执行动态SQL语句。通常通过PreparedStatement实例实现。

3、执行数据库存储过程。通常通过CallableStatement实例实现。

具体的实现方式:

     Statement stmt = con.createStatement() ;
       PreparedStatement pstmt = con.prepareStatement(sql) ;
       CallableStatement cstmt =
                            con.prepareCall("{CALL demoSp(? , ?)}") ;   

5、执行SQL语句

Statement接口提供了三种执行SQL语句的方法:executeQuery 、executeUpdate 和execute

1、ResultSet executeQuery(String sqlString):执行查询数据库的SQL语句,返回一个结果集(ResultSet)对象。

2、int executeUpdate(String sqlString):用于执行INSERT、UPDATE或 DELETE语句以及SQL DDL语句,如:CREATE TABLE和DROP TABLE等

3、execute(sqlString):用于执行返回多个结果集、多个更新计数或二者组合的 语句。

    ResultSet rs = stmt.executeQuery("SELECT * FROM ...") ;
    int rows = stmt.executeUpdate("INSERT INTO ...") ;
    boolean flag = stmt.execute(String sql) ;  

6、处理结果

两种情况:

1、执行更新返回的是本次操作影响到的记录数。

2、执行查询返回的结果是一个ResultSet对象。

? ResultSet包含符合SQL语句中条件的所有行,并且它通过一套get方法提供了对这些 行中数据的访问。

? 使用结果集(ResultSet)对象的访问方法获取数据:

    while(rs.next()){
         String name = rs.getString("name") ;
    String pass = rs.getString(1) ; // 此方法比较高效
     }   

(列是从左到右编号的,并且从列1开始)

7、关闭JDBC对象

操作完成以后要把所有使用的JDBC对象全都关闭,以释放JDBC资源,关闭顺序和声 明顺序相反:

1、关闭记录集

2、关闭声明

3、关闭连接对象

      if(rs != null){   // 关闭记录集
        try{
            rs.close() ;
        }catch(SQLException e){
            e.printStackTrace() ;
        }
          }
          if(stmt != null){   // 关闭声明
        try{
            stmt.close() ;
        }catch(SQLException e){
            e.printStackTrace() ;
        }
          }
          if(conn != null){  // 关闭连接对象
         try{
            conn.close() ;
         }catch(SQLException e){
            e.printStackTrace() ;
         }
          }    

实例应用:

java 链接数据库

package day05;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class FileDemo {
    public static void main(String[] args) {
            System.out.println("Connecting mysql database !");
            Connection conn=null;
            try{
                Class.forName("com.mysql.jdbc.Driver");
                System.out.println("JDBC 加载成功!!!");
            }catch(Exception e){
                System.out.println("JDBC 加载失败!!!");
                e.printStackTrace();
            }

            try{
                conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","jiachangbin1989");
                System.out.println("JDBC 链接成功!!!");
            }catch(Exception e){
                System.out.println("JDBC 链接失败!!!");
                e.printStackTrace();
            }finally{
                try{
                    conn.close();
                    System.out.println("MySQL 数据库关闭成功!!!");
                }catch(Exception e){
                    System.out.println("MySQL 数据库关闭失败!!!");
                    e.printStackTrace();
                }
            }

            System.out.println("程序结束啦");
    }
}

输出为:

Connecting mysql database !
JDBC 加载成功!!!
JDBC 链接成功!!!
MySQL 数据库关闭成功!!!
程序结束啦

Java 对数据库的更新操作

静态输入

package day05;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class FileDemo {
    public static void main(String[] args) {
            System.out.println("Connecting mysql database !");
            Connection conn=null;
            try{
                Class.forName("com.mysql.jdbc.Driver");//首先要加载想要连接的数据库的驱动到JVM
                System.out.println("JDBC 加载成功!!!");
            }catch(Exception e){
                System.out.println("JDBC 加载失败!!!");
                e.printStackTrace();
            }

            Statement stat=null;//声明Statement对象
            String sql="insert into StudentUser(id,name,password,sex,mail,college) values(123456,‘小强‘,‘xiaoqiang‘,‘M‘,‘[email protected]‘,‘信息学院‘)";

            try{
                //提供JDBC连接的URL,创建数据库的连接
                conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","jiachangbin1989");
                System.out.println("JDBC 链接成功!!!");

                stat=conn.createStatement();//实例化Statement对象
                stat.executeUpdate(sql);//执行操作
                System.out.println("插入成功!!!");
            }catch(SQLException e){
                System.out.println("JDBC 链接失败!!!");
                e.printStackTrace();
            }finally{
                try{
                    conn.close();//关闭数据库连接
                    System.out.println("MySQL 数据库关闭成功!!!");
                }catch(SQLException e){
                    System.out.println("MySQL 数据库关闭失败!!!");
                    e.printStackTrace();
                }
            }

            System.out.println("程序结束啦");
    }
}

交互式输入

package day05;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;

public class FileDemo {
    public static void main(String[] args) {
            System.out.println("Connecting mysql database !");
            Scanner scan=new Scanner(System.in);

            System.out.println("请输入账号:");
            int id=scan.nextInt();
            String name,password,sex,mail,college;
            System.out.println("\n请输入name:");
            name=scan.next();
            System.out.println("\n请输入password:");
            password=scan.next();
            System.out.println("\n请输入sex:");
            sex=scan.next();
            System.out.println("\n请输入mail:");
            mail=scan.next();
            System.out.println("\n请输入college:");
            college=scan.next();

            Connection conn=null;
            try{
                Class.forName("com.mysql.jdbc.Driver");//首先要加载想要连接的数据库的驱动到JVM
                System.out.println("JDBC 加载成功!!!");
            }catch(Exception e){
                System.out.println("JDBC 加载失败!!!");
                e.printStackTrace();
            }

            Statement stat=null;//声明Statement对象
            String sql="insert into StudentUser(id,name,password,sex,mail,college) values("+id+",‘"+name+"‘,‘"+password+"‘,‘"+sex+"‘,‘"+mail+"‘,‘"+college+"‘)";

            try{
                //提供JDBC连接的URL,创建数据库的连接
                conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","jiachangbin1989");
                System.out.println("JDBC 链接成功!!!");

                stat=conn.createStatement();//实例化Statement对象
                stat.executeUpdate(sql);//执行操作
                System.out.println("插入成功!!!");
            }catch(SQLException e){
                System.out.println("JDBC 链接失败!!!");
                e.printStackTrace();
            }finally{
                try{
                    conn.close();//关闭数据库连接
                    System.out.println("MySQL 数据库关闭成功!!!");
                }catch(SQLException e){
                    System.out.println("MySQL 数据库关闭失败!!!");
                    e.printStackTrace();
                }
            }

            System.out.println("程序结束啦");
    }
}

规范写法

package day05;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;

public class FileDemo {
    public static final String DBDRIVER="com.mysql.jdbc.Driver";
    public static final String DBURL="jdbc:mysql://localhost:3306/test";
    public static final String DBUSER="root";
    public static final String DBPASSWORD="jiachangbin1989";

    public static void main(String[] args) {
            System.out.println("Connecting mysql database !");
            Scanner scan=new Scanner(System.in);
            System.out.println("请输入账号:");
            int id=scan.nextInt();
            String name,password,sex,mail,college;
            System.out.println("\n请输入name:");
            name=scan.next();
            System.out.println("\n请输入password:");
            password=scan.next();
            System.out.println("\n请输入sex:");
            sex=scan.next();
            System.out.println("\n请输入mail:");
            mail=scan.next();
            System.out.println("\n请输入college:");
            college=scan.next();

            Connection conn=null;
            try{
                Class.forName(DBDRIVER);//首先要加载想要连接的数据库的驱动到JVM
                System.out.println("JDBC 加载成功!!!");
            }catch(Exception e){
                System.out.println("JDBC 加载失败!!!");
                e.printStackTrace();
            }

            Statement stat=null;//声明Statement对象
            String sql="insert into StudentUser(id,name,password,sex,mail,college) values("+id+",‘"+name+"‘,‘"+password+"‘,‘"+sex+"‘,‘"+mail+"‘,‘"+college+"‘)";

            try{
                //提供JDBC连接的URL,创建数据库的连接
                conn=DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD);
                System.out.println("JDBC 链接成功!!!");

                stat=conn.createStatement();//实例化Statement对象
                stat.executeUpdate(sql);//执行操作
                System.out.println("插入成功!!!");
            }catch(SQLException e){
                System.out.println("JDBC 链接失败!!!");
                e.printStackTrace();
            }finally{
                try{
                    conn.close();//关闭数据库连接
                    System.out.println("MySQL 数据库关闭成功!!!");
                }catch(SQLException e){
                    System.out.println("MySQL 数据库关闭失败!!!");
                    e.printStackTrace();
                }
            }

            System.out.println("程序结束啦");
    }
}

接受操作数据库的结果

将查询结果放进ResultSet集中,然后遍历这个集合。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;

public class JDBCDemo {
    public static final String DBDRIVER="com.mysql.jdbc.Driver";
    public static final String DBURL="jdbc:mysql://localhost:3306/test";
    public static final String DBUSER="root";
    public static final String DBPASSWORD="jiachangbin1989";
    public static void main(String[] args){
        Connection conn=null;//声明Connection对象
        Statement stat=null;//声明Statement对象
        ResultSet res=null;//声明ResultSet对象
        int count=0;

        String sql="select id,name,password,sex,mail,college from studentuser;";
        try{
            Class.forName(DBDRIVER);//首先要加载想要连接的数据库的驱动到JVM
            System.out.println("JDBC 加载成功!!!");
        }catch(Exception e){
            System.out.println("JDBC 加载失败!!!");
            e.printStackTrace();
        }
        try{
            //提供JDBC连接的URL,创建数据库的连接
            conn=DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD);
            System.out.println("JDBC 链接成功!!!");
            stat=conn.createStatement();//实例化Statement对象
            res=stat.executeQuery(sql);//执行操作,将结果返回给ResultSet实例
            System.out.println("查询成功!!!");
            while(res.next()){
                count++;
                int id=res.getInt(1);////或者int id=res.getInt("id");
                String name=res.getString(2);
                String password=res.getString(3);
                String sex=res.getString(4);
                String mail=res.getString(5);
                String college=res.getString(6);
                System.out.println(id+"\t"+name+"\t"+password+"\t"+sex+"\t"+mail+"\t\t"+college);
            }
            System.out.println("共查的数据行数为: "+count);
        }catch(SQLException e){
            System.out.println("JDBC 链接失败!!!");
            e.printStackTrace();
        }finally{
            try{
                conn.close();//关闭数据库连接
                System.out.println("MySQL 数据库关闭成功!!!");
            }catch(SQLException e){
                System.out.println("MySQL 数据库关闭失败!!!");
                e.printStackTrace();
            }
        }
        System.out.println("程序结束啦,共查的数据行数为: "+count);
    }
}

预处理操作:PreparedStatement接口

1、Statement对象用于执行不带参数的简单SQL语句。

2、Prepared Statement 对象用于执行预编译SQL语句。

3、Callable Statement对象用于执行对存储过程的调用。

Statement为一条Sql语句生成执行计划,如果要执行两条sql语句

select colume from table where colume=1;

select colume from table where colume=2;

会生成两个执行计划,一千个查询就生成一千个执行计划!

  • 1.PreparedStatement是预编译的,对于批量处理可以大大提高效率.也叫JDBC存储过程
  • 2.使用 Statement 对象。在对数据库只执行一次性存取的时侯,用 Statement 对象进行处理。PreparedStatement对象的开销比Statement大,对于一次性操作并不会带来额外的好处。
  • 3.statement每次执行sql语句,相关数据库都要执行sql语句的编译,preparedstatement是预编译得,preparedstatement支持批处理

preparedstatement

public interface PreparedStatement extends Statement

所以PreparedStatement是Statement子类接口,能够完成Statement的操作。

package preparedstatementDemo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.PreparedStatement;

public class preparedstatementDemo {
    public static final String DBDRIVER="com.mysql.jdbc.Driver";
    public static final String DBURL="jdbc:mysql://localhost:3306/test";
    public static final String DBUSER="root";
    public static final String DBPASSWORD="jiachangbin1989";

    /**
     * 连接数据库
     */
    public Connection connDatabase(){
        Connection conn=null;//声明Connection对象
        try{
            Class.forName(DBDRIVER);//首先要加载想要连接的数据库的驱动到JVM
            System.out.println("JDBC 加载成功!!!");
        }catch(Exception e){
            System.out.println("JDBC 加载失败!!!");
            e.printStackTrace();
        }
        try{
            //提供JDBC连接的URL,创建数据库的连接
            conn=DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD);
            System.out.println("JDBC 链接成功!!!");
        }catch(SQLException e){
            System.out.println("JDBC 链接失败!!!");
            e.printStackTrace();
        }
        return conn;
    }

    /**
     * 使用statement执行SQL语句
     */
    public void statement(){
        Connection conn=null;//声明Connection对象
        Statement stat=null;//声明Statement对象
        try{
            conn=connDatabase();
            stat=conn.createStatement();//实例化Statement对象
            long timel=System.currentTimeMillis();
            for(int i=1;i<50;i++){
                stat.executeUpdate("insert into StudentUser(id,name,password,sex,mail,college) values("+i+",‘xiaoqiangq‘,‘xiaoqiangq‘,‘M‘,‘[email protected]‘,‘xxxy‘)");
            }
            System.out.println("statement耗时 : "+(System.currentTimeMillis()-timel));
        }catch(SQLException e){
            e.printStackTrace();
        }finally{
            try{
                conn.close();//关闭数据库连接
            }catch(SQLException e){
                System.out.println("MySQL 数据库关闭失败!!!");
                e.printStackTrace();
            }
        }
    }
    /**
     * 使用PreparedStatement执行SQL语句
     */
    public void preparedStatement(){
        Connection conn=null;//声明Connection对象
        PreparedStatement perstat=null;//声明PreparedStatement对象
        try{
            conn=connDatabase();
            perstat=conn.prepareStatement("insert into StudentUser(id,name,password,sex,mail,college) values(?,‘xiaoqiangq‘,‘xiaoqiangq‘,‘M‘,‘[email protected]‘,‘xxxy‘)");
            long timel=System.currentTimeMillis();
            for(int i=51;i<=100;i++){
                perstat.setInt(1, i);
                perstat.executeUpdate();
            }
            System.out.println("PreparedStatement耗时 : "+(System.currentTimeMillis()-timel));
        }catch(SQLException e){
            e.printStackTrace();
        }finally{
            try{
                conn.close();//关闭数据库连接
            }catch(SQLException e){
                System.out.println("MySQL 数据库关闭失败!!!");
                e.printStackTrace();
            }
        }
    }
    public static void main(String[] args){
        preparedstatementDemo per=new preparedstatementDemo();
        per.statement();
        per.preparedStatement();
    }
}

preparedStatement的效率明显高于statement。

数据库链接面试题:

比较executeQuery(sql);、executeUpdate(sql);、stat.execute(sql);

首先,用哪一个方法由 SQL 语句所产生的内容决定。

方法executeQuery用于产生单个结果集的语句,例如 SELECT 语句。

方法executeUpdate用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句,例如 CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或 DELETE 语句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一个整数,指示受影响的行数(即更新计数)。对于 CREATE TABLE 或 DROP TABLE 等不操作行的语句executeUpdate 的返回值总为零。使用executeUpdate方法是因为在 createTableCoffees 中的 SQL 语句是 DDL (数据定义语言)语句。创建表,改变表,删除表都是 DDL 语句的例子,要用 executeUpdate 方法来执行。你也可以从它的名字里看出,方法 executeUpdate 也被用于执行更新表 SQL 语句。实际上,相对于创建表来说,executeUpdate 更多时间是用于更新表,因为表只需要创建一次,但经常被更新。

方法execute用于执行返回多个结果集、多个更新计数或二者组合的语句。因为多数程序员不会需要该高级功能execute方法应该仅在语句能返回多个ResultSet对象、多个更新计数或ResultSet对象与更新计数的组合时使用。当执行某个已存储过程

或动态执行未知 SQL 字符串(即应用程序程序员在编译时未知)时,有可能出现多个结果的情况,尽管这种情况很少见。因为方法 execute 处理非常规情况,所以获取其结果需要一些特殊处理并不足为怪。例如,假定已知某个过程返回两个结果集,则在使用方法 execute 执行该过程后,必须调用方法 getResultSet 获得第一个结果集,然后调用适当的 getXXX 方法获取其中的值。要获得第二个结果集,需要先调用 getMoreResults 方法,然后再调用 getResultSet 方法。如果已知某个过程返回两个更新计数,则首先调用方法 getUpdateCount,然后调用 getMoreResults,并再次调用 getUpdateCount。对于不知道返回内容,则情况更为复杂。如果结果是 ResultSet 对象,则方法 execute 返回 true;如果结果是 Java int,则返回 false。如果返回 int,则意味着结果是更新计数或执行的语句是 DDL 命令。在调用方法 execute 之后要做的第一件事情是调用 getResultSet 或 getUpdateCount。调用方法 getResultSet 可以获得两个或多个 ResultSet 对象中第一个对象;或调用方法 getUpdateCount 可以获得两个或多个更新计数中第一个更新计数的内容。

PreparedStatement和Statement的用法区别

1、 PreparedStatement接口继承Statement, PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于 Statement 对象。

2、作为 Statement 的子类,PreparedStatement 继承了 Statement 的所有功能。三种方法execute、 executeQuery 和 executeUpdate 已被更改以使之不再需要参数。

3、在JDBC应用中,如果你已经是稍有水平开发者,你就应该始终以PreparedStatement代替Statement.也就是说,在任何时候都不要使用Statement.

PreparedStatement可读性和可维护性高

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 (?,?,?,?)");
perstmt.setString(1,var1);
perstmt.setString(2,var2);
perstmt.setString(3,var3);
perstmt.setString(4,var4);
perstmt.executeUpdate(); //prestmt是 PreparedStatement 对象实例 

Statement执行SQL语句需要拼接而成,容易产生错误,而使用PreparedStatement则不需要拼接SQL语句,使用?占位符进行占位。

PreparedStatement尽最大可能提高性能

语句在被DB的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中(相当于一个涵数)就会得到执行.这并不是说只有一个Connection中多次执行的预编译语句被缓存,而是对于整个DB中,只要预编译的语句语法和缓存中匹配.那么在任何时候就可以不需要再次编译而可以直接执行.而statement的语句中,即使是相同一操作,而由于每次操作的数据不同所以使整个语句相匹配的机会极小,几乎不太可能匹配。

insert into tb_name (col1,col2) values (‘11‘,‘22‘);
insert into tb_name (col1,col2) values (‘11‘,‘23‘);

即使是相同操作但因为数据内容不一样,所以整个个语句本身不能匹配,没有缓存语句的意义.事实是没有数据库会对普通语句编译后的执行代码缓存。当然并不是所有预编译语句都一定会被缓存,数据库本身会用一种策略,比如使用频度等因素来决定什么时候不再缓存已有的预编译结果.以保存有更多的空间存储新的预编译语句。

PreparedStatement极大地提高了安全性

String sql = "select * from tb_name where name= ‘"+varname+"‘ and passwd=‘"+varpasswd+"‘";

如果我们把[’ or ‘1’ = ‘1]作为varpasswd传入进来.用户名随意,看看会成为什么?

select * from tb_name = ‘随意‘ and passwd = ‘‘ or ‘1‘ = ‘1‘;
因为‘1‘=‘1‘肯定成立,所以可以任何通过验证.更有甚者:
把[‘;drop table tb_name;]作为varpasswd传入进来,则:
select * from tb_name = ‘随意‘ and passwd = ‘‘;drop table tb_name;

有些数据库是不会让你成功的,但也有很多数据库就可以使这些语句得到执行.

而如果你使用预编译语句.你传入的任何内容就不会和原来的语句发生任何匹配的关系.只要全使用预编译语句,你就用不着对传入的数据做任何过虑.而如果使用普通的statement,有可能要对drop,;等做费尽心机的判断和过虑.

时间: 2024-11-09 15:47:47

Java 数据库操作的相关文章

Java数据库操作类演示

只在mysql上测试过,不知道算不算好使?1. [代码][Java]代码     package org.load.demo; import java.io.IOException;import java.util.List;import java.util.Map; import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRe

Java数据库操作

一.JDBC 1.JDBC Java数据库连接,用于Java程序中实现数据库操作功能,java.sql包中提供了执行SQL语句,访问各种数据库的方法,并为各种不同的数据库提供统一的操作接口及类. 2.操作步骤 加载JDBC驱动器,将JDBC驱动加载到classpath中. 加载JDBC驱动,并将其注册到DriverManager中.一般使用反射机制class.forName(String driverName) 建立数据库连接,取得Connection对象.一般通过DriverManager.g

Java数据库操作(MySQL与SQLserver)

在java编程开发中,数据库的开发是重头戏. MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品: SQL Server是由Microsoft开发和推广的关系数据库管理系统(DBMS). Jar包下载 java数据库的连接需要依赖外部jar包,所以需要下载后进行:构建路径->配置构建路径->库->添加JAR->应用->确定 SQLserver: https://blog-static.cnblogs.com/files/d

java数据库操作有关的杂记

一 JDBC就是一些数据库编程的API啦,封装好了一系列的对数据库的操作. JDBC可以创建与数据库的连接,发送sql语句,处理sql语句的返回结果 二 然后,光有JDBC还是不够的 我们还需要java连接数据库的驱动(这个驱动呢,把java和数据库连接起来,相当于是在数据库里面插了一根管子,我的理解,哈哈,驱动这个东西比较底层,原理什么的我现在也不太懂,明白的希望告诉我~) 这个驱动我用的是开源的 jtds类的驱动,把这个jar包放到lib目录下就可以啦~ 三. 然后java程序的db目录下会

java——数据库操作

1.JDBC的驱动程序有几种 1>JDBC-ODBC 依靠ODBC驱动器和数据库通信,将ODBC二进制代码加载到使用该驱动程序的客户机上 2>本地API 把客户机的API上的JDBC调用转换为Oracle,DB2或其他DBMS的调用 3>JDBC网络驱动程序 将JDBC转换为与DBMS无关的网络协议,又被某个服务器转换为一种DBMS协议. 4>本地协议驱动 将JDBC直接转换为DBMS所使用的网络协议,允许客户机上直接调用DBMS服务器 2.存储过程 调用无参数的存储过程 crea

Java数据库操作大全

1.提取单条记录 [java] view plain copy print? //import java.sql.*; Connection con=null; Statement stmt=null; ResultSet %%6=null; try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); String url="jdbc:odbc:"+%%1; con=DriverManager.getConnection

java程序员从笨鸟到菜鸟之(七)一—java数据库操作

 本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 数据库访问几乎每一个稍微成型的程序都要用到的知识,怎么高效的访问数据库也是我们学习的一个重点,今天的任务就是总结java访问数据库的方法和有关API,java访问数据库主要用的方法是JDBC,它是java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法,下面我们就具体来总结一下JDBC 一:Java访问数据库的具体步骤: 1 加载(注册)数

【转载】java数据库操作

数据库访问几乎每一个稍微成型的程序都要用到的知识,怎么高效的访问数据库也是我们学习的一个重点,今天的任务就是总结java访问数据库的方法和有关API,java访问数据库主要用的方法是JDBC,它是java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法,下面我们就具体来总结一下JDBC 一:Java访问数据库的具体步骤: 1 加载(注册)数据库  驱动加载就是把各个数据库提供的访问数据库的API加载到我们程序进来,加载JDBC驱动,并将其注册到Dri

JAVA数据库基本操作 (转)

JAVA数据库基本操作指南   Java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接. 一.取得数据库连接 1.用DriverManager取数据库连接 例子: String     className,url,uid,pwd;        className = "oracle.jdbc.driver.OracleDriver";    url =     "jdbc:oracle:thin:@127.0.0.1:1521: