st=null;
}
if (conn!=null) {
conn.close();
conn=null;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
几个知识点
PreparedStatement
其实Statement本身已经够用了,不过有点不方便,哪里不方便
看下面的例子:
我想将一条数据插入到
数据库中如下
String name="董磊峰";
int id=16;
String sql="insert into admininfo (Aname,Aid) values('"+name+"',"+id+") ";
st.executeUpdate(sql); 大家不觉得生成那个sql语句很麻烦吗 你少写一个'都有可能出错。
所以有了PreparedStatement,它也是一个接口,继承自Statement。
其用法为
String name="董磊峰2";
int id=18;
String sql="insert into admininfo (Aname,Aid) values( , )";
PreparedStatement st=conn.prepareStatement(sql);
st.setString(1, name); //给第一个栏位注入String型的数值name 这个不是从0开始
st.setInt(2, id);
st.execute(); 用若干个 代替要插入的字符,比上面的sql清楚多了,不是吗
批处理问题
如果我想执行多条sql语句怎么办
使用Statement
String name="董磊峰2";
int id=154;
int id2=487;
String sql="insert into admininfo (Aname,Aid) values('"+name+"',"+id+") ";
String sql2="insert into admininfo (Aname,Aid) values('"+name+"',"+id2+") ";
System.out.println(sql);
st=conn.createStatement();
st.executeUpdate(sql);
st.executeUpdate(sql2); 使用PretaredStatement
String name="董磊峰2";
int id=48;
String sql="insert into admininfo (Aname,Aid) values( , )";
System.out.println(sql);
st=conn.prepareStatement(sql);
st.setString(1, name);
st.setInt(2, id);
st.execute();
st=conn.prepareStatement(sql);
st.setString(1, name);
st.setInt(2, id+1);
st.execute(); 似乎都不是太方便
看新的方法
使用Statement
st=conn.createStatement();
st.addBatch("insert into admininfo (Aname,Aid) values('"+name+"',"+id+") ");
st.addBatch("insert into admininfo (Aname,Aid) values('"+name2+"',"+id2+") ");
st.executeBatch(); 使用PretaredStatement
String sql="insert into admininfo (Aname,Aid) values( , )";
System.out.println(sql);
st=conn.prepareStatement(sql);
st.setString(1, name);
st.setInt(2, id);
st.addBatch();
st.setString(1, name+"ss");
st.setInt(2, id+15);
st.addBatch();
st.executeBatch(); 会用即可,这里不必深究。
Transaction
Transaction我们一般翻译成会话,就是一个不可分割的多条(或一条)sql语句,在一个Transaction中,这些sql语句要么全部执行成功,要么一个也不执行。
它有什么用 还用解释么 想想银行。
在jdbc中,默认一个sql语句就是一个transaction。
看看代码
try{
conn.setAutoCommit(false);
st=conn.createStatement();
st.addBatch("insert into admininfo (Aname,Aid) values('"+name+"',"+id+") ");
st.addBatch("insert into admininfo (Aname,Aid) values('"+name2+"',"+id2+") ");
st.executeBatch();
conn.commit();
conn.setAutoCommit(true); //用完了得改回去
}catch(Exception e){
if(conn!=null){
conn.rollBack(); //sql代码撤销
conn.setAutoCommit(true); //还得改回去
}
}
可滚动的结果集
String sql="select * from admininfo order by Aid";
st=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
rs=st.executeQuery(sql);
/* admininfo 表内容
* Aid Aname
15 dlf
16 董磊峰
18 董磊峰2
48 董磊峰2
49 董磊峰2
55 董磊峰2
154 董磊峰2
155 董磊峰2
487 董磊峰2
1599 董磊峰2ss
2000 董磊峰2
2015 董磊峰2ss
3000 董磊峰2666
8000 董磊峰2hhhh
10001 wyf
10002 zrk
*/
rs.absolute(4);
System.out.println("第4 "+ rs.getInt("Aid"));
System.out.println("第几条 "+ rs.getRow());
rs.first();
System.out.println("第一个 "+ rs.getInt("Aid"));
rs.last();
System.out.println("最后一个 "+ rs.getInt("Aid"));
System.out.println("总数 "+ r