JDBC编程

JDBC是连接数据库和Java程序的桥梁,通过JDBC API可以方便地实现对各种主流数据库的操作。本篇将介绍一下如何使用JDBC操作数据库(以MySQL为例)。

一、JDBC

JDBC制定了统一访问各类关系数据库的标准接口,为各个数据库厂商提供了标准接口的实现。

JDBC规范将驱动程序归结为以下几类(选自Core Java Volume Ⅱ——Advanced Features):

  • 第一类驱动程序将JDBC翻译成ODBC,然后使用一个ODBC驱动程序与数据库进行通信。
  • 第二类驱动程序是由部分Java程序和部分本地代码组成的,用于与数据库的客户端API进行通信。
  • 第三类驱动程序是纯Java客户端类库,它使用一种与具体数据库无关的协议将数据库请求发送给服务器构件,然后该构件再将数据库请求翻译成数据库相关的协议。
  • 第四类驱动程序是纯Java类库,它将JDBC请求直接翻译成数据库相关的协议。

二、通过JDBC操作数据库

我们需要访问数据库时,首先要加载数据库驱动,只需加载一次,然后在每次访问数据库时创建一个Connection实例,获取数据库连接,获取连接后,执行需要的SQL语句,最后完成数据库操作时释放与数据库间的连接。

1. 加载数据库驱动

Java加载数据库驱动的方法是调用Class类的静态方法forName(),语法格式如下:



Class



例如加载MySQL数据库驱动如下:



try



如果加载成功,会将加载的驱动类注册给DriverManager;如果加载失败,会抛出ClassNotFoundException异常。

需要注意的是,要在项目中导入mysq-connection-java的jar包,方法是在项目中建立lib目录,在其下放入jar包。




java RecordSet一次执行多条sql jdbc执行多条sql_jdbc驱动jar文件放哪


右键jar包 Build Path->Add to Build Path。


java RecordSet一次执行多条sql jdbc执行多条sql_jdbc驱动jar_02


之后会多出一个Referenced Libraries,导入成功。


java RecordSet一次执行多条sql jdbc执行多条sql_jdbc驱动jar文件放哪_03


2. 建立连接

加载完数据库驱动后,就可以建立数据库的连接了,需要使用DriverManager类的静态方法getConnection()方法来实现。如下:


Class


url是数据库的url,其中mysql指定数据库为mysql数据库,localhost是本地计算机,可以换成IP地址127.0.0.1,3306为MySQL数据库的默认端口号,database_name是所要连接的数据库名;user和password对应数据库的用户名和密码;最后再通过getConnection建立连接。

3. 对数据库表中数据进行增删改查

建立了连接之后,就可以使用Connection接口的createStatement()方法来获取Statement对象,也可以调用prepareStatement()方法获得PrepareStatement对象,通过executeUpdate()方法来执行SQL语句。

先看一个查询的。


java RecordSet一次执行多条sql jdbc执行多条sql_jdbc驱动jar文件放哪_04


1


java RecordSet一次执行多条sql jdbc执行多条sql_jdbc驱动jar文件放哪_04


运行结果如下:


java RecordSet一次执行多条sql jdbc执行多条sql_jdbc驱动jar_06


一般在数据库中我们将性别写为数字,然后用Java语言进行转换,比如上述运行结果,1代表男性、2代表女性、0代表未知,我们修改sex = rs.getInt("sex");这行代码如下:


java RecordSet一次执行多条sql jdbc执行多条sql_jdbc驱动jar文件放哪_04


sex


java RecordSet一次执行多条sql jdbc执行多条sql_jdbc驱动jar文件放哪_04


首先在while循环的外面加上String _sex,在输出中将sex改为_sex即可,运行结果如下:


java RecordSet一次执行多条sql jdbc执行多条sql_jdbc驱动jar文件放哪_09


对于插入,我们可以使用Statement接口中的executeUpdate()方法,如下:


