怎么创建JDBC语句对象来执行SQL语句(详解)

JDBC执行SQL语句:

一旦获得了链接,我们可以与数据库进行交互。JDBC Statement和PreparedStatement 接口定义了使 您能发送SQL命令并从数据库 进行接收数据的方法和属性。

1.Statement:创建语句对象

在使用Statement对象执行SQL语句之前,需要使用Connection对象的createStatement()方法来创建

在创建Statement对象后,可以使用Connection对象的createStatement()方法来执行 一个SQL语句,其中有三个执行方法

其1.boolean execute(String SQL):

如果可以检索到ResultSet对象,则返回一个布尔值true,否则,返回false;使用此方法执行SQL  DDL语句或需要使用真正的动态SQL。

其2.  int executeUpate(String  SQL):返回受SQL语句 影响的行数。使用此方法执行预期会影响多个行的SQL语句,例如 insert、update、或delete语句

其3.Result

关闭Statement对象(如果先关闭Connection对象,她也会关闭Statement对象。但是,应始终显示关闭Statement对象,以保证正确清理)。

2.SQL 注入

就是通过把SQL命令插入到web表单提交或输入域名或页面请求的查询字符串,最终达到欺负服务器执行恶意的SQL语句。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在web表单输入(恶意的)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计师意图去执行SQL语句。比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击。

3.PreparedStatement

该PreparedStatement的接口扩展了Statement接口,它提供了一个通用的Statement对象有两个优点附加功能。此语句可以动态的提供参数。

关闭PreparedStatement对象。

	String string="insert student values(?,?,?)";
			ps=connection.prepareStatement(string);
                        
                        ps.setInt(1,stu.getId());
			ps.setString(2, stu.getName());
			ps.setInt(3, stu.getSid());

JDBC 中的所有参数都由?表示,这被称为参数标记。在执行SQL语句之前,必须为每个参数提供值。

所述的setXXX()方法将值绑定到所述参数,其中XXX代表要绑定到输入参数的值的java数据类型。如果忘记提供值,将收到一个SQLException。

每个参数标记的由其顺序位置引用,。第一标记表示位置1,下一个位置2等等。该方法与java数组索引不同,java是从0开始。

4.ResultSet对象:

Result语句是从数据库中选择行并在结果集中查看行的标准方法。该java.sql.ResultSet中的接口表示结果集数据库查询。

ResultSet对象维护指向结果集中当前行的游标。术语“结果集”是指包含在ResultSet对象中的行和列的数据。

如果没有制定任何ResultSet类型,将自动获得一个typeforwardonly。

ResultSet.typeforwardonly   光标只能在结果集中向前移动。

ResultSet.typescrollinsensitive    光标可以向前移动和向后移动,结果集对创建结果集后发生的数据库的其他更改不敏感。

ResultSet.typescrollsensitive    光标可以向前和向后移动,结果集对创建结果集之后发生的其他数据库的其他更改敏感。

5.JDBC(java  database   Connection)

(1)常用API:

1.DriverManager类

public  static  Connection  getConnection(String url,String user,String  password)

//获取数据库连接对象

2.Connection(数据库连接对象)

//用增来举例
String string=“insert student  values(?,?,?)”;
PreparedStatement  ps=Connection.PrepareStatement(string);
//将SQL语句通过Connection对象的PrepareStatement方法传给数据库

3.PreparedStatement(表示预编译的SQL语句的对象,使用此对象操作数据库)

setInt(int ParameterIndex,int x)//将指定参数设置为给定java的int值
//注意:parameterIndex第一个参数是1 
setFloat(int parameterIndex,float x)
setDouble(int parameeterIndex,double x)
int executeUpdate()//执行增、删、改操作。返回:影响表中记录的行数
ResultSet  executeQuery()//执行查询操作 返回:ResultSet结果集
void close()//关闭操作对象

4.ResultSet (表示 结果集的数据表)

boolean next()  //将光标从当前位置向下移一行。ResultSet光标最初位于第一行之前;
                //返回:如果新的当前行有效,则返回true

通过结果集的列标签获取值
int getInt(String columnLable)
String getString(String columnLable)
double getDouble(String columnLable)

Class.forName("org.gjt.mm.mysql.driver");//加载驱动程序
  connection =DriverManager,getConnection("url","user","password");
    

5.JDBC操作数据库的具体步骤:以在student表中增加一列为例

import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import com.mysql.jdbc.Connection;

public class stuUtil {//创建增删改查
	private static Connection connection=null;
	//该对象表示与数据库之间的物理连接
	private static PreparedStatement ps=null;//创建一个对象
	
	//创建一个方法专门来获取链接
	public static Connection getConnection() {
		//先加载驱动
		try {
			Class.forName("org.gjt.mm.mysql.Driver");
			//再获取链接
			connection=(Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "root", "123456");
		
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();//打印报错信息
		}
		return connection;
	}
	//增
	public static void Zeng(stu stu) {
		getConnection();//调用方法获取链接
		try {
			String string="insert student values(?,?,?)";
			ps=connection.prepareStatement(string);
			//
			ps.setInt(1,stu.getId());
			ps.setString(2, stu.getName());
			ps.setInt(3, stu.getSid());
			int executeUpdate = ps.executeUpdate();
			System.out.println(executeUpdate);
			} catch (Exception e) {
			// TODO: handle exception
		}finally {
			close();
		}
	}	
	//删
	public static void shan(int tt) {
		getConnection();
		try {
			String string="delete from student where id="+tt;
			ps=connection.prepareStatement(string);
			int executeUpdate = ps.executeUpdate();
			System.out.println(executeUpdate);
		} catch (Exception e) {
			// TODO: handle exception
		}finally {
			close();
		}
	}
	//改
	public static void Update(int a,int b) {//将a改成b
		getConnection();
		try {
			String string="update student set id="+b+" where sid="+a;
			ps= connection.prepareStatement(string);
			int executeUpdate = ps.executeUpdate();
			System.out.println(executeUpdate);
		} catch (Exception e) {
			// TODO: handle exception
		}finally {
			close();
		}
	}
	//查
	public static ArrayList<stu> read(){
		getConnection();
		ArrayList<stu> arrayList = new ArrayList<stu>();
		try {
			String string="select * from student";
			ps=connection.prepareStatement(string);
			//查询
			ResultSet rset = ps.executeQuery();
			while(rset.next()) {
				stu ss=new stu(rset.getInt("id"),rset.getString("name"),rset.getInt("sid"));
				arrayList.add(ss);
			}
		} catch (Exception e) {
			// TODO: handle exception
		}finally {
			close();
		}
		return arrayList;
	}
	//关闭
	public static void close() {
		if(connection!=null) {
			try {
				connection.close();
			} catch (Exception e) {
				// TODO: handle exception
			}
		}
	}
}

猜你喜欢

转载自blog.csdn.net/Feng0811xin/article/details/84345455
今日推荐