JDBC基本操作



        引言:如果搞java JDBC肯定是常用的,也是非常基础的,所谓基础也就是核心。每次想到JDBC也只是知道个大概,对于详细的细节也不是很清楚,所以今天就整理了下JDBC的一些操作,包括增删改查和批量插入,希望能对大家、对自己有所用处...

JDBC工作原理
1.装载驱动程序:(实例化时自动向DriverManager注册(DriverManager.registerDriver())
  <1>.Class.forName(driver)
  <2>.Class.forName(driver).newInstance()
  <3>.new driver()
 2.取得数据库连接(Connect to the DataBase)
  <1>.用DriverManager取数据库连接
     Connection cn = DriverManager.getConnection(url,uid,pwd);
  <2>.用jndi(java的命名和目录服务)方式:多用于jsp
      Context ctx = (Context) new InitialContext().lookup("java:comp/env");
                DataSource ds = (DataSource) ctx.lookup(jndi);
      Connection cn = ds.getConnection();
 3.执行sql语句(Execute the SQL)
  <1>.用Statement来执行sql语句(主要是不带参的SQL)
                Statement sm = cn.createStatement();
      sm.executeQuery(sql); // 执行数据查询语句(select)
     sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)
 <2>.用PreparedStatement来执行sql语句(带参SQL)
      String  sql  = "insert into CUSTOMER(id,name) values (?,?)";
                PreparedStatement ps = cn.prepareStatement(sql);
               ps.setInt(1,xxx);
                ps.setString(2,xxx);
               ...
               ResultSet rs = ps.executeQuery(); // 查询
              int c = ps.executeUpdate(); // 更新
 <3>.用PreparedStatement来执行sql语句(批量更新或删除SQL)
      PreparedStatement pstmt  =  con.prepareStatement("UPDATE EMPLOYEES  SET SALARY = ? WHERE ID = ?");
         for(int i =0;i<length;i++){
                  pstmt.setBigDecimal(1, param1[i]);
                  pstmt.setInt(2, param2[i]);
                  pstmt.addBatch();
          }
          pstmt. executeBatch();
  <4>.用CallablePrepareStatement来调用存储过程
     CallableStatement cstmt = con.prepareCall("{call getTestData(?, ?)}");
      cstmt.registerOutParameter(1, java.sql.Types.TINYINT);
      cstmt.registerOutParameter(2, java.sql.Types.DECIMAL, 3);
      cstmt.executeQuery();
      byte x = cstmt.getByte(1);
      java.math.BigDecimal n = cstmt.getBigDecimal(2, 3);

