一種向數(shù)據(jù)庫(kù)中寫(xiě)入數(shù)據(jù)的方法

          今天在我的博客群中有個(gè)朋友問(wèn)了我一個(gè)問(wèn)題,詳見(jiàn)http://group.bokee.com/group/subject.7861.11763421854970771.html?91391218870400970

          他問(wèn):怎樣把文本文件中的每一列寫(xiě)到數(shù)據(jù)庫(kù)表中?
          我的解決方案如下:
          開(kāi)發(fā)工具:Eclipse3.2   JDK1.6   MySQL4.1.8

          首先我打開(kāi)MySQL命令行窗口,輸入密碼root后執(zhí)行如下語(yǔ)句建立測(cè)試表student;

          mysql>use test;
          mysql
          >create table student(id int,name varchar(10));



          我的文本文件(E:\data.txt,E盤(pán)為我的Java程序所在的根目錄)的格式如下:

          ------------------------

          1,Tom
          2,Kate
          3,Jim
          -----------------------

          對(duì)了!還有提醒大家一句:一定要把數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序添加到Eclipse工程的JavaBuildpath中,呵呵,對(duì)于有經(jīng)驗(yàn)的程序員來(lái)講,我這純屬是廢話,好了,不廢話了,看看我的Java程序吧!

           

          *@author 我為J狂 建立日期 2007-4-14
           
          *
           
          */
          package net.blogjava.lzqdiy;

          import java.io.BufferedReader;
          import java.io.File;
          import java.io.FileReader;
          import java.io.IOException;
          import java.sql.Connection;
          import java.sql.DriverManager;
          import java.sql.SQLException;
          import java.sql.Statement;
          import java.util.HashSet;
          import java.util.Set;

          public class Test
          {

              
          /**
               * 
          @param args
               
          */

              
          public static Set<String> readFile(String filePath)
              
          {
                  BufferedReader in 
          = null;
                  Set
          <String> tableData = new HashSet<String>();
                  
          try
                  
          {
                      in 
          = new BufferedReader(new FileReader(filePath));
                      String record 
          = null;
                      
          while ((record = in.readLine()) != null)
                      
          {
                          tableData.add(record);
                      }

                  }
           catch (IOException e)
                  
          {
                      
          // TODO Auto-generated catch block
                      e.printStackTrace();
                  }
           finally
                  
          {
                      
          try
                      
          {
                          in.close();
                      }
           catch (IOException e)
                      
          {
                          
          // TODO Auto-generated catch block
                          e.printStackTrace();
                      }

                  }

                  
          return tableData;
              }


              
          public static void insertDataBase(Set<String> tableData,String driverName,String url,String username,String password)
              
          {
                  Connection con 
          = null;
                  Statement stmt 
          = null;
                  
          try
                  
          {
                      Class.forName(driverName);
                      con 
          = DriverManager.getConnection(
                              url, username, password);
                      stmt 
          = con.createStatement();
                      
          for (String record : tableData)
                      
          {
                          
          if(record!=null)
                          
          {
                              String[] values 
          = record.split(",");
                              stmt.executeUpdate(
          "insert into student(id,name) values(" + values[0]+ ",'" + values[1+ "')");
                          }

                      }


                  }
           catch (ClassNotFoundException e)
                  
          {
                      
          // TODO Auto-generated catch block
                      e.printStackTrace();
                  }
           catch (SQLException e)
                  
          {
                      
          // TODO Auto-generated catch block
                      e.printStackTrace();
                  }
           finally
                  
          {
                      
          if (stmt != null)
                      
          {
                          
          try
                          
          {
                              stmt.close();
                          }
           catch (SQLException e)
                          
          {
                              
          // TODO Auto-generated catch block
                              e.printStackTrace();
                          }

                          stmt 
          = null;
                      }


                      
          if (con != null)
                      
          {
                          
          try
                          
          {
                              con.close();
                          }
           catch (SQLException e)
                          
          {
                              
          // TODO Auto-generated catch block
                              e.printStackTrace();
                          }

                          con 
          = null;
                      }

                  }

              }


              
          public static void main(String[] args)
              
          {
                  
          // TODO Auto-generated method stub
                  
                  insertDataBase(readFile(File.separator
          +"data.txt"),"com.mysql.jdbc.Driver","jdbc:mysql://localhost:3306/test""root""root");
              }

          }


           

           我的這個(gè)程序只是能實(shí)現(xiàn)功能,在擴(kuò)展性方面做得還不夠,希望大家多提寶貴意見(jiàn),我不勝感激。
          另外,我感覺(jué)這種數(shù)據(jù)庫(kù)輸入數(shù)據(jù)的策略有利有弊,它的優(yōu)點(diǎn)是快速方便,當(dāng)記錄內(nèi)容的差別不大時(shí),可以使用復(fù)制粘貼的方法快速更改文本文件的內(nèi)容,然后執(zhí)行Java程序一切都OK了;它的缺點(diǎn)也很明顯就是靈活性較差,文本文件的中的每行記錄中的數(shù)據(jù)必須用統(tǒng)一的分隔符來(lái)劃分每個(gè)字段值(在我文本文件中用的是","),一旦用戶(hù)將分隔符寫(xiě)錯(cuò),那么Java程序就會(huì)失效。



          posted on 2007-04-14 10:21 我為J狂 閱讀(2201) 評(píng)論(10)  編輯  收藏 所屬分類(lèi): 數(shù)據(jù)庫(kù)編程

          評(píng)論

          # re: 一種向數(shù)據(jù)庫(kù)中寫(xiě)入數(shù)據(jù)的新方法[未登錄](méi) 2007-04-14 14:23 ibmsoft

          何必這么復(fù)雜呢,souceforge上有個(gè)opencvs  回復(fù)  更多評(píng)論   

          # re: 一種向數(shù)據(jù)庫(kù)中寫(xiě)入數(shù)據(jù)的新方法 2007-04-14 17:30 我為J狂

          @ibmsoft
          謝謝您的留言,能不能留個(gè)具體的鏈接地址?我好去學(xué)習(xí)學(xué)習(xí)。
            回復(fù)  更多評(píng)論   

          # re: 一種向數(shù)據(jù)庫(kù)中寫(xiě)入數(shù)據(jù)的新方法 2007-04-14 18:07 BeanSoft

          opencvs.souceforge.net 或者 google 一下, 呵呵  回復(fù)  更多評(píng)論   

          # re: 一種向數(shù)據(jù)庫(kù)中寫(xiě)入數(shù)據(jù)的新方法 2007-04-14 23:23 Astamei

          Mysql 的Query Browser 中有一個(gè)正值的工具 比這個(gè)方便多了

            回復(fù)  更多評(píng)論   

          # re: 一種向數(shù)據(jù)庫(kù)中寫(xiě)入數(shù)據(jù)的新方法 2007-04-15 10:51 我為J狂

          @Astamei
          如果我的數(shù)據(jù)庫(kù)是mysql以外的其他數(shù)據(jù)庫(kù)怎么辦?  回復(fù)  更多評(píng)論   

          # re: 一種向數(shù)據(jù)庫(kù)中寫(xiě)入數(shù)據(jù)的新方法 2007-04-15 17:33 劉甘泉

          這種方法我也用過(guò),項(xiàng)目里面有需要做的
          感覺(jué)用preparedstatement要好  回復(fù)  更多評(píng)論   

          # re: 一種向數(shù)據(jù)庫(kù)中寫(xiě)入數(shù)據(jù)的新方法 2007-04-15 18:04 我為J狂

          @劉甘泉
          謝謝您的建議,createStatement()返回的是Statement接口,prepareStatement()返回的是PreparedStatement接口,后者繼承自前者,由于PreparedStatement使用了precompile,因而執(zhí)行sql語(yǔ)句更高效,所謂的高效就是在sql語(yǔ)句解析執(zhí)行時(shí),速度更快,所以建議使用prepareStatement()。
            回復(fù)  更多評(píng)論   

          # re: 一種向數(shù)據(jù)庫(kù)中寫(xiě)入數(shù)據(jù)的新方法 2007-04-16 18:04 Fadesky

          Mysql不支持從文件導(dǎo)入數(shù)據(jù)嗎?  回復(fù)  更多評(píng)論   

          # re: 一種向數(shù)據(jù)庫(kù)中寫(xiě)入數(shù)據(jù)的新方法 2007-04-16 18:24 我為J狂

          @Fadesky
          我是想用程序?qū)霐?shù)據(jù),而不是手工導(dǎo)入數(shù)據(jù),SQLserver和Oracle都支持手工導(dǎo)入,對(duì)于MySQL,我不太清楚。  回復(fù)  更多評(píng)論   

          # re: 一種向數(shù)據(jù)庫(kù)中寫(xiě)入數(shù)據(jù)的方法 2008-11-29 15:09 哈特.比爾波

          看了一下,寫(xiě)的很有條例,對(duì)我們初學(xué)者來(lái)說(shuō),很適合。  回復(fù)  更多評(píng)論   

          <2007年4月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(11)

          隨筆分類(lèi)(48)

          文章分類(lèi)(29)

          常去逛逛

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 正镶白旗| 利川市| 宁河县| 鄂温| 蓬溪县| 靖州| 嵩明县| 屯门区| 原阳县| 内江市| 商南县| 耿马| 元江| 桃园市| 牡丹江市| 临海市| 无锡市| 盱眙县| 元朗区| 大姚县| 衡山县| 黑龙江省| 萝北县| 黄龙县| 阳朔县| 龙井市| 花莲县| 资兴市| 乌拉特中旗| 琼结县| 乌海市| 荣昌县| 广灵县| 德安县| 兴仁县| 莎车县| 蛟河市| 福鼎市| 临湘市| 冷水江市| 台湾省|