最刚烈的区分,就是实行的sql语句格式差异。我们往上放两段代码来看看她们的区分把:

代码背景:我们有多个数据库,里面有多个user表,有username,userpwd两列。大家要得到消息这两列的数额。

那是利用CreateStatement方法创设了stmt对象,再通过他询问的生龙活虎部分语句片段。

String sql = "select * from users where  username= '"+username+"' and userpwd='"+userpwd+"'";
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);

  而上面则是运用了PrepareStatement方法创设了pstmt对象,再通过这些目的查询的一片段语句片段。

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能够巩固代码的可读性。

 

  3、Statement 与 PreparedStatement的区别(摘录自):

1.语法不相同

Statement只辅助静态编写翻译,SQL语句是写死的。

PreparedStatement支持预编写翻译,用?号来占位。

2.效用差别

Statement每便都要发送一条SQL语句,不支持缓存,推行效能低。

PreparedStatement补助预编写翻译,缓存在数据库,只需发送参数,实施作用快。

3.安全性不相同

Statement轻松被注入。

流入:圆滑的成员得以编写特殊的SQL语句来侵袭数据库。

比如:要查询有些客户的音信

相像景色:SELECT * FROM user_list where username=xxx and
password=xxx;(这里的xxx本应该为顾客填写自个儿的客户名和密码)

流入景况:SELECT * FROM user_list where username=’abc’ or 1=1 —
password=xxx;

与此相类似1=1恒等,况且在password前增进了“–”号,前边的剧情成为领会说不被实行。也正是说,那样就能够不用密码地查询全数的顾客音信。

PreparedStatement,因为规定了SQL语句中的参数,所以可防止御流入。

先说下那俩到底是干啥的呢。其实那俩干的体力劳动都无差别,就是创建了三个对象然后去通过对象调用executeQuery方法来推行sql语句。说是CreateStatement和PrepareStatement的界别,但其实说的正是Statement和PrepareStatement的差距,相信我们在英特网黄金年代度看见过非常多那方面包车型客车质地和博客,笔者在那提几点,我们看看过的,就当重纪念,没见到就当补充~上边最初斟酌他们的差别。

二、数据库访谈步骤

  在Java中年老年是数据库进行的访谈重要有以下多少个步骤:

  1. 加载数据库驱动
  2. 注册数据库驱动
  3. 树立到数据库的连天
  4. 做客数据库

  首先,要调用Class.ForName()加载并登记mysql驱动程序类,加载驱动程序驱动类后,要求登记驱动程序类的一个实例,DriverManager类负担管理驱动程序,那么些类提供了registerDriver()方法来注册驱动程序类的实例,况兼大家不供给亲自调用那么些点子,因为Drive接口的驱动程序类都包蕴了静态代码块,在此个代码块中会调用registerDriver()方法来注册本身的三个实例。

  然后调用DriverManager类的getConnection方法创制到数据库的连年。在创设连接后,须要对数据库举行访问。在java.sql包中定义了七个接口:Statement、PrepareStatement和CallableStatement,分别对应分裂的调用格局。此中:  

  Statement:用于履行静态的sql语句。

  PrepareStatement:从Statement接口继承而来,它的靶子表示一条预编写翻译过的sql语句,通过调用Connection对象的prepareStatement()方法获得。

  CallableStatement:用于实施sql存款和储蓄进度,该接口从PrepareStatement接口世襲而来,通过调用Connection对象的prepareCall()方法得到CallableStatement对象。

  完整的访谈数据库代码如下:

package com.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class CreateDB
{
    public static void main(String[] args)
    {
        String url="jdbc:mysql://localhost:3306";
        String user="root";
        String password="281889";
        String driverclass="com.mysql.jdbc.Driver";//JDBC类名
        try
        {
            //加载JDBC驱动,当这个类被加载时,类加载器会执行该类的静态代码块从而注册驱动程序的一个实例
            Class.forName(driverclass);  

            //建立数据库的连接
            Connection conn=DriverManager.getConnection(url,user,password);

            //访问数据库
            Statement stmt=conn.createStatement();
            stmt.execute("use information_schema");
            int i=0;
            ResultSet rs1=stmt.executeQuery("SELECT * FROM information_schema.SCHEMATA where SCHEMA_NAME='student'");
            while(rs1.next())  //判断是否含有student数据库
                i++;
            if(i==0)
                stmt.executeUpdate("create database student");

            stmt.executeUpdate("use student");

            int j=0;
            ResultSet rs2=stmt.executeQuery("select * from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='student' and TABLE_NAME='stuinfo' ");
            while(rs2.next()) //判断数据库中是否含有stuinfo表
                j++;
            if(j==0)
                stmt.executeUpdate("create table stuinfo(sno INT not null primary key,name VARCHAR(50) not null,age int,sex VARCHAR(50))");

            stmt.addBatch("insert into stuinfo values(0420,'阿斌',25,'男')");
            stmt.executeBatch();
            stmt.close();
            stmt=null;
            conn.close();
            conn=null;
        } 
        catch (ClassNotFoundException e)
        {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        } 
        catch (SQLException e)
        {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }
    }
}

  Statement 对象用于将 SQL
