1.解决乱码的问题:
<%@page contentType="text/html;charset=GBK2312"%>
<%request.setCharacterEncoding="GBK";%>
2.JDBC编程步骤:
必须捕获异常try...catch...finally,加注释
(1)load the driver:
a. class.forName()|class.forName().newlnstance()|new DriverName()
b.实例化时自动向driverManager注册
例如,Class.forName("oracle.jdbc.driver.OracleDriver");
(2)connect to the DataBase
Connection conn = DriverManager.getConnection
("jdbc:oracle:thin:@127.0.0.1:1521:ORCL", "scott", "tiger");
(3)Execute The SQL
a. Connection.CreateStatement()
b. Statement.executeQuery()
c.Statement.executeUpdate()
例如,Statement stmt = conn.CreateStatement();
ResultSet rs = stmt.executeQuery("select * from dept");//和数
据库中游标不同的是指针指在第一条记录的顶上
(4)Retrieve the result data
while(r.next()) {
rs.getString("deptno");//rs.getInt("deptno");
}
(5)Show the result data
将数据库中的各种类型转换为java中的类型(getXXX)方法
(6) Close
Close the resultset/close the statement/close the connection
if(rs != null) {
rs.close();
rs = null;
}
if(rs != null) {
stmt.close();
Stmt = null;
}
if(rs != null) {
conn.close();
conn = null;
}
3.复杂的插入语句:(运用不同的statement)
int deptno = 10;
string dname = "sss";
string loc = "ddd";
sql = "insert into dept values ("+deptno+",'"+dname+"','"+loc+"')";//数
值需要不需要单引号,字符串需要
其实这种复杂语句可以简化:灵活指定sql语句中的变量使用 PreparedStatement
例如,PreparedStatement pstmt = conn.prepareStatement("insert into
dept2 values (?,?,?)");
pstmt.setInt(1,deptno);//deptno是上面定义的变量
pstmt.setSting(2,dname);
pstmt.setString(3,loc);
pstmt.executeUpdate();
4.CallableStatement:用来调用存储过程
create or replace procedure
p(v_a in number,v_b number,v_ret out number,v_temp in out
number)
is
begin
if(v_a>v_b) then
v_ret:=v_a;
else
v_ret:=v_b;
end if;
v_temp:=v_temp+1;
end;
调用存储过程:
CallableStatement cstmt = conn.prepareCall("{call p(?, ?,
?, ?)}");
//指定哪些是输出参数,用sql里面的类指定输出类型
cstmt.registerOutParameter(3, Types.INTEGER);
cstmt.registerOutParameter(4, Types.INTEGER);
//设置没有指定的参数值
cstmt.setInt(1, 3);
cstmt.setInt(2, 4);
cstmt.setInt(4, 5);
cstmt.execute();
//得到输出参数值
System.out.println(cstmt.getInt(3));
System.out.println(cstmt.getInt(4));
5.进行批处理:Batch:
//Statement的批处理,插入三条语句
Statement stmt = conn.createStatement();
stmt.addBatch("insert into dept2 values (51, '500',
'haha')");
stmt.addBatch("insert into dept2 values (52, '500',
'haha')");
stmt.addBatch("insert into dept2 values (53, '500',
'haha')");
stmt.executeBatch();
stmt.close();
//PreparedStatement的批处理,插入三条语句
PreparedStatement ps = conn.prepareStatement("insert into
dept2 values (?, ?, ?)");
ps.setInt(1, 61);
ps.setString(2, "haha");
ps.setString(3, "bj");
ps.addBatch();
ps.setInt(1, 62);
ps.setString(2, "haha");
ps.setString(3, "bj");
ps.addBatch();
ps.setInt(1, 63);
ps.setString(2, "haha");
ps.setString(3, "bj");
ps.addBatch();
ps.executeBatch();
6.运用事务处理:transaction:(重要)意思是妖魔不做,要么一次完成。
例如,try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection
("jdbc:oracle:thin:@127.0.0.1:1521:SXT", "scott", "tiger");
conn.setAutoCommit(false);//默认是自动提交,修改
成手动提交
stmt = conn.createStatement();
stmt.addBatch("insert into dept2 values (51,
'500', 'haha')");
stmt.addBatch("insert into dept2 values (52,
'500', 'haha')");
stmt.addBatch("insert into dept2 values (53,
'500', 'haha')");
stmt.executeBatch();
conn.commit();//事物提交
conn.setAutoCommit(true);//又设置回自动提交
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch(SQLException e) {
e.printStackTrace();
try {
if(conn != null)//遇到异常时会滚,同时设
置回自动提交
{
conn.rollback();
conn.setAutoCommit(true);
}
} catch (SQLException e1) {
e1.printStackTrace();
}
}
}
7.JDBC处理可滚动的结果集:
//必须指定对滚动不敏感,否则会逐条执行下去而不能
定位,第二个参数表示只能读不能改
Statement stmt = conn.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stmt
.executeQuery("select * from emp
order by sal");
rs.next();
System.out.println(rs.getInt("empno"));//得到第一
条语句的第一个字段内容
rs.last();
System.out.println(rs.getString(1));//得到最后一
条语句的第一个字段内容
System.out.println(rs.isLast());//是否是最后一行
System.out.println(rs.isAfterLast());//是否是最后
一行的下一行
System.out.println(rs.getRow());//得到行数
rs.previous();//当前行的上一行
System.out.println(rs.getString(1));
rs.absolute(6);//定位到制定行
System.out.println(rs.getString(1));
8.JDBC处理可更新的结果集:(不重要,oracle不支持,要用传统方式修改)
Statement stmt=conn.createStatement
(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);//指定结果
可更新
ResultSet rs=stmt.executeQuery("select * from emp2");
rs.next();
//更新一行数据
rs.updateString("ename","AAAA");
rs.updateRow();
//插入新行
rs.moveToInsertRow();//光标移动到插入行
rs.updateInt(1, 9999);
rs.updateString("ename","AAAA");
rs.updateInt("mgr", 7839);
rs.updateDouble("sal", 99.99);
rs.insertRow();
//将光标移动到新建的行
rs.moveToCurrentRow();
//删除行
rs.absolute(5);
rs.deleteRow();
//取消更新
//rs.cancelRowUpdates();