Day40:PreparedStatement和ResultSet

一.PreparedStatement

1.概括:

  • java.sql.PreparedStatement接口;
  • PreparedStatement对象可以执行已经预编译过的sql语句,其sql执行效率比Statement对象的执行效率更高;
  • 通过该对象传递的sql语句可以在执行过程中传递参数;
  • 对于sql中每个输入参数都保留一个问号“?”作为占位符每个?占位符的值必须在该语句执行前被赋值;
  • PreparedStatement接口是通过继承Statement接口实现的。

2.使用:

  • 1、创建PreparedStatement对象
    • String sql=“update teacher set pay=?where id=?”;
    • PreparedStatement ps=con.prepareStatement(sql);
  • 2、传递参数
    • 在执行PreparedStatement对象之前,为每个?赋值
    • 调用PreparedStatement对象的setXXX()方法来完成,其中xxx是和参数相应的类型。
    • 传递参数的时候对应的序号是从1开始,且和sql中的?问号对应
      • ps.setlnt(1,800);
      • ps.setString(2,”1004);
  • 3、执行对应的sql语句
    • 在使用PreparedStatement 对象设置sql语句以及对应的参数后,可以使用executeQuery()方法让其开始执行操作。
      • ps.executeQuery();
  • 4、在PreparedStatement中设置的sql语句可以反复的使用,如果它没有被其它的sql语句覆盖的话。
    • ps=con.prepareStatement(sql2);
    • 如果想清除PreparedStatement 对象中的sql语句可以使用Connection中的clearParameters()方法执行。
      • ps.clearParameters();

二.JDBC2.0后提供的新功能

  • 1、ResultSet对象中指针能够上下自由移动
  • 2、能直接使用Java程序来更新数据库表格的内容。
  • 3、可以一次传递许多sql语句到数据库执行一批处理。
  • 4、进阶数据类型-BLOB和CLOB。

三.ResultSet的随机访问

1. 在JDBC2.0前我们得到statement只通过createStatement()方法,查询得到的结果集只能顺序访问。

2. 从JDBC2.0开始在得到statement对象时增加了两个参数设置,通过这些参数的设置可以决定查询结果集ResultSet是否可以上下自由移动,是只读还是可读写的。

3. 通过createStatement(int Type,int concurrency)throws SQLException的参数来设置。

4. createStatement(int type,int concurrency)的参数说明:
type参数设置ResultSet对象中的指针是否能够上下自由移动;

可选值为:
- TYPE_FORWARD_ONLY:只能使用next方法向下移动指针。
- TYPE_SCROLL_INSENSITIVE:能可上下移动,只能得到当前查询的值。
- TYPE_SCROLL_SENSITIVE:能可上下移动,且能得到临时修改后的数据库值

5. concurrency参数指定ResultSet对象的读写属性。
- CONCUR_READ_ONLY:ResultSet对象对结果集只能读。
- CONCUR_UPDATABLE:ResultSet对象可以直接执行数据库的新增、修改和移除的操作。

6. ResultSet支持的指针方法:

  • rs.previous():将指针移动到此ResultSet对象的上一行。
  • rs.relative(n):如果n是正值,指针向前移,为负指针向后移动。
  • rs.absolute(n):指针设置在某个特定的行号上。
  • int rs.getRow(): ·获得当前的行号。
  • rs.first():指针移到第一行。
  • rs.last():指针移到最后一行。
  • rs.beforeFirst():指针移到第一行的前面。
  • rs.afterLast():指针移到最后一行的后面。
  • rs.isFirst():指针是否在第一行。

四.ResultSet对数据库的直接操作

当我们想让用户能通过程序自动的更新数据库中数据的话,就必须将createStatement(int type,int con)中con参数设置为:CONCUR_UPDATABLE
此时通过statement对象得到的结果集对象ResultSet可直接对数据库进行更新操作

  • resultSet.updateXXX();
  • resultSet.insertRow();
  • resultSet.move ToCurrent();
  • resultSet.deleteRow();

通过ResultSet直接修改记录

  • rs.updatelnt(“age",10);
  • rs.updateRow();
  • rs.cancelRowUpdates();

通过ResultSet直接插入新记录

  • rs.move TolnsertRow();
  • rs.updateString(1,joke");
  • rs.updatelnt(2,12);
  • rs.insertRow();

通过ResultSet直接删除记录

  • rs.absolute(4);
  • rs.deleteRow();

五.对大数据的处理–BLOB和CLOB

使用varchar和varbinary类型数据的缺陷:

  • 1、当初设计时用来储存较小量的数据,而且所拥有的数据容量也有一定的限制,超出容量负荷时,则会有错误发生,以致无法正常运行。
  • 2、从数据库中读取以上两个类型的数据时必须一次读完,特别是超过1MB的数据时,性能比较低下。

解决方法:使用串流来传送数据,串流可以直接抽取某些你真正需要的数据。

  • Blob 指二进制大型对象(Binary Large Object),代表二进制数据对应java.sql.Blob对象。
  • Clob 指字符型大对象(Character Large Object),代表文字数据,对应java.sql.Clob对象。

通过串流的方式存取实际的数据:

  • Blob b=rs.getBlob(1);
  • InputStream bin=b.getBinaryStream();
  • Clob c=rs.getClob(2);
  • Reader charstr=c.getCharacterStream();

分块取得真正需要的数据:

  • Blob b=rs.getBlob(1);
  • Byte[]data=b.getBytes(0,b.length());
  • Clob c=rs.getClob(2);
  • String text=c.getSubString(0,c.length());

二进制数据储存方法:

  • setBinaryStream()
  • setObject()

字符数据储存方法:

  • setAsciStream();
  • setUnicodeStream();
  • setObject();

六.Servlet+JDBC

在servlet中同样可以使用JDBC来进行数据库操步骤:

  • 创建servlet;
  • 在servlet中实现通过jdbc进行的数据库操作;
  • 将编译后的class文件放到web-inf/classes目录下;
  • 在web.xml文件中配置;
  • 测试.

七.JSP+JavaBean+JDBC

在如今的JSP开发中,已经很少直接在JSP页面中写入大量的逻辑代码,而是把访问数据的代码放在JavaBean 或者Servlet中执行。

优点:

  • 页面容易维护
  • 代码也能得到很好的重用

缺点:

  • 虽然JavaBean完成了一定的业务逻辑,但页面中还是嵌入了大量的Java代码,不容易维护;
  • 适合于小的项目.
发布了108 篇原创文章 · 获赞 39 · 访问量 9353

猜你喜欢

转载自blog.csdn.net/qq_40246175/article/details/103060647