好像写一些总结性的东西,但是真得貌似没有什么可写的,不过为了培养一种习惯,就算是记流水账也要写一下,不然一直都不动笔,一直拖,可能以后都不会写了。
今天的早上把我做的一个学生管理系统从mysql上面迁移到Oracle上,本来在学校一直都是使用mysql的,没有用过其他的数据库,但是现在公司要使用Oracle,所以花费了好大力气,安装了Oracle10g,老实说,oracle跟mysql在很大程度上是差不多的,都是sql语句,但是也有不同,比如说那句坑爹的分页查询,以前在mysql中是要limit就可以了,但是在oracle中就不的不使用子查询,嵌套了一个select,但是说的也奇怪,oracle的分页语句查询是必须要把需要查找的记录前面的记录都找出来才能够截取自己想要的那部分,这样的话,如果是有好多条数据的话,速度不就很慢了吗?我实在是搞不懂,谁能跟我说一下一般的解决方法,还是有另外的其他方法可以查找到自己想要的数据?
子查询代码:
select t2.* from (select rownum r,t1.* from student t1 where rownum<=5) t2 where t2.r>10;
下午的时候,重构了一下分页方法的代码,很装B的使用了一下java的反射,希望可以完全的把后面的数据库操作方法完全独立出来,以后可以重复使用,本来还不好意思贴出来的,写到这里还是贴出来,请大家给点意见:
public class DaoImpl implements Dao { DB db = new DB(); private Connection conn ; private boolean flag = false ; public DaoImpl(){ conn = this.db.getConnection(); } /** * 分页 * @param sql 分页语句 * @param sqlForCount 统计记录数语句 * @param currentPage 当前页 * @param pageSize 每页多少条数据 * @param clazz 操作POJO实体的class * @param beanValueClazz 信息设值对象(自定义类),入口方法名必须是:getBean(ResultSet rs,Class clazz) * @param request request对象 * @return 分页数据 */ @SuppressWarnings("unchecked") publicList findList(String sqlForList,String sqlForCount, int currentPage, int pageSize,Class clazz,Class beanValueClazz,HttpServletRequest request) { List list = new ArrayList(); int totalPage=0,totalCount=0; try { Statement stmtForCount = this.conn.createStatement(); ResultSet rsForCount = stmtForCount.executeQuery(sqlForCount); if(rsForCount.next()){ //总记录数 totalCount =Integer.parseInt(rsForCount.getString(1)); } rsForCount.close(); stmtForCount.close(); //总页数 totalPage = (totalCount+pageSize-1)/pageSize; Statement stmt = this.conn.createStatement(); ResultSet rs = stmt.executeQuery(sqlForList); while(rs.next()){ Class c = Class.forName(beanValueClazz.getName()); Method method = c.getDeclaredMethod("getBean",ResultSet.class,Class.class); Object[] args = {rs,clazz}; list.add(method.invoke(c.newInstance(),args)); } rs.close(); stmt.close(); this.conn.close(); } catch (Exception e) { e.printStackTrace(); } request.setAttribute("currentPage", currentPage); request.setAttribute("totalCount", totalCount); request.setAttribute("totalPage", totalPage); request.setAttribute("pageSize", pageSize); return list; }} beanValue.java的入口方法:public Object getBean(ResultSet rs,Class clazz){ Object obj = null; if(clazz==Student.class){ obj = getStudent(rs); } return obj; } public Student getStudent(ResultSet rs){ Student student = new Student(); try{ student.setSNo(rs.getString("SNo")); student.setSName(rs.getString("SName")); student.setSSex(rs.getString("SSex")); student.setSNation(rs.getString("SNation")); }catch(SQLException e){ e.printStackTrace(); } return student; }servlet中的调用语句:findList(sql,sqlForCount,currentPage,pageSize,Student.class,beanValue.class,request);