JDBC学习日记--preparedStatement的使用

PreparedStatement

preparedStatement简介:

preparedStament是Statement的子接口,可以传入带占位符的SQL语句并且提供了补充占位符的方法

PreparedStatement相对于Statement的优点:

  • 代码的可读性和可维护性更高

  • PreparedStatement可最大程度的提高性能

    语句会在被DBServer的编译器编译后的代码被缓存下来,下次调用 时相同的语句就不需要再次编译
    在statement中只要是相同的操作但因为数据内容不一样,整个语句本身不能匹配,没有缓存的意思,每执行一次都得对传入的语句重新编译一次

  • PreparedStatement可以防止SQL注入
    -关于SQL注入下一篇博客会说

代码对比演示:

  • 不用preparedStatement时sql语句要进行拼串操作
public class PreparedStagementDemo {
	public static void main(String[] args) {
	System.out.println("DateBase:");
	//实现一条数据对象的插入操作
	String sql1 = "insert into student3(name,age,birth) values ";
	//进行拼串和更新操作
   	JDBCTools.update1(sql1);
   	System.out.println("End");
   	}
   }
	

JDBCTools类中

public static void update1(String sql) {
  
  Connection conn = null;
  Statement stms = null;
  
  try {
   //得到一个Connection类
   conn = JDBCTools.getConnection();
   //初始化需要插入的数据项
   String name = "JXK1";
   int age = 21;
   Date birth = new Date(new java.util.Date().getTime());
   
   //拼串
   sql = sql + "('"
     + name 
     +"',"
     + age
     +","
     + birth
     +")";
   
   //得到Statement对象
   stms = conn.createStatement();
   
   //执行插入操作
   stms.executeUpdate(sql);
   
  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   //关闭资源
   JDBCTools.closeResource(conn, stms, null);
  }
  
 }

其中得到一个Connection以及关闭资源的操作在上一篇博客中有说到
上一篇博客链接
问题:sql拼串过于繁琐

  • 用PreparedStatement进行拼串操作
public class PreparedStagementDemo {
	public static void main(String[] args) {
		System.out.println("DateBase:");
		String sql2 = "insert into student(name,age) values (?,?)";
		JDBCTools.update2(sql2);
		System.out.println("End");
	}
}

update2函数

public static void update2(String sql) {
  //声明一个Connection对象
  Connection conn = null;
  
  //声明一个PreparedStatement对象
  PreparedStatement preparedStatement = null;
  
  try {  
   //得到Connection对象
   conn = JDBCTools.getConnection();

   //生成一个PreparedStatement对象(参数:String sql)
   preparedStatement = conn.prepareStatement(sql);
   
   //补充占位符
   preparedStatement.setString(1, "tom");
   preparedStatement.setInt(2, 33);
   
   //执行SQL语句(不需要参数)
   preparedStatement.executeUpdate();
   
  } catch (Exception e) {
   e.printStackTrace();
  } finally {
  
  //关闭资源
   JDBCTools.closeResource(conn, preparedStatement, null);
  }
 }
  • 一个加强版的PreparedStatement操作

update3函数

public static void update3(String sql,Object ...args ) {
  //声明一个Connection对象
  Connection conn = null;
  
  //声明一个PreparedStatement对象
  PreparedStatement preparedStatement = null;
  
  
  try {
   //声明一个Connection对象
   conn = JDBCTools.getConnection();

   //生成一个PreparedStatement对象(参数:String sql)
   preparedStatement = conn.prepareStatement(sql);
   
   //对传入进来的边长数组的值逐个进行补充占位
   //占位位下标从一开始
   for (int i = 0; i < args.length; i++) {
    preparedStatement.setObject(i+1, args[i]);
   }
   
   //执行sql
   preparedStatement.executeUpdate();
   
  } catch (Exception e) {
   e.printStackTrace();
  } finally {
  //关闭资源
   JDBCTools.closeResource(conn, preparedStatement, null);
  }
 }

特别的:
PreparedStatement补充占位符时若存在一个date数据项需要占位,它只接收java.sql.Date类型的参数,而java.sql.Date初始化需要一个毫秒数,我们可以通过java.util.Date类得到

Date data= new Date(new java.util.Date().getTime());
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值