思路:
a.statement和预处理sql语句的性能比较。//oracle机制完成
b.调用存储过程实现某一功能模块
c.高级查询。多条件查询。主要实现思路:拼接sql语句和模糊查询结合。
d.多表连接高级查询。添加多表连接条件。只不过不能再用dbutile的query简单方法。必须重写接口ResultSetHandler并出入到query方法中,不能使用new BeanListHandler(clazz)方式进行查询。
Statement VS PreparedStatement 比较
5000条数据:前者7秒 后者3秒
代码的可读性和可维护性.
PreparedStatement 能最大可能提高性能:
DBServer会对预编译语句提供性能优化。因为预编译语句有可能被重复调用,所以语句在被DBServer的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中就会得到执行。
在statement语句中,即使是相同操作但因为数据内容不一样,所以整个语句本身不能匹配,没有缓存语句的意义.事实是没有数据库会对普通语句编译后的执行代码缓存.这样每执行一次都要对传入的语句编译一次.
PreparedStatement能保证安全性
单条语句的执行:
PreparedStatement执行效率比statement执行率低
调用存储过程
Connection conn=null;
DBManager dBManager=new DBManager();
CallableStatement cstmt=null;
conn=dBManager.getConnection();
String sql="{call insertdept(?,?,?)}";
try {
//创建一个 CallableStatement 对象来调用数据库存储过程
cstmt=conn.prepareCall(sql);
cstmt.setInt(1, 34);
cstmt.setString(2, "ppp");
cstmt.setString(3, "beijing");
//在此 PreparedStatement 对象中执行 SQL 语句,该语句可以是任何种类的 SQL 语句
cstmt.execute();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
dBManager.closeResourece(conn, cstmt, null);
}
高级查询精华详解
查询条件:
String username=""; //request.getParameter("username");
String sex=""; //request.getParameter("sex");
String edu=""; //request.getParameter("edu");
Date beginDate=null;//request.getParameter("beginDate");
Date endDate=null;//request.getParameter("endDate");
随意拼接,并按要求查询出结果
方法一:拼接sql字符串,如果查询条件为”” 则用“%%”来处理,但问题是时间类型的数据没法处理
//重点如何组成复合条件的sql语句
//处理客户端传递过来的数据
if(username==null||"".equals(username.trim())){
username="";
}
String sql="select id,username,realname,sex,birthday, edu,"+
"hiredate from employees "+
" where username like '%"+username+"%' and sex like '%"+sex+"%' and edu like '%"+edu+"%'";
方法二:拼接sql字符串,如果查询条件为”” 则不添加该字段,精华:where 1=1 防止出错!!但问题是时间类型的数据没法处理
String sql="select id,username,realname,sex,birthday, edu,"+
"hiredate from employees where 1=1 ";
//判断字段是否存在,如果不存在则不添加
if(username!=null&&!"".equals(username.trim())){
sql=sql+" and username like '%"+username.trim()+"%'";
}
方法三:拼接sql字符串,如果查询条件为”” 则不添加该字段,精华:用一个boole变量来标示sql语句中是否存在where关键字防止出错!!但问题是时间类型的数据没法处理
String sql="select id,username,realname,sex,birthday, edu,"+
"hiredate from employees";
boolean whereFlag=false; //表示没有where
if(username!=null&&!"".equals(username.trim())){
if(!whereFlag){
sql=sql+" where username like '%"+username.trim()+"%'";
whereFlag=true;
}else{
sql=sql+" and username like '%"+username.trim()+"%'";
}
}
if(sex!=null&&!"".equals(sex.trim())){
if(!whereFlag){
sql=sql+" where sex = '"+sex.trim()+"'";
whereFlag=true;
}else{
sql=sql+" and sex = '"+sex.trim()+"'";
}
}
方法四:绝对经典。精华:拼接sql如果查询条件不存在则不加入.用预编译的prepareStatement来处理sql语句,用list集合来存储sql语句中需要的对应参数,及其对应的参数类型.
List paramsList=new ArrayList();
List<Integer> typeList=new ArrayList<Integer>();
String sql="select id,username,realname,sex,birthday, edu,"+
"hiredate from employees "+
" where 1=1";
if(username!=null&&!"".equals(username.trim())){
sql=sql+ " and username like ?";
paramsList.add("%"+username+"%");
typeList.add(java.sql.Types.VARCHAR);
}
if(sex!=null&&!"".equals(sex.trim())){
sql=sql+ " and sex = ?";
paramsList.add(sex);
typeList.add(java.sql.Types.VARCHAR);
}
if(edu!=null&&!"".equals(edu.trim())){
sql=sql+ " and edu like ?";
paramsList.add("%"+edu+"%");
typeList.add(java.sql.Types.VARCHAR);
}
//当开始日期和结束日期都不为null的时候,才执行查询
if(beginDate!=null&&endDate!=null){
sql=sql+" and birthday between ? and ?";
paramsList.add(beginDate);
typeList.add(java.sql.Types.DATE);
paramsList.add(endDate);
typeList.add(java.sql.Types.DATE);
}
//list转化为对象数组 返回按适当顺序包含列表中的所有元素的数组(从第一个元素到最后一个元素)。
Object[] params=paramsList.toArray();
//
Integer[] type=new Integer[typeList.size()];
//toArray(Integer[] type)
typeList.toArray(type);
System.out.println("^^^ "+sql);
DBManager dbManager =new DBManager();
Connection conn=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
conn=dbManager.getConnection();
pstmt=conn.prepareStatement(sql);
if(params!=null&¶ms.length>0){
for(int i=0;i<params.length;i++){
//使用给定对象设置指定参数的值。第二个参数必须是 Object 类型
pstmt.setObject(i+1, params[i],type[i]);
}
}
rs=pstmt.executeQuery();
while(rs.next()){
System.out.println(rs.getObject(1)+" "
+rs.getObject(2)+" "+rs.getObject(3)+" "
+rs.getObject(4)+" "+rs.getObject(5)+" "
+rs.getObject(6)+" "+rs.getObject(7));