JDBC学习笔记+练习代码
package study;
import java.io.*;
import java.util.*;
import java.sql.*;
import javax.sql.*;
public class JDBCStudy
{
public static void main(String[] args)
{
int id;
String name;
String sex;
String comefrom;
String queryStatement = "select * from jdbcstudy";
String queryPrepare = "select * from jdbcstudy where id = ?";
String queryScroll = "select * from jdbcstudy";
String queryUpdate = "select * from jdbcstudy";
String storedProc = "create procedure SHOW_JDBC_STUDY " +
"@userName Char(10) " +
"as " +
"select * from jdbcstudy " +
"where name = @userName;" ;
String Interval = "/n----------------------------------------------------/n" ;
//创建输出流,将错误信息保存到文件中
String ErrorFileName = "SystemErr.txt";
PrintWriter errLog = null;
PrintStream stdErr = null;
try
{
FileOutputStream errors = new FileOutputStream(ErrorFileName, true);
errLog = new PrintWriter(errors, true);
stdErr = new PrintStream(errors);
}catch(Exception e)
{
System.out.println("Redirection error: Unable to open SystemErr.txt");
}
System.setErr(stdErr);
//------------------------------------------------------------------
System.out.println(Interval);
//------------------------------------------------------------------
try
{
/*
* 游标移动说明:
* next() :向下移动一条记录。
* previous() :向上移动一条记录。
* first() :移动到第一条记录。
* last() :移动到最后一条记录。
* beforeFirst() :移动到第一条记录的前面。
* afterLast() :移动到最后一条记录的后面。
* absolute(int rowNumber) :将游标移动到参数中指定的rowNumber处。
* 如果该值为正,游标从起始位置算起向下移动rowNumber行。
* 如果该值为负,游标从末尾位置算起向上移动rowNumber行。
* relative(int rowNumber) :指定从当前位置按某个方向将游标移动rowNumbwr行。
* 正值向前移动rowNumbwr行。
* 负值向后移动rowNumber行。
*
* 判断是否为指定行:
* isFirst() :判断是否为第一条记录。
* isLast() :判断是否为最后一条记录。
* isBeforeFirst() :判断是否为第一条记录的前面。
* isAfterLast() :判断是否为最后一条记录的后面。
* getRow() :获得当前的行号。
*/
//------------------------------------------------------------------
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/suihu", "root", "suihu");
//使用Statement
System.out.println("使用Statement:");
Statement stmt = con.createStatement();
ResultSet rsStmt = stmt.executeQuery(queryStatement);
while (rsStmt.next())
{
id = rsStmt.getInt("id");
name = rsStmt.getString("name");
sex = rsStmt.getString("sex");
comefrom = rsStmt.getString("comefrom");
System.out.println(id + "/t" + name + "/t" + sex + "/t" + comefrom);
}
//------------------------------------------------------------------
System.out.println(Interval);
//------------------------------------------------------------------
//使用PreparedStatement
System.out.println();
System.out.println("使用PreparedStatement:");
PreparedStatement pstmt = con.prepareStatement(queryPrepare);
pstmt.setInt(1, 1);
ResultSet rsPstmt = pstmt.executeQuery();
while (rsPstmt.next())
{
id = rsPstmt.getInt("id");
name = rsPstmt.getString("name");
sex = rsPstmt.getString("sex");
comefrom = rsPstmt.getString("comefrom");
System.out.println(id + "/t" + name + "/t" + sex + "/t" + comefrom);
}
//------------------------------------------------------------------
System.out.println(Interval);
//------------------------------------------------------------------
//创建可滚动ResultSet
System.out.println();
System.out.println("创建可滚动ResultSet:");
Statement stmtScroll = con.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.TYPE_FORWARD_ONLY);
ResultSet rsScroll = stmtScroll.executeQuery(queryScroll);
ResultSetMetaData rsmdScroll = rsScroll.getMetaData();
int nScrollColumns = rsmdScroll.getColumnCount();
System.out.println("显示列名:");
for (int i = 1; i <= nScrollColumns; i++)
System.out.print(rsmdScroll.getColumnLabel(i) + ((i == nScrollColumns) ? "/n" : "/t"));
System.out.println("向下滚动:");
while (rsScroll.next())
{
for (int i = 1; i <= nScrollColumns; i ++)
System.out.print(rsScroll.getString(i) + ((i == nScrollColumns) ? "/n" : "/t"));
}
System.out.println("向上滚动:");
while (rsScroll.previous())
{
for (int i = 1; i <= nScrollColumns; i ++)
System.out.print(rsScroll.getString(i) + ((i == nScrollColumns) ? "/n" : "/t"));
}
System.out.println("移动到指定记录(2):");
rsScroll.absolute(2);
for (int i = 1; i <= nScrollColumns; i ++)
System.out.print(rsScroll.getString(i) + ((i == nScrollColumns) ? "/n" : "/t"));
System.out.println("向下滚动指定数量(2):");
rsScroll.relative(2);
for (int i = 1; i <= nScrollColumns; i ++)
System.out.print(rsScroll.getString(i) + ((i == nScrollColumns) ? "/n" : "/t"));
//------------------------------------------------------------------
System.out.println(Interval);
//------------------------------------------------------------------
/*
*
* ResultSet更新方法:
*
* 数据类型 方法
* BigDecimal updateBigDecimal(String columnName, BigDecimal x)
* boolean updateBoolean(String columnName, boolean x)
* byte updateByte(String columnName, byte x)
* byte[] updateBytes(String columnName, byte[] x)
* double updateBouble(String columnName, double x)
* float updateFloat(String columnName, float x)
* int updateInt(String columnName, int x)
* java.io.InputStream updateAsciiStream(String columnName, InputStream x, int length)
* java.io.inputStream updateUnicodeStream(String columnName, InputStream x, int length)
* java.io.InputStream updateBinaryStream(String columnName, InputStream x, int length)
* java.sql.Date updateDate(String columnName, Date x)
* java.sql.Time updateTime(String columnName, Time x)
* java.sql.Timestamp updateTimestamp(String columnName, Timestamp x)
* long updateLong(String columnName, long x)
* Object updateObject(String columnName, Object x)
* Object updateObject(String columnName, Object x, int scale)
* short updateShort(String columnName, short x)
* String updateString(String columnName, String x)
* NULL updateNull(String columnName)
*
* 注意:更新完ResultSet中的列值后,必须在移动游标前调用ResultSet的
* updateRow()方法对数据库做持久的改变,因为使用更新方法做的
* 修改只有调用updateRow()后才有效。
*
* 可以调用cancelRowUpdates()方法指定在调用updateRow()前忽略
* 所作的更新。然而,一旦调用updateRow(),cancelRowUpdate()
* 方法不再起作用。
*/
//创建可更新的ResultSet
System.out.println();
System.out.println("创建可更新的ResultSet:");
Statement stmtUpdate = con.createStatement(
ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_UPDATABLE);
ResultSet rsUpdate = stmtUpdate.executeQuery(queryUpdate);
ResultSetMetaData rsmdUpdate = rsUpdate.getMetaData();
if (rsUpdate.getConcurrency() == ResultSet.CONCUR_UPDATABLE)
System.out.println("UPDATABLE");
else
System.out.println("READ_ONLY");
int nUpdateColumns = rsmdScroll.getColumnCount();
for (int i = 1; i <= nUpdateColumns; i++)
System.out.print(rsmdUpdate.getColumnLabel(i) + ((i == nUpdateColumns) ? "/n" : "/t"));
while (rsUpdate.next())
{
if (rsUpdate.getString("name").equals("隋虎"))
rsUpdate.updateString("comefrom", "内蒙古自治区");
else if (rsUpdate.getString("name").equals("金婵"))
rsUpdate.updateString("comefrom", "辽宁省抚顺市");
else
rsUpdate.updateString("comefrom", "辽宁省盘锦市");
rsUpdate.updateRow();
for (int i = 1; i <= nUpdateColumns; i ++)
System.out.print(rsUpdate.getString(i) + ((i == nUpdateColumns) ? "/n" : "/t"));
}
System.out.println("/n插入一新行:");
rsUpdate.moveToInsertRow(); //插入一新行
rsUpdate.updateString("name", "朱凯");
rsUpdate.updateString("sex", "男");
rsUpdate.updateString("comefrom", "辽宁省阜新市");
rsUpdate.insertRow(); //保存插入行
rsUpdate.last();
for (int i = 1; i <= nUpdateColumns; i ++)
System.out.print(rsUpdate.getString(i) + ((i == nUpdateColumns) ? "/n" : "/t"));
System.out.println("/n删除一行:");
rsUpdate.last();
System.out.println(rsUpdate.getString("name"));
rsUpdate.deleteRow(); //删除一行
rsUpdate.last();
System.out.println(rsUpdate.getString("name"));
//------------------------------------------------------------------
System.out.println(Interval);
//------------------------------------------------------------------
//使用CallableStatment
System.out.println();
System.out.println("使用CallableStatment:");
Statement stmtProc = con.createStatement();
stmtProc.executeUpdate(storedProc);
CallableStatement cstmt = con.prepareCall("{call SHOW_JDBC_STUDY(?)}");
cstmt.setString(1, "隋虎");
ResultSet rsCstmt = cstmt.executeQuery();
while (rsCstmt.next())
{
id = rsCstmt.getInt("id");
name = rsCstmt.getString("name");
sex = rsCstmt.getString("sex");
comefrom = rsCstmt.getString("comefrom");
System.out.println(id + "/t" + name + "/t" + sex + "/t" + comefrom);
}
//------------------------------------------------------------------
System.out.println(Interval);
//------------------------------------------------------------------
//关于批列表
System.out.println();
System.out.println("关于批列表:");
con.setAutoCommit(false);
Statement stmtBatch = con.createStatement();
stmtBatch.addBatch("insert into jdbcstudy(name, sex, comefrom) values('田磊', '男', '辽宁')");
stmtBatch.addBatch("insert into jdbcstudy(name, sex, comefrom) values('徐宝珠', '女', '辽宁')");
int[] updateCounts = stmtBatch.executeBatch();
con.commit();
con.setAutoCommit(true);
System.out.println("批列表操作成功");
con.close();
}
catch(ClassNotFoundException cnfe)
{
cnfe.printStackTrace(errLog);
}
catch(BatchUpdateException bue)
{
bue.printStackTrace(errLog);
}
catch(SQLException sqle)
{
sqle.printStackTrace(errLog);
}
}
}