语句发送到数据库中。实际上有两种 Statement
对象,它们都看成在加以连接上执行SQL语句的包容器:Statement、PreparedStatement(它从 Statement
世袭而来卡塔尔和CallableStatement(它从 PreparedStatement
继承而来卡塔 尔(阿拉伯语:قطر‎。它们都专项使用于发送特定项指标 SQL 语句:Statement
对象用于推行不带参数的粗略 SQL 语句;PreparedStatement
对象用于实行带或不带参数的预编写翻译 SQL 语句;CallableStatement
对象用于实行对数据库已囤积进度的调用。

 三、要点表达

风流倜傥、先来讲说,什么是java中的Statement:Statement是java履行数据库操作的贰个第一艺术,用于在曾经创制数据库连接的功底上,向数据库发送要实践的SQL语句。具体步骤:

4、决断mysql中是否已存在某数据库:

  stmt.execute("use information_schema");
   int i=0;
   ResultSet rs1=stmt.executeQuery("SELECT * FROM information_schema.SCHEMATA where SCHEMA_NAME='student'");
   while(rs1.next())  //判断是否含有student数据库
      i++;
   if(i==0)
     stmt.executeUpdate("create database student");

Statement作用会更加高级中学一年级些。实施SQL语句是可以带参数的,并扶持批量实施SQL。由于使用了Cache机制,则预编写翻译的口舌,就能够放在Cache中,后一次实践同一的SQL语句时,则可以平素从Cache中抽取来。

  5、判别数据库中是否已存在某表:

  int j=0;
   ResultSet rs2=stmt.executeQuery("select * from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='student' and TABLE_NAME='stuinfo' ");
   while(rs2.next()) //判断数据库中是否含有stuinfo表
      j++;
   if(j==0)
      stmt.executeUpdate("create table stuinfo(sno INT not null primary key,name VARCHAR(50) not null,age int,sex VARCHAR(50))");

 

  

  1.率开头入java.sql.*;这个包。

  2、ResultSet对象

  ResultSet对象以逻辑表格的花样封装了施行数据库操作的结果集,其指标保险了四个目的性当前数据行的游标,初步状态下游标在率先行此前,能够由此next()方法移动游标到下黄金年代行。

下边说说第二点优点。ParperStatement进步了代码的狡滑和实践效用。

PrepareStatement接口是Statement接口的子接口,他继续了Statement接口的具备机能。它根本是拿来缓慢解决大家选拔Statement对象往往实行同二个SQL语句的成效难题的。ParperStatement接口的编制是在数据库援助预编写翻译的景况下优先将SQL语句编写翻译,当数十次推行那条SQL语句时,可以直接实践编写翻译好的SQL语句,那样就大大升高了前后相继的面面俱到和推行功效。

 

一、概述

  本文首要介绍Java接连数据库的大旨方法和步骤,并对中间的多少个要点举行简易表达。

  简单来说,总计如下:Statement每一次执行sql语句,数据库都要进行sql语句的编写翻译,最棒用于仅试行一回查询并回到结果的情况,作用抢先PreparedStatement.但存在sql注入风险。PreparedStatement是预编写翻译实践的。在进行可变参数的一条SQL时,PreparedStatement要比Statement的频率高,因为DBMS预编写翻译一条SQL当然会比数十三回编写翻译一条SQL的频率高。安全性越来越好,有效卫戍SQL注入的难点。对于多次重复推行的口舌,使用Prepared

  1、execute(String sql)、executeUpdate(String sql)和executeQuery(String sql)的区别:

  execute:试行回来三个结果集的sql语句。

  Returns:true if the first
result is a ResultSet object

       false if it is an update count or there are no
results

  executeUpdate:试行相似insert、update或然delete的sql语句。

  Returns:(1) the row count for SQL
Data Manipulation Language (DML) statements

        (2) 0 for SQL statements that return nothing     

   executeQuery:实行钦赐的sql语句,再次来到叁个ResultSet对象,用于查看实施的结果。

   Returns:a ResultSet object that
contains the data produced by the given query;“

  ps:executeQuery重返的ResultSet永世都不会为null