1.注册驱动
Class.forname(driverName)
2.建立连接
Connection con=DriverManager.getConnection(url,user,password);
3.创建statement:
a.Statement:执行不带参数的sql语句,创建:connection.createStatement()
b.PreParedStatement:执行带参数或不带参数的预编译的SQL语句, connection.prepareStatement()
c.CallableStatement:调用数据库中的存储过程或函数等等PL/SQL 创建:connection.parpareCall();
4.执行sql语句
statement.executeQuery(); 返回类型ResultSet
statement.executeUpdate();返回类型int,执行此sql语句所影响的记录数。
statement.execute();返回类型boolean,代表执行此语句是否有resultset 返回,有就是ture。
5.处理ResultSet
while(rs.next()){ //每next一次,向下一行。
rs.getString(1);
rs.getInt(2);
}
可以使用位置标识,也可以使用列名来标识.
6.释放资源 所释放的资源有ResultSet,Statement,Connection
finally{
if(xxx!=null){
try{
xxx.close();
}catch(SQLException e){
e.printStackTrace();
}
}
oracle写法:
String driver="oracle.jdbc.driver.OracleDriver";
String url="jdbc:oracle:thin:@127.0.0.1:1521:test";
JDBC事务
- private Connection conn = null;
- private PreparedStatement ps = null;
- try {
- conn.setAutoCommit(false); //将自动提交设置为false
- ps.executeUpdate("修改SQL"); //执行修改操作
- ps.executeQuery("查询SQL"); //执行查询操作
- conn.commit(); //当两个操作成功后手动提交
- } catch (Exception e) {
- conn.rollback(); //一旦其中一个操作出错都将回滚,使两个操作都不成功
- e.printStackTrace();
- }
事务基于链接。 一项事务是指由一条或多条对数据库更新的sql语句所组成的一个不可分割的工作单元。
处理分布式事务,必须有独立于数据库的第三方的事务处理组件。
JavaEE兼容的应用服务器,例如:Weblogic,Websphere,JBoss,Glassfish等都有这种分布式事务处理的组件。
如何使用应用服务器的分布式事务管理器处理分布式事务? 以galssfish为例
1 建立对应两个数据库的XA(javax.sql.XADataSource)类型的数据源。
2 使用UserTransaction来保证分布式事务。
try{
Connection conn1 = datasource1.getConnection();
Connection conn2 = datasource2.getConnection();
UserTransaction ut = getUserTransaction();
ut.begin();
// 插入订单
// 修改库存
ut.commit(); // 成功的情况下,提交更新。
} catch(SQLException ex) {
ut.rollback(); // 失败的情况下,回滚所有的操作
} finally {
conn.close();
}
如何获取UserTransaction呢?
InitialContext ctx = new InitialContext();
UserTransaction tx = (UserTransaction) ctx.lookup("jndi/UserTransaction");
批处理
PreparedStatement ps = null;
try {
conn.setAutoCommit(false); // 应该将其恢复true
ps = conn.prepareStatement("insert into t_user(user, pwd) values(?,?)");
Random r = new Random();
for(int i = 0; i < 1000; i++){
ps.setString(1, String.valueOf(r.nextInt(Integer.MAX_VALUE)));
ps.setString(2, String.valueOf(r.nextInt()));
ps.addBatch();//加入批处理
//ps.executeUpdate();不能与addBatch()同时用 否则会导致记录插入两次
}
int[] results = ps.executeBatch();//执行批处理
conn.commit();
} catch (SQLException e) {
conn.rollback();
throw e;
}finally{
ps.close();
conn.close();
}
连接池 常用的 DBCP和C3P0
1、getConnection中,如果池内没有连接则新建一个,新建的归池管。应该判断如果池内连接全部占用则判断池连接数是否达到最大,如果最大了则阻塞wait,直到有人释放了连接才notify;如果没到,则新建一个连接放在池内并返回
2、用Proxy封装Connection