【java&数据库】写冰川立方体中遇到的问题及解决

来源:互联网 发布:unity3d 5.0教程 编辑:程序博客网 时间:2024/04/28 23:25

<写在前面>

师兄那么好,冰川的实验我都不好意思拖了,可是还是因为重感冒一周,从4月20号左右,拖到今天(都5月了),还没完成,觉得很荽。神牛说,进去好好表现,早点出来。。。我这表现,也太懒了。。我有点受不了。。

平时做题做惯了,而且也都用的c++,notepad++ && g++,no IDE,但是这次是要操作数据库的,还要用java写,本来就对java没怎么用不熟。师兄本来说的是用sqlsever,结果被我弄了好久,下了几个sqlsever的用不起,连个excel的表格都导不进去,我真是笨啊。。。总之,搭环境用了好久,觉得好麻烦,可能真是有点笨。。。最后还是没能征服sqlsever,用的access(这个在上学期写数据库课程设计的时候用的,还算比较熟悉,而且本来这个就比较简单以至于不专业。。。)

中途遇到问题,可能是我search能力比较弱吧,网上看到的老是解决不了手边的问题,各种书堆着桌上,页页摸索,终于差不多都解决了。

现在写在blog上,看上去好像都是简单的问题,作为java菜菜,解决的过程中还是碰壁很多的。。呜啦啦。。

<废话结束>

写个全名吧。OLGP的透析查询的初期物化过程中,作为没碰过项目一直g++的娃,在java中遇到的问题及解决

1.Access数据库导入excel表格用作数据库的表并建立与数据库的连接

先在Access中建一个数据库,明个名字(如ACM),在ACM数据库中新建表,选导入,从excel。就可以从excel中导入数据表了。注意Access与excel的版本。再连odbc数据源,再java project中写上连接Access数据库的代码就ok了


/*make a connection between Access database and java application*/public static Connection getConnection() {Connection conn = null;try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); conn = DriverManager.getConnection("jdbc:odbc:数据源名","xl","123");}catch(ClassNotFoundException e){e.printStackTrace();System.exit(1);}catch(SQLException e){e.printStackTrace();}return conn;}

Connection con = getConnection();/*create a connection */这一句是写在main方法里面的

2.java代码对数据表的操作,当表的某些字段可以为空时,怎样判断是空

1)Statement stmt = con.createStatement();
      String sql = "select * from Student";
      ResultSet rs = stmt.executeQuery(sql);

这样就可以执行sql代码了

2)用rs.wasNull()的false或true来判断刚取的值是否为null,即某字段是否为空(有没觉得java实现这个判空功能有点蠢。。。我都无语了。。。这纯属先犯错再发现。。。)


3.在使用Map类时,如果要实现对key值的判重,需要override(注意是覆写,不是重载)hashCode()和equals(),例如:

class co {int a;int b;co(int x,int y){this.a=x;this.b=y;}co(){}public int geta(){return a;}public int getb(){return b;}//@Overridepublic int hashCode(){int hash ;hash = (geta()*getb()*1013+geta()+getb())%20341;//我随便计算的。这个hash值可以随意计算的,Object类的hashCode计算hash值与地址有关,所以不能直接在自己的类中继承Object类中的实现,否则达不到判重的效果。并且hashcode()和equals()应注意和谐一致。return hash;}//@Override public boolean equals(Object o){boolean res = ((o instanceof co) && ((co)o).a==a && ((co)o).b==b);return res;}}

4.sql查询的结果集ResultSet rs = stmt.executeQuery(...)

要注意游标问题,rs并未指向一个合法的游标,合法的游标是从rs.next()开始的,经常写while(rs.next())那是rs的记录不止一条时,但也可见其是从rs.next开始取第一条的,今天我碰到一个rs只有一条记录的查询,我没写rs.next,直接使用的rs来读,就一直报错(无效的游标状态)

另外,在有不确定参数的查询时,可以使用PreparedStatement pstmt = con.preparedStatement(sql);

其中sql 可写为,例如 sql="select name from Student where id =?";此处?表示一个不确定的值,由pstmt.SetInt(1,id)来填充,1表示第一个出现?的地方替换成id,若有n个问号,以此类推,setxxx方法,其中的xxx是?处的类型(int,long,string神马的)。

当然也可以用Statement stmt=con.createstatement();中,stmt.excuteQuery()来实现。sql语句则应写成sql="select name from Student where id=",再在stmt.executeQuery(sql+id);来实现相同的功能。我对java不熟,看网上说pstmt比stmt快很多。

5.java中使用Vector

java这玩意,神马都是类,Vector也是咯,所以它的使用与c++的stl中的vector还是略有不同,作为对java各种不熟的人,还是压力很大。每对vector的对象进行一次操作(插入、或者读取)一个元素,都是使用对象去调用vector类的方法,例如addElement()或者get()等。但是要注意,在判断一个vector的size时,这个size,如果对于一个vector数组的话,是你预先定义的数组大小,而不是你当前vector中的实际元素个数,所以需要调用一个方法.trimToSize方法,来把当前vector中空的部分先去掉,剩下当前vector中确实存在的元素,再用.size就可以求出来实际元素个数了。

结束

另外,貌似也没啥了。晚上写完的。总之,感觉java这东西,还是没人们吹嘘的那么简单的,它还是有很多实现很巧妙和靠谱的地方 。遇到问题,周围熟的搞java的人也不多,所以多半都是自己去上网查或者书上查,但,问题吧,总归还是能解决的。ps操作数据库,读入数据表真的是很慢诶。。总共一张表扫描时12499条记录,活生生地跑了好久没出来,我都看了一集动漫了有没有。。。做acm的哪里能忍受这个速度,我直接怀疑它RE了。。师兄说,这很正常。。。⊙﹏⊙b汗