String


还可以使用PreparedStatement接口中的executeUpdate()方法,如下:


java RecordSet一次执行多条sql jdbc执行多条sql_jdbc驱动jar文件放哪_04


String


java RecordSet一次执行多条sql jdbc执行多条sql_jdbc驱动jar文件放哪_04


修改同插入,也有上述两种方法,只需更改sql语句即可。

删除也是一个很常用的操作,使用executeUpdate()方法执行用来做删除的SQL语句,方法同上方Statement接口的操作。

三、完整实例

下面给一个完整的例子,该例子的数据库配置文件在外部的properties中,该例子以SQL Server为例,其它的数据库都是同样的道理。

1. jdbc.properties

用于编写数据库配置文件,不直接写在程序中的好处是提高了灵活性,如果需要修改数据库名称或配置等信息,可以在这里修改,无需改动程序。


1


2. DBUtils.java

编写JDBC代码。


java RecordSet一次执行多条sql jdbc执行多条sql_jdbc驱动jar文件放哪_04


1 import java.io.*;
  2 import java.sql.Connection;
  3 import java.sql.DriverManager;
  4 import java.sql.PreparedStatement;
  5 import java.sql.ResultSet;
  6 import java.sql.SQLException;
  7 import java.sql.Statement;
  8 import java.util.Properties;
  9 
 10 public class DBUtil {
 11     private final String dbConnFile = "resource/database/jdbc.properties";
 12     private Connection conn=null;
 13     private String dbDriver;    //定义驱动  
 14     private String dbURL;        //定义URL  
 15     private String userName;    //定义用户名  
 16     private String password;    //定义密码    
 17     
 18     //从配置文件取数据库链接参数  
 19     private void loadConnProperties(){  
 20         Properties props = new Properties();  
 21         try {  
 22             props.load(new FileInputStream(dbConnFile));//根据配置文件路径Conf加载配置文件  
 23         } catch (FileNotFoundException e) {  
 24             e.printStackTrace();  
 25         } catch (IOException e) {  
 26             e.printStackTrace();  
 27         }  
 28         this.dbDriver = props.getProperty("driver");//从配置文件中取得相应的参数并设置类变量  
 29         this.dbURL = props.getProperty("url");  
 30         this.userName = props.getProperty("username");  
 31         this.password = props.getProperty("password");  
 32      
 33     }
 34     
 35     public boolean openConnection(){
 36         try {  
 37             loadConnProperties();
 38             Class.forName(dbDriver);  
 39             this.conn = DriverManager.getConnection(dbURL,userName,password);
 40             return true;
 41         } catch(ClassNotFoundException classnotfoundexception) {  
 42               classnotfoundexception.printStackTrace();  
 43             System.err.println("db: " + classnotfoundexception.getMessage());  
 44         } catch(SQLException sqlexception) {  
 45             System.err.println("db.getconn(): " + sqlexception.getMessage());  
 46         }
 47         return    false;
 48     }
 49     
 50     
 51     protected void finalize() throws Exception{
 52         try {
 53         if(null!=conn)
 54             conn.close();
 55         }catch (SQLException e) {
 56             e.printStackTrace();
 57         }
 58         
 59      }
 60     
 61     // 查询并得到结果集
 62     public ResultSet execQuery(String sql) throws Exception {
 63         ResultSet rstSet = null;
 64         try {
 65             if (null == conn)
 66                 throw new Exception("Database not connected!");
 67             Statement stmt = conn.createStatement();
 68             rstSet = stmt.executeQuery(sql);
 69         } catch (SQLException e) {
 70             e.printStackTrace();
 71         }
 72         return rstSet;
 73     }
 74 
 75     // 插入一条新纪录,并获取标识列的值
 76     public ResultSet getInsertObjectIDs(String insertSql) throws Exception{
 77         ResultSet rst = null;
 78         try {
 79             if(null==conn)
 80                 throw new Exception("Database not connected!");
 81             
 82             Statement stmt = conn.createStatement();
 83             
 84             stmt.executeUpdate(insertSql, Statement.RETURN_GENERATED_KEYS);
 85             rst = stmt.getGeneratedKeys();
 86             
 87         } catch (SQLException e) {
 88             e.printStackTrace();
 89         }
 90         return rst;
 91     }
 92     
 93     //以参数SQL模式插入新纪录,并获取标识列的值
 94     public ResultSet getInsertObjectIDs(String insertSql, Object[] params) throws Exception {
 95         ResultSet rst = null;
 96         PreparedStatement pstmt = null ;
 97         try {
 98             if (null == conn)
 99                 throw new Exception("Database not connected!");
100             pstmt = conn.prepareStatement(insertSql, Statement.RETURN_GENERATED_KEYS);
101             
102             if(null != params){  
103                 for (int i = 0; i < params.length; i++) {  
104                     pstmt.setObject(i + 1, params[i]);  
105                 }  
106             }
107             pstmt.executeUpdate();
108             rst = pstmt.getGeneratedKeys();            
109         } catch (SQLException e) {
110             e.printStackTrace();
111         }
112         return rst;
113     }
114     
115     
116 
117     // 插入、更新、删除
118     public int execCommand(String sql) throws Exception{
119         int flag = 0;
120         try {
121             if(null==conn)
122                 throw new Exception("Database not connected!");
123       
124             Statement stmt = conn.createStatement();
125             flag = stmt.executeUpdate(sql);
126         
127             stmt.close();            
128         } catch (SQLException e) {
129             e.printStackTrace();
130         }
131         return flag;
132     }
133     
134 /*    // 存储过程调用
135     public void callStordProc(String sql, Object[] inParams, SqlParameter[] outParams) throws Exception {
136         CallableStatement  cst = null ;
137         try {
138             if (null == conn)
139                 throw new Exception("Database not connected!");
140             cst = conn.prepareCall(sql);
141             
142             if(null != inParams){  
143                 for (int i = 0; i < inParams.length; i++) {  
144                     cst.setObject(i + 1, inParams[i]);  
145                 }  
146             }
147             
148             if (null!=outParams){
149                 for (int i = 0; i < inParams.length; i++) {
150                     cst.registerOutParameter(outParams[i].getName(), outParams[i].getType());  
151                 }                  
152             }
153             cst.execute();
154         } catch (SQLException e) {
155             e.printStackTrace();
156         }
157     }
158 */
159     // 释放资源
160     public void close(ResultSet rst) throws Exception {
161         try {
162             Statement stmt = rst.getStatement();
163             rst.close();
164             stmt.close();
165         } catch (SQLException e) {
166             e.printStackTrace();
167         }
168     }
169     
170     public PreparedStatement execPrepared(String psql) throws Exception {
171         PreparedStatement pstmt = null ;
172         try {
173             if (null == conn)
174                 throw new Exception("Database not connected!");
175             pstmt = conn.prepareStatement(psql);
176         } catch (SQLException e) {
177             e.printStackTrace();
178         }
179         return pstmt;
180     }
181 
182 
183     // 释放资源
184     public void close(Statement stmt) throws Exception {
185         try {
186             stmt.close();
187         } catch (SQLException e) {
188             e.printStackTrace();
189         }
190     }
191     
192     // 释放资源
193     public void close() throws SQLException, Exception{
194         if(null!=conn){
195             conn.close();
196             conn=null;
197         }
198     }
199     
200     public Connection getConn() {
201         return conn;
202     }
203     
204 
205     public static void main(String[] args) {
206         
207     }
208 }


java RecordSet一次执行多条sql jdbc执行多条sql_jdbc驱动jar文件放哪_04


3. DBUtil_TestDriver.java

测试程序。


java RecordSet一次执行多条sql jdbc执行多条sql_jdbc驱动jar文件放哪_04


1