勿谓今日不学而有来日,勿谓今年不学而有来年。
日月逝矣,岁不我延。

对一个数据库操作Bean的完善 PreparedStatement预处理SQL查询的封装

PreparedStatement的优点

1、PreparedStatement可以写动态参数化的SQL查询

使用PreparedStatement可以写带参数的sql查询语句,通过使用相同的sql语句和不同的参数值来做查询比创建多个静态的查询语句要好的多,可以是变量更加清晰易辨。PreparedStatement查询语句中使用“?”作为占位符而且其索引是从1开始的。

2、PreparedStatement Statement 更快

使用 PreparedStatement 最重要的一点好处是它拥有更佳的性能优势,SQL语句会预编译在数据库系统中。执行计划同样会被缓存起来,它允许数据库做参数化查询。数据库对SQL语句的分析,编译,优化已经在第一次查询前完成了,所以在以后使用这个查询是会大大减少所需要的时间。为了减少数据库的负载,为了获得性能上的优势,应该使用参数化sql查询而不是字符串追加的方式,所以PreparedStatement是更好的选择 。

3、PreparedStatement可以防止SQL注入式攻击

在使用参数化查询的情况下,数据库系统不会将参数的内容视为SQL指令的一部分来处理,而是在数据库完成SQL指令的编译后,才套用参数运行,因此就算参数中含有破坏性的指令,也不会被数据库所运行,从而避免SQL注入式攻击。

PreparedStatement的set方法

set方法用来传递IN参数如:setSting(1,”test”);

使用setObject方法可以完成对PreparedStatement的封装:

        PreparedStatement ps;
         /**
	 * 预处理Sql查询 
	 * @param sql 预处理Sql语句
	 * @param params 参数数组
	 * @return rs 结果集
	 */
	public ResultSet PreparedExecuteQuery(String sql,Object[] params) {
		ResultSet rs=null;	
		if(conn==null) {
			createConn();
		}
		try {
			ps=conn.prepareStatement(sql);
			for(int i=0;i<params.length;i++) {
				ps.setObject(i+1, params[i]);
			}
			rs=ps.executeQuery();
		}catch(Exception e) {
			
		}
		return rs;
	}

DataBaseConn的完善

将以上代码加入 简单登录系统的实现 基于MVC设计模式 中的DataBaseConn中便可以方便的调用。

将PreparedStatement和Statement声明为全局变量,再写入close方法:

public void ClosePreparedStatement() {
		try
		{
			ps.close();
		} catch (SQLException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

public void CloseStatement() {
		try
		{
			stmt.close();
		} catch (SQLException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

完整的数据库操作Bean

package cn.llanc.bean;
import java.sql.*;
public class DataBaseConn
{
	public Connection conn=null;
	PreparedStatement ps;
	Statement stmt;
	public Connection getConn() {
		if(conn==null) {
			createConn();
		}
		return conn;
	}
	//创建连接
	public void createConn() {
		String url="jdbc:mysql://127.0.0.1:3306/bookmanager?useSSL=false";
		String user="root";
		String password="root";
		
		if(conn==null) {
			try {
				Class.forName("com.mysql.jdbc.Driver");
				conn=DriverManager.getConnection(url, user, password);
			}catch(Exception e){
				
			}
		}		
	}
	/**
	 * 静态Sql查询
	 * @param sql
	 * @return rs结果集
	 */
	public ResultSet executeQuery(String sql) {
		ResultSet rs=null;
		if(conn==null) {
			createConn();
		}
		try {
			stmt=conn.createStatement();
			rs=stmt.executeQuery(sql);
		}catch(Exception e) {
			
		}
		return rs;
	}
	public void CloseStatement() {
		try
		{
			stmt.close();
		} catch (SQLException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	/**
	 * 预处理Sql查询 
	 * @param sql 预处理Sql语句
	 * @param params 参数数组
	 * @return rs 结果集
	 */
	public ResultSet PreparedExecuteQuery(String sql,Object[] params) {
		ResultSet rs=null;	
		if(conn==null) {
			createConn();
		}
		try {
			ps=conn.prepareStatement(sql);
			for(int i=0;i<params.length;i++) {
				ps.setObject(i+1, params[i]);
			}
			rs=ps.executeQuery();
		}catch(Exception e) {
			
		}
		return rs;
	}
	public void ClosePreparedStatement() {
		try
		{
			ps.close();
		} catch (SQLException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	//更新
	public void executeUpdate(String sql) {
		if(conn==null) {
			createConn();
		}
		try {
			Statement stmt=conn.createStatement();
			stmt.executeUpdate(sql);
		}catch(Exception e) {
			
		}
	}
        /**
	 * 预处理查询
	 * @param sql语句
	 * @param 参数数组
	 * @return 受影响的行数
	 */
	public int preparedExecuteUpdate(String sql,Object[] params) {
		int count=0;	
		if(conn==null) {
			createConn();
		}
		try {
			ps=conn.prepareStatement(sql);
			for(int i=0;i<params.length;i++) {
				ps.setObject(i+1, params[i]);
			}
			count=ps.executeUpdate();
		}catch(Exception e) {
			e.printStackTrace();
		}
		return count;
	}
	//关闭连接
	public void closeConn() {
		if(conn!=null) {
			try {
				conn.close();
				conn=null;				
			}catch(SQLException e) {
				
			}
		}
	}
}

 

 

赞(0)
未经允许不得转载:喋喋不休 » 对一个数据库操作Bean的完善

评论 1

评论前必须登录!

 

  1. #1

    使用params数组元素依次对占位符传递IN参数

    llanc10个月前 (11-21)

精品网站

有券无忧电脑壁纸精选