传智播客java学习--jdbc进阶

本文探讨了PreparedStatement与Statement在安全性、执行效率及代码可维护性等方面的区别。通过具体案例展示了PreparedStatement在批量插入数据时的性能优势,并解释了其背后的原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.PreparedStatement与statement比较
 *安全性:PreparedStatement安全,statement不安全
 *批量语句的执行:PreparedStatement执行效率高,statement执行效率低,
 *单条语句的执行:PreparedStatement执行效率低,statement执行效率高,

**********************************
 代码的可读性和可维护性.
 PreparedStatement 能最大可能提高性能:
 DBServer会对预编译语句提供性能优化。因为预编译语句有可能被重复调用,所以语句在被DBServer的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中就会得到执行。
 在statement语句中,即使是相同操作但因为数据内容不一样,所以整个语句本身不能匹配,没有缓存语句的意义.事实是没有数据库会对普通语句编译后的执行代码缓存.这样每执行一次都要对传入的语句编译一次. 
 PreparedStatement能保证安全性

2.利用for循环可以往数据库插入多条记录,
  long begintime=system.currentTimemillis();//开始时间
  可以记录插入多条记录所用的时间;

3.往Oracle数据库插入多条记录,PreparedStatement要比statement的速度快。
 PreparedStatement先将sql语句预编译好,再插入数据库
 而statement每次都要执行编译sql语句

4.用PreparedStatement插入5000条记录,oracle用时3秒,mysql用时109秒,

5.调用数据库中的Store Procedure(存储过程)时,要用到Callable   Statement


************
作业:
1. EL表达式获取真实路径:${pageContext.request.contextPath}
   jsp的request对象获取真时路径<%=request.getrealpath() %>

2.转向:servlet:从当前路径开始查找,
        jsp页面:从应用程序根路径开始找,

3.处理日期:
 java.sql.Date birthday=java.sql.Date.valueof(sbirthday.trim());
 
4. <c:choose>
      <c:when test="${!empty list}">
      </c:when>
       <c:otherwise>
        没有您要查询的数据源
       </c:otherwise>
   
   </c:choose>  
*************************************************
高级查询:
**************
****用Statement
1.建立一个search包,
 方法一:如何组织sql语句,
 select * from employees where username like '%%'
 and sex like '%%'
 
 处理客户端传来的数据:
 if(username!=null||"".equals(username.trim())){
 username="";
 }
 if(sex!=null||"".equals(username.trim())){
 sex="";
 }
 if(edu!=null||"".equals(username.trim())){
 edu="";
 }

 rs.getobject(1)+""+rs.getObject(2)

***方法二**********
1. String sql =select * from employees where 1=1
 
  if(username!=null&&"".equals(username.trim()){
 sql=sql+"and username like '%" +username.trim()+"%' "
 }
  if(sex!=null&&"".equals(sex.trim()){
 sql=sql+" and sex='%"+sex.trim()+"%'"
 }

****方法三*****
1.boolean whereFlag=false;
 
 if(username!=null&&"".equals(username.trim()){
  if(!whereFlag){
 sql=sql+"and username like '%" +username.trim()+"%' ";
 whereFlag=true;
  }else{
   sql=sql+"and username like '%" +username.trim()+"%' ";
   }
  }
****************
*****用PreparedStatement
1.方法一:
 pstmt.setString(1,"%"+username+"%");
 Date类型的空值只能是null;
 select * from eployees where birthday between ? and ? ;
 
******************************************
1.数据库的事务:
 事务的ACID属性
 * 原子性(Atomicity) 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。?
 * 一致性(Consistency) 事务必须使数据库从一个一致性状态变换到另外一个一致性状态。(数据不被破坏)
 * 隔离性(Isolation) 事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他 事务是隔离的,并发执行的各个事务之间不能互相干扰。
 * 持久性(Durability) 持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障 不应该对其有任何影响

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值