一.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();
- 在使用PreparedStatement 对象设置sql语句以及对应的参数后,可以使用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代码,不容易维护;
- 适合于小的项目.