JDBC简单整理1
JDBC介绍及简单入门
前段时间已经整理过了关于怎么使用JDBC,操作的数据库的博客,包括Oracle和SQL Server,其实用JDBC的方式只是加载驱动和获取连接时不同。其他各种操作基本一致。
特附上博客链接:Java操作数据库、Java操作Oracle
案例:
package com.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
*
* @author Switch
* 功能:Oracle,JDBC测试1
*
*/
public class JDBC1 {
public static void main(String[] args) {
Connection ct = null;
Statement st = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
// 1.加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
// 2.获得连接
ct = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:SWITCH", "scott", "123456");
// 3.创建(PreparedStatement(常用),Statement)
st = ct.createStatement();
// ps = ct.prepareStatement("insert into user1 values(user1_seq.nextval,?,?,?,sysdate,?)");
// 给?赋值
// ps.setString(1, "张三");
// ps.setString(2, "123456");
// ps.setString(3, "zs@123.com");
// ps.setInt(4, 20);
// 4.执行操作
int n = st.executeUpdate("insert into user1 values(user1_seq.nextval,'张三','123456','zs@123.com',sysdate,20)");
// int n = ps.executeUpdate();
if(n != 0){
System.out.println("插入成功");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 先开后闭
if(st != null){
try {
st.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 使用垃圾回收机制回收
st = null;
}
if(ct != null){
try {
ct.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 使用垃圾回收机制回收
ct = null;
}
}
}
}
Connection接口
Connection接口提供了对数据库的连接,通过操作Connection对象,可以进行事务操作,也可以创建Statement,PreparedStatement,CallableStatement,还可以通过所定义的各种成员常量来控制所获取的ResultSet的可操作方式等等。
案例:
package com.jdbc;
import java.sql.*;
import oracle.jdbc.driver.OracleDriver;
public class JDBC3{
//使用jdbc去操作 oracle 数据库
public static void main(String[] args) {
// TODO Auto-generated method stub
Connection ct=null;
Statement statement=null;
try {
//1加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//DriverManager.registerDriver(new OracleDriver());
//2得到连接
ct=DriverManager.getConnection
("jdbc:oracle:thin:@127.0.0.1:1521:orclhsp", "scott", "123456");
//把事务设为不自动提交
ct.setAutoCommit(false);
//3.创建sql对象(Statement / PreparedStatement /CallableStatement)
statement=ct.createStatement();
//4.通过statement向数据库发出sql 指令.
/* int n=statement.executeUpdate
("insert into user1 values(user1_seq.nextval,'张三','123456'," +
"zhangsan@123.com',sysdate,20)"); //executeupdate 执行dml(update/insert/delete)*/
//需求: 对emp表进行操作: 把SMITH 的sal -10 给 KING sal+10
statement.executeUpdate("update emp set sal=sal-10 where ename='SMITH'");
int i=9/0;
statement.executeUpdate("update emp set sal=sal+10 where ename='KING'");
//提交所有事务
ct.commit();
} catch (Exception e) {
e.printStackTrace();
//如果 sql 语句中任何语句错误,则可以整体回滚.
try {
ct.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
// TODO: handle exception
}finally{
//关闭资源[先开后闭];
if(statement!=null){
try {
statement.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
statement=null;//使用垃圾回收.
}
if(ct!=null){
try {
ct.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ct=null;
}
}
}
}
ResultSet
ResultSet接收的是一张表格,通过对其游标(Cursor)的操作可以指向任意一行,再用提供的成员方法对当前行的任意一项进行操作。
PS:在我的理解,ResultSet是结果集的意思,对应于一段查询出来的表格或者结果,通过它可以很方便的获取相应的查询信息,一般来说会将ResultSet进行二次封装成ArrayList集合。
案例:
package com.jdbc;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
*
* @author Switch 功能:测试ResultSet
*
*/
public class JDBC2 {
public static void main(String[] args) {
Connection ct = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
// 1、 获取驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
// 2、 获取连接
ct = DriverManager.getConnection(
"jdbc:oracle:thin:@127.0.0.1:1521:SWITCH", "scott",
"123456");
// 3、创建PreparedStatement,希望rs结果能够滚动,并发时只读
ps = ct.prepareStatement("select * from emp",
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
// 给?赋值
// 4、执行操作
rs = ps.executeQuery();
// 5、操作结果
System.out.println("编号 姓名");
while (rs.next()) {
System.out.println(rs.getInt("EMPNO") + " "
+ rs.getString("ENAME"));
}
// 重新跳转到第一行
rs.beforeFirst();
System.out.println("-------2------");
while (rs.next()) {
System.out.println(rs.getInt("EMPNO") + " "
+ rs.getString("ENAME"));
}
// 定位到第3行
rs.absolute(3);
System.out.println("-------3------");
System.out
.println(rs.getInt("EMPNO") + " " + rs.getString("ENAME"));
// 第3行的前一行
rs.previous();
System.out.println("-------4------");
System.out
.println(rs.getInt("EMPNO") + " " + rs.getString("ENAME"));
// 这几个方法是常用的游标定位方法,要配合
// ps = ct.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE,
// ResultSet.CONCUR_READ_ONLY);使用
// 定位到第几行
// rs.absolute(row);
// 最后一行
// rs.last();
// 是否最后一行
// rs.isLast();
// 最后一行的后一行
// rs.afterLast();
// 第一行
// rs.first();
// 是否第一行
// rs.isFirst();
// 第一行前一行
// rs.beforeFirst();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 先开后闭
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 使用垃圾回收机制回收
rs = null;
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 使用垃圾回收机制回收
ps = null;
}
if (ct != null) {
try {
ct.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 使用垃圾回收机制回收
ct = null;
}
}
}
}