24.Java核心技术—JDBC
1.Jdbc是Java平台访问数据库的唯一底层API,先看看几个典型的数据库连接方法,如mckoi、postgresql,mysql,oracle等数据库。
2.在连接数据库时,先要指定数据源url和驱动drivers,以及连接数据库用的用户名user和密码password,
如对于mckoi:drivers=com.mckoi.JDBCDriver url=jdbc:mckoi://localhost/
postgresql: drivers=org.postgresql.Driver url=jdbc:postgresql:COREJAVA
mysql: drivers=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/databasename
oracle: drivers=oracle.jdbc.driver.OracleDriver url=jdbc:oracle:thin:@localhost:1521:databasename
3.连接数据库时用的相关类和接口:DriverManager类是个工具类,帮助管理驱动,得到一个Connection对象。Connection接口代表数据库连接,可以把它看成是一个数据库。Statement接口,代表数据库的操作对象。ResultSet接口,代表查询结果。类和接口的使用方法如下:
Connection con=DriverManager.getConnection(url,user,password);
Statement sta=con.createStatement();
ResultSet rs=sta.executeQuery(sql);//执行select查询时使用的方法。
int count=sta.executeUpdate(sql)//执行insert、update、delete或DLL的语句(create table).返回受影响的记录总数。
boolean b=sta.execute(sql)//执行任何的sql语句,该语句如果返回一个结果集则返回true,这个方法既可以查询也可以更新。调用这个方法后,我们可以通过调
用sta.getResultSet和getUpdateCount()方法得到语句的执行结果。
4.我们要注意在连接数据库的时候,不能直接获得Connection对象,而是首先要先进行驱动加载。如Class.forName(drivers)或通过命令行参数的方式设置,即
java -Djdbc.drivers=com.mysql.jdbc.Driver
5. 使用Connection、Statement、ResultSet接口的时候要注意,每个Connection对象都可以创建一个或一个以上Statement对象,同一个Statement对象可以
用于多个不相关的命令和查询,但是一个Statement对象最多只能打开一个结果集。如果需要执行多个查询操作,且需要同时分析查询结果,那么必须要创建多个
Statement对象。最后使用完这些对象后要调用close关 闭。
6. 预备语句,PreparedStatement接口,它的意思就是对sql语句进行预处理,当我们要进行查询操作的时候,我们在对sql语句里的宿主变量赋值。如
String sql="select id,name age from Student where id=?",当我们要进行查询操作的时候,就给id一个值。而Statement每进行一次操作就要重写sql语句。
7.可滚动结果集和可更新结果集:可滚动结果集就是说对我们得到的结果集可以上下移动,可以得到结果集任何位置的值;可更新结果集,就是说如果结果集的值更新了
那么它可以自动的把更新的值存储到数据库中,不需要进行相应的操作来存储,反之亦然。
得可滚动和可更新结果集的方法:Statemet sta=con.createStatement(type,concurrency)
获得预备语句:PreparedStatement ps=con.prepareStatement(sql,type,concurrency),其中type表示是否可滚动,concurrency表示是否可更新。
type有TYPE_FORWARD_ONLY(结果集不能滚动)、TYPE_SCROLL_INSENSITIVE(可滚动,但对数据库变化不敏感)、
TYPE_SCROLL_SENSITIVE(可滚动,但对数据库变化不敏感)三个值。
concurrency有COUCUR_READ_ONLY(不可更新)、CONCUR_UPDATEBLE(可更新)两个值。
8.事物:将一组数据库操作变成原子操作。我们在进行jdbc的时候,如果要用到事物,首先要关闭自定提交机制,con.setAutoCommit(false);如果所有的数据库操作
都成功了,就手动提交。con.commit();如果有一个操作失败,就要回滚开始的时候,con.rollback()。当然,如果操作都成功我们也可以回滚。
1)保存点:它可以更好的控制回滚操作。创建一个保存点意味着稍后只需返回到这个点,而非事物的开头。
Statement stat=conn.createStatement();
stat.executeUpdate(command1);
Savepoint svpt=conn.setSavepoint();//设置保存点,回滚的时候,只返回到这里
stat.executeUpdate(command2);
if(....)conn.rollback(svpt);
.....
conn.commit();
2)批量更新:实例如下
Statement:Statement stat=conn.createStatement();
String command="create table...";
stat.addBatch(command);
while(...){command="insert into ...values ("+...+")"; stat.addBatch(command);}
int[] counts=stat.executeBatch();
PreparedStatement : PreparedStatement ps=con.prepareStatement(sql);
while(.....){
s.setXXX(1,XXX);
ps.setXXX(2,XXX);
ps.addBatch();}
ps.executeBatch();