iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Java访问数据库的具体步:
  • 621
分享到

Java访问数据库的具体步:

2024-04-02 19:04:59 621人浏览 薄情痞子
摘要

本篇内容介绍了“Java访问数据库的具体步:”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一:Java访问

本篇内容介绍了“Java访问数据库的具体步:”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

一:Java访问数据库的具体步骤:

1 加载(注册)数据库 

 驱动加载就是把各个数据库提供的访问数据库的api加载到我们程序进来,加载JDBC驱动,并将其注册到DriverManager中,每一种数据库提供的数据库驱动不一样,加载驱动时要把jar包添加到lib文件夹下,下面看一下一些主流数据库的JDBC驱动加裁注册的代码: 

//oracle8/8i/9io数据库(thin模式) 

Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); 

//sql Server7.0/2000数据库   Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); 

//Sql Server2005/2008数据库   Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 

//DB2数据库 

Class.froName("com.ibm.db2.jdbc.app.DB2Driver").newInstance();  

//Mysql数据库  Class.forName("com.mysql.jdbc.Driver").newInstance(); 

建立链接   

建立数据库之间的连接是访问数据库的必要条件,就像南水北调调水一样,要想调水首先由把沟通的河流打通。建立连接对于不同数据库也是不一样的,下面看一下一些主流数据库建立数据库连接,取得Connection对象的不同方式:

 //Oracle8/8i/9i数据库(thin模式) 

  String url="jdbc:oracle:thin:@localhost:1521:orcl"; 

  String user="scott"; 

  String passWord="tiger"; 

  Connection conn=DriverManager.getConnection(url,user,password); 

  //Sql Server7.0/2000/2005/2008数据库 

  String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs"; 

  String user="sa"; 

  String password=""; 

  Connection conn=DriverManager.getConnection(url,user,password); 

  //DB2数据库 

  String url="jdbc:db2://localhost:5000/sample"; 

  String user="amdin" 

  String password=-""; 

  Connection conn=DriverManager.getConnection(url,user,password); 

//MySQL数据库 

String url="jdbc:mysql://localhost:3306/testDB?user=root&password=root&useUnicode=true&characterEncoding=gb2312"; 

Connection conn=DriverManager.getConnection(url); 

3. 执行SQL语句  

数据库连接建立好之后,接下来就是一些准备工作和执行sql语句了,准备工作要做的就是建立Statement对象PreparedStatement对象,例如:

 //建立Statement对象 

 Statement stmt=conn.createStatement(); 

 //建立PreparedStatement对象 

 String sql="select * from user where userName=? and password=?"; 

  PreparedStatement pstmt=Conn.prepareStatement(sql); 

  pstmt.setString(1,"admin"); 

  pstmt.setString(2,"liubin"); 

做好准备工作之后就可以执行sql语句了,执行sql语句:

String sql="select * from users"; 

ResultSet rs=stmt.executeQuery(sql); 

//执行动态SQL查询 

ResultSet rs=pstmt.executeQuery(); 

//执行insert update delete等语句,先定义sql 

stmt.executeUpdate(sql); 

4 处理结果集  

 访问结果记录集ResultSet对象。例如: 

  while(rs.next) 

  { 

  out.println("你的第一个字段内容为:"+rs.getString("Name")); 

  out.println("你的第二个字段内容为:"+rs.getString(2)); 

  } 

5 关闭数据库 

 依次将ResultSet、Statement、PreparedStatement、Connection对象关     闭,释放所占用的资源.例如: 

  rs.close(); 

  stmt.clost(); 

  pstmt.close(); 

  con.close(); 

二:JDBC事务

什么是事务:

首先,说说什么事务。我认为事务,就是一组操作数据库的动作集合

事务是现代数据库理论中的核心概念之一。如果一组处理步骤或者全部发生或者一步也不执行,我们称该组处理步骤为一个事务。当所有的步骤像一个操 作一样被完整地执行,我们称该事务被提交。由于其中的一部分或多步执行失败,导致没有步骤被提交,则事务必须回滚到最初的系统状态。