4.事务的处理(JDBC的事务处理简单,在执行多条更新语句后,加cn.commit()或cn.rollback()就可以)
  <1>.关闭Connection的自动提交
     connection.setAutoCommit(false);

 <2>.执行一系列sql语句:执行新sql前,以前的Statement(或PreparedStatemet)须close
      Statement sm ;
            sm = cn.createStatement(insert into user...);
            sm.executeUpdate();
            sm.close();
            sm = cn.createStatement("insert into corp...);
            sm.executeUpdate();
            sm.close();

 <3>.提交
     cn.commit();
  <4>.如果发生异常,回滚:
      cn.rollback();
 5.处理执行结果:
 <1>.查询语句,返回记录集ResultSet
  <2>.更新语句,返回数字,表示该更新影响的记录数(0,表示未更新,-1表示更新失败)
  <3>.ResultSet的方法:while(re.next())
          next(),将游标往后移动一行,如果成功返回true;否则返回false
          getInt("id")或getSting("name"),返回当前游标下某个字段的值
6.关闭数据库连接
 rs.close();
  ps.close(); /stat.close();
  con.close();


不多说了,直接看代码,下面来看一些比较完整的例子:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBC_Test {
 // 创建静态全局变量
 static Connection conn;
 public static void main(String[] args) {
  insert(); //插入添加记录
  update(); //更新记录数据
  delete(); //删除记录
  query(); //查询记录并显示
  insertByBatchNoPara();//批量插入
  insertByBatchWithPara();//批量插入
 }
 
 /* 插入数据记录,并输出插入的数据记录数*/
 public static void insert() {
  
  conn = getConnection(); // 首先要获取连接,即连接到数据库

  try {
   String sql = "INSERT INTO staff(name, age, sex,address, depart, worklen,wage)"
     + " VALUES ('Tom1', 32, 'M', 'china','Personnel','3','3000')"; // 插入数据的sql语句
   
   Statement st =  conn.createStatement(); // 创建用于执行静态sql语句的Statement对象
   
   int count = st.executeUpdate(sql); // 执行插入操作的sql语句,并返回插入数据的个数
   
   System.out.println("向staff表中插入 " + count + " 条数据"); //输出插入操作的处理结果
   
   conn.close(); //关闭数据库连接
   
  } catch (SQLException e) {
   System.out.println("插入数据失败" + e.getMessage());
  }
 }
 
 /* 更新符合要求的记录,并返回更新的记录数目*/
 public static void update() {
  conn = getConnection(); //同样先要获取连接,即连接到数据库
  try {
   String sql = "update staff set wage='2200' where name = 'lucy'";// 更新数据的sql语句
   
   Statement st =  conn.createStatement(); //创建用于执行静态sql语句的Statement对象,st属局部变量
   
   int count = st.executeUpdate(sql);// 执行更新操作的sql语句,返回更新数据的个数
   
   System.out.println("staff表中更新 " + count + " 条数据");  //输出更新操作的处理结果
   
   conn.close(); //关闭数据库连接
   
  } catch (SQLException e) {
   System.out.println("更新数据失败");
  }
 }

 /* 查询数据库,输出符合要求的记录的情况*/
 public static void query() {
  
  conn = getConnection(); //同样先要获取连接,即连接到数据库
  try {
   String sql = "select * from staff";  // 查询数据的sql语句
   Statement st =  conn.createStatement(); //创建用于执行静态sql语句的Statement对象,st属局部变量
   
   ResultSet rs = st.executeQuery(sql); //执行sql查询语句,返回查询数据的结果集
   System.out.println("最后的查询结果为:");
   while (rs.next()) { // 判断是否还有下一个数据
    
    // 根据字段名获取相应的值
    String name = rs.getString("name");
    int age = rs.getInt("age");
    String sex = rs.getString("sex");
    String address = rs.getString("address");
    String depart = rs.getString("depart");
    String worklen = rs.getString("worklen");
    String wage = rs.getString("wage");
    
    //输出查到的记录的各个字段的值
    System.out.println(name + " " + age + " " + sex + " " + address
      + " " + depart + " " + worklen + " " + wage);
   
   }
   conn.close(); //关闭数据库连接 
  } catch (SQLException e) {
   System.out.println("查询数据失败");
  }
 }

 /* 删除符合要求的记录,输出情况*/
 public static void delete() {
  conn = getConnection(); //同样先要获取连接,即连接到数据库
  try {
   String sql = "delete from staff  where name = 'lili'";// 删除数据的sql语句
   Statement stmt =  conn.createStatement(); //创建用于执行静态sql语句的Statement对象,st属局部变量
   int count = st.executeUpdate(sql);// 执行sql删除语句,返回删除数据的数量
   System.out.println("staff表中删除 " + count + " 条数据\n"); //输出删除操作的处理结果 
   conn.close(); //关闭数据库连接
  } catch (SQLException e) {
   System.out.println("删除数据失败");
  }
 }
 
 public static void insertByBatchNoPara() {
   conn = getConnection(); //同样先要获取连接,即连接到数据库
   con.setAutoCommit(false); // 关闭自动执行 
   try {
    Statement stmt = con.createStatement(); //sql不带参数时使用Statement
    String sql="";
   for(i=0;i<10000;i++){
    sql="INSERT INTO table1 VALUES ("+i+")";
    stmt.addBatch(sql); 
    if(i%100==0){//100条提交一次
    stmt.executeBatch(); // 提交一批要执行的更新命令 
    stmt.clearBatch();//清空stmt
   }   
 }
  stmt.executeBatch(); // 提交一批要执行的更新命令 
  conn.commit(); //由于关闭了自动提交所以此处需要手动提交
  }catch(SQLException e){
  System.out.println("批量插入数据失败");
   }fianlly{
   try{
   conn.close(); //关闭数据库连接
   }catch(SQLException e){
   System.out.println("数据库连接关闭失败");
   } 
   }
 }
 
 
 public static void insertByBatchWithPara() {
   conn = getConnection(); //同样先要获取连接,即连接到数据库
   con.setAutoCommit(false); // 关闭自动执行 
   try {
    PrepareStatement stmt = null; 
    String sql="";
   for(i=0;i<10000;i++){
    sql="INSERT INTO table1 VALUES (?)";
    stmt = con.prepareStatement(sql); //sql带参数时使用PrepareStatement
    stmt.setInt(1,i);
    stmt.addBatch(); 
    if(i%100==0){//100条提交一次
    stmt.executeBatch(); // 提交一批要执行的更新命令 
    stmt.clearBatch();//清空stmt
   }   
 }
  stmt.executeBatch(); // 提交一批要执行的更新命令 
  conn.commit(); //由于关闭了自动提交所以此处需要手动提交
  }catch(SQLException e){
  System.out.println("批量插入数据失败");
   }fianlly{
   try{
   conn.close(); //关闭数据库连接
   }catch(SQLException e){
   System.out.println("数据库连接关闭失败");
   } 
   }
 }
 
 
 /* 获取数据库连接的函数*/
 public static Connection getConnection() {
  Connection con = null; //创建用于连接数据库的Connection对象
  try {
   Class.forName("com.mysql.jdbc.Driver");// 加载Mysql数据驱动
   
   con = DriverManager.getConnection(
     "jdbc:mysql://localhost:3306/myDb", "root", "root");// 创建数据连接
   
  } catch (Exception e) {
   System.out.println("数据库连接失败" + e.getMessage());
  }
  return con; //返回所建立的数据库连接
 }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值