自强不息,止于至善

身无半文,心忧天下;手释万卷,神交古人
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

JDBC访问数据库

Posted on 2008-01-24 09:22  L.Zhang  阅读(367)  评论(0)    收藏  举报

1,简单示例演示jdbc连接MySQL的步骤

import java.sql.*;

public class DBTester
{
  
public static void main(String args[])throws Exception
  {
    Connection con;
    Statement stmt;
    ResultSet rs;
    
//加载驱动器,下面的代码为加载MySQL驱动器
    Class.forName("com.mysql.jdbc.Driver");
    
//注册MySQL驱动器
    DriverManager.registerDriver(new com.mysql.jdbc.Driver());
    
//连接到数据库的URL
    String dbUrl = "jdbc:mysql://localhost:3306/STOREDB";
    String dbUser
="dbuser";
    String dbPwd
="1234";
    
//建立数据库连接
    con = java.sql.DriverManager.getConnection(dbUrl,dbUser,dbPwd);
    
//创建一个Statement对象
    stmt 
= con.createStatement();
    
//增加新记录编码转换
    String name1=new String("小王".getBytes("GB2312"),"ISO-8859-1");
    String address1
=new String("上海".getBytes("GB2312"),"ISO-8859-1");
    stmt.executeUpdate(
"insert into CUSTOMERS (NAME,AGE,ADDRESS) VALUES ('"+name1+"',20,'"+address1+"')");

    
//查询记录
    rs= stmt.executeQuery("SELECT ID,NAME,AGE,ADDRESS from CUSTOMERS");
    
//输出查询结果
    while (rs.next()){
      
long id = rs.getLong(1);
      String name 
= rs.getString(2);
      
int age = rs.getInt(3);
      String address 
= rs.getString(4);
      
      
//字符编码转换 
      if(name!=null)name=new String(name.getBytes("ISO-8859-1"),"GB2312");  
      
if(address!=null)address=new String(address.getBytes("ISO-8859-1"),"GB2312");            
      
//打印所显示的数据
      System.out.println("id="+id+",name="+name+",age="+age+",address="+address);
    }
 
    
//删除新增加的记录
    stmt.executeUpdate("delete from CUSTOMERS where name='"+name1+"'");

    
//释放相关资源
    rs.close();
    stmt.close();
    con.close();
  }
}
2,上述程序编码转换部分比较复杂可以在连接数据库时指定编码方式的办法来省去。
 String dbUrl = "jdbc:mysql://localhost:3306/STOREDB?useUnicode=true&characterEncoding=GB2312";
3,jdbc的连接信息可以从配置文件中获取,以下代码演示如何读取配置文件中的信息及其使用
import java.util.*;
import java.io.*;
public class PropertyReader 
{
  
static private Properties ps;
  
static{
    ps
=new Properties();
    
try{
      InputStream in
=PropertyReader.class.getResourceAsStream("db.conf");
      ps.load(in);
      in.close();
    }
catch(Exception e){e.printStackTrace();}
  }
  
public static String get(String key){
     
return (String)ps.get(key);
  }
}
import java.sql.*;
public class ConnectionProvider{
  
private  String JDBC_DRIVER;
  
private  String DB_URL;
  
private  String DB_USER;
  
private  String DB_PASSWORD;

  
public ConnectionProvider() {
    JDBC_DRIVER
=PropertyReader.get("JDBC_DRIVER");
    DB_URL
=PropertyReader.get("DB_URL");
    DB_USER
=PropertyReader.get("DB_USER");
    DB_PASSWORD
=PropertyReader.get("DB_PASSWORD");
    
try{
      Class jdbcDriver
=Class.forName(JDBC_DRIVER);
      java.sql.DriverManager.registerDriver((Driver)jdbcDriver.newInstance());
    }
catch(Exception e){e.printStackTrace();}
  }

  
public Connection getConnection()throws SQLException{
      Connection con
=java.sql.DriverManager.getConnection( DB_URL,DB_USER,DB_PASSWORD);
      
return con;
  }
}
4,下面代码演示了一个脚本执行器代码,如何操作结果集合中的元数据
import java.sql.*;
import java.io.*;
public class SQLExecutor
{
  
public static void main(String args[])throws Exception
  {
    
if(args.length==0)
    {
      System.out.println(
"请提供SQL脚本文件名");
      
return;
    }
    String sqlfile
=args[0];
    ConnectionProvider provider
=new ConnectionProvider();
    Connection con
=provider.getConnection();
    Statement stmt
=con.createStatement();
    BufferedReader reader
=new BufferedReader(new FileReader(new File(sqlfile)));
    
try
    {
      String data
=null;
      String sql
="";
      
while((data=reader.readLine())!=null)
      {
        data
=data.trim(); //删除开头与结尾的空格
        if(data.length()==0)continue//忽略空行
        sql=sql+data;
        
if(sql.substring(sql.length()-1).equals(";"))
        {
          System.out.println(sql);
          
//如果有结果集返回true
          boolean hasResult=stmt.execute(sql); 
          
if(hasResult)
            showResultSet(stmt.getResultSet());
          sql
="";
        } 
      }
    }
finally{con.close();}
  }
  
public static void showResultSet(ResultSet rs) throws SQLException
  {
    
//获取数据集的元数据
    ResultSetMetaData metaData=rs.getMetaData();
    
int columnCount=metaData.getColumnCount();
    
for(int i=1;i<=columnCount;i++)
    {
      
if(i>1)System.out.print(",");   
      System.out.print(metaData.getColumnLabel(i));
    }
    System.out.println();
    
while(rs.next())
    {
      
for(int i=1;i<=columnCount;i++)
      {
        
if(i>1)System.out.print(",");
        
int type=metaData.getColumnType(i);
        
switch(type)
        { 
          
case Types.BIGINT: System.out.print(rs.getLong(i));break;
          
case Types.FLOAT: System.out.print(rs.getFloat(i));break;
          
case Types.VARCHAR: 
          
default: System.out.print(rs.getString(i));
        }
      }
      System.out.println();
    }
    rs.close();
  }
}
5,以下代码段演示了如何批执行Sql语句
      con.setAutoCommit(false);//禁止自动提交事务
      Statement stmt=con.createStatement();
      stmt.addBatch(
"delete from ACCOUNTS");
      stmt.addBatch(
"insert into ACCOUNTS(ID,NAME,BALANCE)"+"values(1,'Tom',1000)");
      stmt.addBatch(
"insert into ACCOUNTS(ID,NAME,BALANCE)"+"values(2,'Jack',1000)");
      stmt.addBatch(
"update ACCOUNTS set BALANCE=900 where ID=1");
      stmt.addBatch(
"update ACCOUNTS set BALANCE=1100 where ID=2");
      
