惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Security Latest
Security Latest
Recent Commits to openclaw:main
Recent Commits to openclaw:main
O
OpenAI News
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
L
LINUX DO - 最新话题
N
News | PayPal Newsroom
S
Secure Thoughts
The Last Watchdog
The Last Watchdog
Help Net Security
Help Net Security
V2EX - 技术
V2EX - 技术
W
WeLiveSecurity
T
The Exploit Database - CXSecurity.com
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Hacker News - Newest:
Hacker News - Newest: "LLM"
博客园_首页
博客园 - 司徒正美
The Cloudflare Blog
D
DataBreaches.Net
Jina AI
Jina AI
L
LINUX DO - 热门话题
宝玉的分享
宝玉的分享
Project Zero
Project Zero
量子位
Spread Privacy
Spread Privacy
Cisco Talos Blog
Cisco Talos Blog
J
Java Code Geeks
T
Troy Hunt's Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
N
News and Events Feed by Topic
PCI Perspectives
PCI Perspectives
Hugging Face - Blog
Hugging Face - Blog
T
Threat Research - Cisco Blogs
博客园 - 聂微东
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
Threatpost
阮一峰的网络日志
阮一峰的网络日志
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
T
Tailwind CSS Blog
AI
AI
C
CXSECURITY Database RSS Feed - CXSecurity.com
雷峰网
雷峰网
酷 壳 – CoolShell
酷 壳 – CoolShell
Apple Machine Learning Research
Apple Machine Learning Research
Attack and Defense Labs
Attack and Defense Labs
V
V2EX
人人都是产品经理
人人都是产品经理
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
有赞技术团队
有赞技术团队
博客园 - 三生石上(FineUI控件)
Cyberwarzone
Cyberwarzone

博客园 - L.Zhang

.Net Remoting RMI框架 自己开发连接池 MyEclipse下开发Web Service 使用传统的XMLHttpRequest发出Ajax请求 XML CDATA XPath 数据库操作的sql脚本 直接选择排序 直接插入排序 气泡排序 Builder 生成器模式(创建型模式) Abstract Factory 抽象工厂模式(创建型模式) Factory Method 工厂方法模式(创建型模式) Singleton单件模式(创建型模式) 使用Profile Service 服务端如何使用Session 让服务端返回xml 用Get方式访问
JDBC访问数据库
L.Zhang · 2008-01-24 · via 博客园 - L.Zhang

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();
    }
  }
}