事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性 (isolation)和持久性(durability)的缩写。事务的原子性表示事务执行过程中的任何失败都将导致事务所做的任何修改失效。一致性表示 当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态。隔离性表示在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见。持 久性表示当系统或介质发生故障时,确保已提交事务的更新不能丢失。持久性通过数据库备份和恢复来保证。

JDBC 事务是用 Connection 对象控制的。JDBC Connection 接口( java.sql.Connection )提供了两种事务模式:自动提交和手工提交。 java.sql.Connection 提供了以下控制事务的方法: 
public void setAutoCommit(boolean) 
public boolean getAutoCommit() 
public void commit() 
public void rollback() 
使用 JDBC 事务界定时,您可以将多个 SQL 语句结合到一个事务中。JDBC 事务的一个缺点是事务的范围局限于一个数据库连接。一个 JDBC 事务不能跨越多个数据库。

三:java操作数据库连接池

总结java操作数据库连接池发现一篇很好的文章,所以就不做具体总结了,直接上地址:

Http://www.blogjava.net/chunkyo/arcHive/2007/01/16/94266.html

最后附一段比较经典的代码吧:

[java]
view plaincopyprint?

  1. import java.sql.Connection;  

  2. import java.sql.DatabaseMetaData;  

  3. import java.sql.Driver;  

  4. import java.sql.DriverManager;  

  5. import java.sql.SQLException;  

  6. import java.sql.Statement;  

  7. import java.util.Enumeration;  

  8. import java.util.Vector;  

  9. public class ConnectionPool {  

  10. private String jdbcDriver = ""; // 数据库驱动

  11. private String dbUrl = ""; // 数据 URL

  12. private String dbUsername = ""; // 数据库用户名

  13. private String dbPassword = ""; // 数据库用户密码

  14. private String testTable = ""; // 测试连接是否可用的测试表名,默认没有测试表

  15. private int initialConnections = 10; // 连接池的初始大小

  16. private int incrementalConnections = 5;// 连接池自动增加的大小

  17. private int maxConnections = 50; // 连接池最大的大小

  18. private Vector connections = null; // 存放连接池中数据库连接的向量 , 初始时为 null


  19. // 它中存放的对象为 PooledConnection 型



  20. public ConnectionPool(String jdbcDriver,String dbUrl,String dbUsername,String dbPassword) {  

  21.          this.jdbcDriver = jdbcDriver;  

  22.          this.dbUrl = dbUrl;  

  23.          this.dbUsername = dbUsername;   

  24.          this.dbPassword = dbPassword;  

  25. }  


  26. public int getInitialConnections() {  


  27.          return this.initialConnections;  

  28. }  



  29. public void setInitialConnections(int initialConnections) {  

  30.          this.initialConnections = initialConnections;  

  31. }  


  32. public int getIncrementalConnections() {  


  33.          return this.incrementalConnections;  


  34. }  



  35. public void setIncrementalConnections(int incrementalConnections) {  


  36.          this.incrementalConnections = incrementalConnections;  


  37. }  



  38. public int getMaxConnections() {  

  39.          return this.maxConnections;  

  40. }  



  41. public void setMaxConnections(int maxConnections) {  


  42.          this.maxConnections = maxConnections;  


  43. }  


  44. public String getTestTable() {  


  45.          return this.testTable;  


  46. }  


  47. public void setTestTable(String testTable) {  

  48.          this.testTable = testTable;  

  49. }  


  50. public synchronized void createPool() throws Exception {  


  51.          // 确保连接池没有创建


  52.          // 如果连接池己经创建了,保存连接的向量 connections 不会为空


  53.          if (connections != null) {  


  54.           return; // 如果己经创建,则返回


  55.          }  


  56.          // 实例化 JDBC Driver 中指定的驱动类实例


  57.          Driver driver = (Driver) (Class.forName(this.jdbcDriver).newInstance());  


  58.          DriverManager.reGISterDriver(driver); // 注册 JDBC 驱动程序


  59.          // 创建保存连接的向量 , 初始时有 0 个元素


  60.          connections = new Vector();  


  61.          // 根据 initialConnections 中设置的值,创建连接。


  62.          createConnections(this.initialConnections);  


  63.          System.out.println(" 数据库连接池创建成功! ");  


  64. }  


  65. @SuppressWarnings("unchecked")  

  66. private void createConnections(int numConnections) throws SQLException {  


  67.          // 循环创建指定数目的数据库连接


  68.          for (int x = 0; x < numConnections; x++) {  


  69.           // 是否连接池中的数据库连接的数量己经达到最大?最大值由类成员 maxConnections


  70.           // 指出,如果 maxConnections 为 0 或负数,表示连接数量没有限制。


  71.           // 如果连接数己经达到最大,即退出。


  72.           if (this.maxConnections > 0 && this.connections.size() >= this.maxConnections) {  


  73.            break;  


  74.           }  


  75.           //add a new PooledConnection object to connections vector


  76.           // 增加一个连接到连接池中(向量 connections 中)


  77.           try{  


  78.            connections.addElement(new PooledConnection(newConnection()));  


  79.           }catch(SQLException e){  


  80.            System.out.println(" 创建数据库连接失败! "+e.getMessage());  


  81.           throw new SQLException();  


  82.           }  


  83.           System.out.println(" 数据库连接己创建 ......");  


  84.          }  

  85. }  


  86. private Connection newConnection() throws SQLException {  


  87.          // 创建一个数据库连接


  88.          Connection conn = DriverManager.getConnection(dbUrl, dbUsername, dbPassword);  


  89.          // 如果这是第一次创建数据库连接,即检查数据库,获得此数据库允许支持的


  90.          // 最大客户连接数目


  91.          //connections.size()==0 表示目前没有连接己被创建


  92.          if (connections.size() == 0) {  


  93.           DatabaseMetaData metaData = conn.getMetaData();  


  94.           int driverMaxConnections = metaData.getMaxConnections();  


  95.           // 数据库返回的 driverMaxConnections 若为 0 ,表示此数据库没有最大


  96.           // 连接限制,或数据库的最大连接限制不知道


  97.           //driverMaxConnections 为返回的一个整数,表示此数据库允许客户连接的数目


  98.           // 如果连接池中设置的最大连接数量大于数据库允许的连接数目 , 则置连接池的最大


  99.           // 连接数目为数据库允许的最大数目


  100.           if (driverMaxConnections > 0 && this.maxConnections > driverMaxConnections) {  


  101.            this.maxConnections = driverMaxConnections;  


  102.           }  

  103.          }   

  104.          return conn; // 返回创建的新的数据库连接


  105. }  



  106. public synchronized Connection getConnection() throws SQLException {  


  107.          // 确保连接池己被创建


  108.          if (connections == null) {  


  109.           return null; // 连接池还没创建,则返回 null


  110.          }  


  111.          Connection conn = getFreeConnection(); // 获得一个可用的数据库连接


  112.          // 如果目前没有可以使用的连接,即所有的连接都在使用中


  113.          while (conn == null){  


  114.           // 等一会再试


  115.           wait(250);  


  116.           conn = getFreeConnection(); // 重新再试,直到获得可用的连接,如果


  117.           //getFreeConnection() 返回的为 null


  118.           // 则表明创建一批连接后也不可获得可用连接


  119.          }  


  120.          return conn;// 返回获得的可用的连接

  121. }  



  122. private Connection getFreeConnection() throws SQLException {  


  123.          // 从连接池中获得一个可用的数据库连接


  124.          Connection conn = findFreeConnection();  


  125.          if (conn == null) {  


  126.           // 如果目前连接池中没有可用的连接


  127.           // 创建一些连接


  128.           createConnections(incrementalConnections);  


  129.           // 重新从池中查找是否有可用连接


  130.           conn = findFreeConnection();  


  131.           if (conn == null) {  


  132.            // 如果创建连接后仍获得不到可用的连接,则返回 null


  133.            return null;  


  134.           }  


  135.          }  


  136.          return conn;  


  137. }  



  138. private Connection findFreeConnection() throws SQLException {  


  139.          Connection conn = null;  


  140.          PooledConnection pConn = null;  


  141.          // 获得连接池向量中所有的对象


  142.          Enumeration enumerate = connections.elements();  


  143.          // 遍历所有的对象,看是否有可用的连接


  144.          while (enumerate.hasMoreElements()) {  


  145.           pConn = (PooledConnection) enumerate.nextElement();  


  146.           if (!pConn.isBusy()) {  


  147.            // 如果此对象不忙,则获得它的数据库连接并把它设为忙


  148.            conn = pConn.getConnection();  


  149.            pConn.setBusy(true);  


  150.            // 测试此连接是否可用


  151.            if (!testConnection(conn)) {  


  152.             // 如果此连接不可再用了,则创建一个新的连接,


  153.             // 并替换此不可用的连接对象,如果创建失败,返回 null


  154.             try{  


  155.              conn = newConnection();  


  156.             }catch(SQLException e){  


  157.              System.out.println(" 创建数据库连接失败! "+e.getMessage());  


  158.              return null;  


  159.             }  


  160.             pConn.setConnection(conn);  


  161.            }  


  162.            break; // 己经找到一个可用的连接,退出


  163.           }  


  164.          }  


  165.          return conn;// 返回找到到的可用连接


  166. }  



  167. private boolean testConnection(Connection conn) {  


  168.          try {  


  169.           // 判断测试表是否存在


  170.           if (testTable.equals("")) {  


  171.            // 如果测试表为空,试着使用此连接的 setAutoCommit() 方法


  172.            // 来判断连接否可用(此方法只在部分数据库可用,如果不可用 ,


  173.            // 抛出异常)。注意:使用测试表的方法更可靠


  174.            conn.setAutoCommit(true);  


  175.           } else {// 有测试表的时候使用测试表测试


  176.            //check if this connection is valid


  177.            Statement stmt = conn.createStatement();  


  178.            stmt.execute("select count(*) from " + testTable);  


  179.           }  


  180.          } catch (SQLException e) {  


  181.           // 上面抛出异常,此连接己不可用,关闭它,并返回 false;


  182.           closeConnection(conn);  


  183.           return false;  


  184.          }  


  185.          // 连接可用,返回 true


  186.          return true;  


  187. }  



  188. public void returnConnection(Connection conn) {  


  189.          // 确保连接池存在,如果连接没有创建(不存在),直接返回


  190.          if (connections == null) {  


  191.           System.out.println(" 连接池不存在,无法返回此连接到连接池中 !");  


  192.           return;  


  193.          }  


  194.          PooledConnection pConn = null;  


  195.          Enumeration enumerate = connections.elements();  


  196.          // 遍历连接池中的所有连接,找到这个要返回的连接对象


  197.          while (enumerate.hasMoreElements()) {  


  198.           pConn = (PooledConnection) enumerate.nextElement();  


  199.           // 先找到连接池中的要返回的连接对象


  200.           if (conn == pConn.getConnection()) {  


  201.            // 找到了 , 设置此连接为空闲状态


  202.            pConn.setBusy(false);  


  203.            break;  


  204.           }  


  205.          }  


  206. }  



  207. public synchronized void refreshConnections() throws SQLException {  


  208.          // 确保连接池己创新存在


  209.          if (connections == null) {  


  210.           System.out.println(" 连接池不存在,无法刷新 !");  


  211.           return;  


  212.          }  


  213.          PooledConnection pConn = null;  


  214.          Enumeration enumerate = connections.elements();  


  215.          while (enumerate.hasMoreElements()) {  


  216.           // 获得一个连接对象


  217.           pConn = (PooledConnection) enumerate.nextElement();  


  218.           // 如果对象忙则等 5 秒 ,5 秒后直接刷新


  219.           if (pConn.isBusy()) {  


  220.            wait(5000); // 等 5 秒


  221.           }  


  222.           // 关闭此连接,用一个新的连接代替它。


  223.           closeConnection(pConn.getConnection());  


  224.           pConn.setConnection(newConnection());  


  225.           pConn.setBusy(false);  


  226.          }  


  227. }  



  228. public synchronized void closeConnectionPool() throws SQLException {  


  229.          // 确保连接池存在,如果不存在,返回


  230.          if (connections == null) {  


  231.           System.out.println(" 连接池不存在,无法关闭 !");  


  232.           return;  


  233.          }  


  234.          PooledConnection pConn = null;  


  235.          Enumeration enumerate = connections.elements();  


  236.          while (enumerate.hasMoreElements()) {  


  237.           pConn = (PooledConnection) enumerate.nextElement();  


  238.           // 如果忙,等 5 秒


  239.           if (pConn.isBusy()) {  


  240.            wait(5000); // 等 5 秒


  241.           }  


  242.          //5 秒后直接关闭它


  243.          closeConnection(pConn.getConnection());  


  244.          // 从连接池向量中删除它


  245.          connections.removeElement(pConn);  


  246.          }  


  247.          // 置连接池为空


  248.          connections = null;  


  249. }  



  250. private void closeConnection(Connection conn) {  


  251.          try {  


  252.           conn.close();  


  253.          }catch (SQLException e) {  


  254.           System.out.println(" 关闭数据库连接出错: "+e.getMessage());  


  255.          }  


  256. }  



  257. private void wait(int mSeconds) {  


  258.          try {  


  259.           Thread.sleep(mSeconds);  


  260.          } catch (InterruptedException e) {  


  261.          }  


  262. }  



  263. class PooledConnection {  


  264.          Connection connection = null;// 数据库连接


  265.          boolean busy = false; // 此连接是否正在使用的标志,默认没有正在使用


  266.          // 构造函数,根据一个 Connection 构告一个 PooledConnection 对象


  267.          public PooledConnection(Connection connection) {  


  268.           this.connection = connection;  


  269.          }  


  270.          // 返回此对象中的连接


  271.          public Connection getConnection() {  


  272.           return connection;  


  273.          }  


  274.          // 设置此对象的,连接


  275.          public void setConnection(Connection connection) {  


  276.           this.connection = connection;  


  277.          }  


  278.          // 获得对象连接是否忙


  279.          public boolean isBusy() {  


  280.           return busy;  


  281.          }  


  282.          // 设置对象的连接正在忙


  283.          public void setBusy(boolean busy) {  


  284.           this.busy = busy;  


  285.          }  


  286. }  


  287. }  


  288. =======================================  


  289. 这个例子是根据postgresql数据库写的,  

  290. 请用的时候根据实际的数据库调整。  


  291. 调用方法如下:  


  292. ① ConnectionPool connPool  

  293.                                      = new ConnectionPool("org.postgresql.Driver"

  294.                                                                          ,"jdbc:postgresql://dbURI:5432/DBName"

  295.                                                                          ,"postgre"

  296.                                                                          ,"postgre");  


  297. ② connPool .createPool();  

  298.   Connection conn = connPool .getConnection();  

“Java访问数据库的具体步:”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

您可能感兴趣的文档:

--结束END--

本文标题: Java访问数据库的具体步:

本文链接: https://www.lsjlt.com/news/60523.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作