int[] updateCounts=stmt.executeBatch(); //返回的是影响行数的数组
      for (int i = 0; i < updateCounts.length; i++)
      {
        System.out.print(updateCounts[i] 
+ "   ");
      }
      con.commit(); 
//提交事务
6,以下代码演示了存储过程的执行方法
  public static void main(String args[])throws Exception
  {
    Connection con
=new ConnectionProvider().getConnection();
    CallableStatement cStmt 
= con.prepareCall("{call demoSp(?, ?)}");
    
//设置第一个参数的值
    cStmt.setString(1"Tom");
    
//cStmt.setString("inputParam", "Tom");
    
//注册第二个参数的类型
    cStmt.registerOutParameter(2, Types.INTEGER);
    
//cStmt.registerOutParameter("inOutParam", Types.INTEGER);
    
//设置第二个参数的值
    cStmt.setInt(21);
    
//cStmt.setInt("inOutParam", 1);
    
//执行存储过程
    boolean hadResults = cStmt.execute();
    
//访问结果集
    if(hadResults) 
    {
      ResultSet rs 
= cStmt.getResultSet();
    }
    
//获得第二个参数的输出值
    int outputValue = cStmt.getInt(2); // index-based
    
//int outputValue = cStmt.getInt("inOutParam"); // name-based
    con.close();
  }
}
/*************************
以下是MySQL数据库中存储过程的定义

CREATE PROCEDURE demoSp(IN inputParam VARCHAR(255), INOUT inOutParam INT)
BEGIN
    DECLARE z INT;
    SET z = inOutParam + 1;
    SET inOutParam = z;

    SELECT CONCAT('hello ', inputParam);
END
*************************
*/
7,以下代码演示了获取数据库元数据得到数据库中表集合的方法
import java.sql.*;

public class ShowDB 

  
public static void main(String[] args)throws SQLException
  {  
    Connection con
=new ConnectionProvider().getConnection();
    
//获取数据库元数据
    DatabaseMetaData metaData=con.getMetaData();
    System.out.println(
"允许的最大连接数为:"+metaData.getMaxConnections());
    System.out.println(
"一个连接允许同时打开的Statement对象的数目为:"+metaData.getMaxStatements());
    
//获取表的集合
    ResultSet tables=metaData.getTables(null,null,null,new String[]{"TABLE"});
    con.close();
  }
}
8,下面代码演示了如何获取刚刚插入的数据的数据库自动成生的主键
    Statement stmt = con.createStatement();
    
//增加新记录,注意后面的参数
    stmt.executeUpdate("insert into CUSTOMERS (NAME,AGE,ADDRESS) " 
       
+"VALUES ('小王',20,'上海')", Statement.RETURN_GENERATED_KEYS);
    
//获取主建
    ResultSet rs=stmt.getGeneratedKeys();
9,下面代码演示了事务保存点的使用
import java.sql.*;
public class SavepointTester
{
  
public static void main(String args[])throws Exception
  {
    Connection con
=new ConnectionProvider().getConnection();
    
try
    {
      con.setAutoCommit(
false);
      Statement stmt
=con.createStatement();
      stmt.executeUpdate(
"delete from ACCOUNTS");
      stmt.executeUpdate(
"insert into ACCOUNTS(ID,NAME,BALANCE)"+"values(1,'Tom',1000)");
      Savepoint sp
=con.setSavepoint();
      stmt.executeUpdate(
"update ACCOUNTS set BALANCE=900 where ID=1");
      con.rollback(sp); 
//回滚到第一个保存点
      stmt.executeUpdate("insert into ACCOUNTS(ID,NAME,BALANCE)"+"values(2,'Jack',1000)");
      con.commit();
    }
    
catch(SQLException e)
    {
      con.rollback(); 
//撤销整个事务
    }
    
finally
    {
      con.close();
    }
  }
}