
2010年5月14日
今天在用IBATIS幫別人寫(xiě)個(gè)程序的時(shí)候突然出現(xiàn)了一個(gè)很怪異的錯(cuò)誤
com.ibatis.common.jdbc.exception.NestedSQLException:
--- The error occurred in ./map/Guest.xml.
--- The error occurred while applying a result map.
--- Check the Guest.listGuest.
--- Check the result mapping for the 'password' property.
--- Cause: java.sql.SQLException: Column 'userpwd' not found.
at com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.executeQueryWithCallback(MappedStatement.java:201)
at com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.executeQueryForList(MappedStatement.java:139)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:567)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:541)
at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForList(SqlMapSessionImpl.java:118)
at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForList(SqlMapClientImpl.java:94)
at com.zhxingchen.guestbook.dao.impl.BaseDAOImpl.queryAll(BaseDAOImpl.java:36)
at com.zhxingchen.guestbook.dao.impl.GuestDAOImpl.queryGuestByProperty(GuestDAOImpl.java:68)
at com.zhxingchen.guestbook.dao.impl.TestGuestDAO.testQueryByProperty(TestGuestDAO.java:55)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.internal.runners.TestMethodRunner.executeMethodBody(TestMethodRunner.java:99)
at org.junit.internal.runners.TestMethodRunner.runUnprotected(TestMethodRunner.java:81)
at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
at org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75)
at org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45)
at org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:66)
at org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:35)
at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42)
at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:38)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Caused by: java.sql.SQLException: Column 'userpwd' not found.
at com.mysql.jdbc.ResultSet.findColumn(ResultSet.java:983)
at com.mysql.jdbc.ResultSet.getString(ResultSet.java:4826)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.ibatis.common.jdbc.logging.ResultSetLogProxy.invoke(ResultSetLogProxy.java:47)
at $Proxy7.getString(Unknown Source)
at com.ibatis.sqlmap.engine.type.StringTypeHandler.getResult(StringTypeHandler.java:35)
at com.ibatis.sqlmap.engine.mapping.result.ResultMap.getPrimitiveResultMappingValue(ResultMap.java:619)
at com.ibatis.sqlmap.engine.mapping.result.ResultMap.getResults(ResultMap.java:345)
at com.ibatis.sqlmap.engine.execution.SqlExecutor.handleResults(SqlExecutor.java:384)
at com.ibatis.sqlmap.engine.execution.SqlExecutor.handleMultipleResults(SqlExecutor.java:300)
at com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQuery(SqlExecutor.java:189)
at com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.sqlExecuteQuery(MappedStatement.java:221)
at com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.executeQueryWithCallback(MappedStatement.java:189)
... 28 more
出現(xiàn)這個(gè)錯(cuò)誤的當(dāng)頭我就懵了,我怎么也想不明白數(shù)據(jù)庫(kù)里面怎么會(huì)沒(méi)有userpwd這個(gè)字段,我反復(fù)的對(duì)照都感覺(jué)數(shù)據(jù)庫(kù)里是有的啊,最后終于讓我找出了問(wèn)題所在,等知道后我就暈了,一個(gè)很簡(jiǎn)單的映射錯(cuò)誤,我居然反復(fù)了看了3個(gè)小時(shí),可能是熬夜了思維停滯了吧!
以下是SQLMap.xml的兩段段代碼:第一段是定義了一個(gè)resultMap,第二段是利用這個(gè)resultMap返回
<resultMap id="listGuest" class="guest">
<result property="id"/>
<result property="userName"/>
<result property="password" column="userpwd"/>
<result property="realName"/>
<result property="gender"/>
<result property="age"/>
<result property="email"/>
<result property="qq"/>
</resultMap>
<statement id="queryGuestByProperty" parameterClass="guest" resultMap="listGuest">
SELECT ID as id,
USERNAME as userName,
USERPWD as password,
USERREALNAME as realName,
USERSSEX as gender,
USERAGE as age,
USEREMAIL as email,
USERQQ as qq
FROM GUEST
<dynamic prepend="WHERE">
<isNotNull prepend="AND" property="password">
USERNAME=#userName#
</isNotNull>
...............
也許不仔細(xì)看還真看不出來(lái),其實(shí)USERPWD在取出來(lái)的時(shí)候就已經(jīng)轉(zhuǎn)換成password了,難怪在resultMap中始終找不到userpwd,這樣要是能找到才怪!~
改的話(huà)很容易,我傾向于改resultMap文件,將password后面的 column="userpwd"去掉就OK了!~
萬(wàn)事還得謹(jǐn)慎!!!!!
posted @
2010-05-15 06:57 Zhjiang 閱讀(1005) |
評(píng)論 (0) |
編輯 收藏
今天早上在上班的路上突然想起來(lái)《錦瑟》,于是隨便念了一下,走著走著,突然想讀讀這首詩(shī),不為其他,只為興起。
錦瑟 李商隱
錦瑟無(wú)端五十弦,一弦一柱思華年。
莊生曉夢(mèng)迷蝴蝶,望帝春心托杜鵑。
滄海月明珠有淚,藍(lán)田日暖玉生煙。
此情可待成追憶,只是當(dāng)時(shí)已惘然。
讀詩(shī),少不了要說(shuō)作者的,李商隱(約812年或813年1—約858年),字義山,號(hào)玉谿生、樊南生。晚唐詩(shī)人。原籍河內(nèi)懷州(今河南沁陽(yáng)),祖輩遷滎陽(yáng)(今河南鄭州)。(此段摘自維基百科)
這首詩(shī)描寫(xiě)了很多種物,也引用了兩個(gè)典故,只有最后一聯(lián)寫(xiě)的是情義。
首先,我們來(lái)看看這首詩(shī)里面的物,分別有錦瑟,蝴蝶,杜鵑,滄海,月亮,珍珠,淚水,藍(lán)田,太陽(yáng),玉,煙等等。除去中間引用的典故,其他基本都是靜物。首先寫(xiě)錦瑟,這件物事開(kāi)篇第一句就托出來(lái)了,點(diǎn)明全篇,我想當(dāng)時(shí)作者可能是看到了這樣一個(gè)錦瑟才引發(fā)了感慨,而且感慨頗深,每一弦一個(gè)雁柱都讓作者想到了以前的歡樂(lè)的時(shí)光,可見(jiàn)這件物事對(duì)他來(lái)說(shuō)銘心刻骨。然后是蝴蝶和杜鵑,當(dāng)然這兩個(gè)事物是作者引用的典故,其中有莊子的物我相容的典故和望帝的化杜鵑以寄意,可見(jiàn)作者對(duì)物的看法,也就進(jìn)一步點(diǎn)名作者此刻的心情可能是和錦瑟想容了,或者是作者將這個(gè)物看作了另一個(gè)人,即借物懷人,這個(gè)我們?nèi)粘R苍鴷?huì)有,譬如說(shuō)有時(shí)候你看到一個(gè)鐲子,可能和你送給你的朋友的信物很像,多年不見(jiàn)早已忘懷,如今再見(jiàn),難道在你眼中只看到了那個(gè)鐲子么?然后是滄海這一聯(lián),這一聯(lián)中一連寫(xiě)了好多物事,有八個(gè)之多吧,其中有像珍珠、玉這樣富貴的物事,也有像淚水,煙那樣易逝讓人悲傷的物事,更有像滄海、月亮、太陽(yáng)、藍(lán)田等亙古不變的物事,可見(jiàn)作者既描寫(xiě)了漫長(zhǎng),也描寫(xiě)了短暫,既描寫(xiě)了歡樂(lè),也描寫(xiě)了悲傷,然而,快樂(lè)并非是永久的,因?yàn)辄c(diǎn)題的兩個(gè)物事是淚和煙,可見(jiàn)歡樂(lè)的時(shí)光很短暫而悲傷和思念卻相當(dāng)漫長(zhǎng),可見(jiàn)作者思念之深。
其次,這首詩(shī)里有一句是抒情的,此情可待成追憶,只是當(dāng)時(shí)已惘然。那份情義本來(lái)是可以去期盼的但現(xiàn)在只能追憶,只是當(dāng)時(shí)已經(jīng)迷茫了。此句點(diǎn)題也呼應(yīng)了第一聯(lián)看到錦瑟后懷人。
在這里我突然想起了一些故人,也許當(dāng)年的吵鬧其實(shí)真的沒(méi)什么,卻又葬送了一段美好的情義,難道我們不也是迷茫了么?因而,要好好把握現(xiàn)在的這份感情,畢竟在數(shù)十億記的人群里,我們相遇,相知,到相愛(ài)是多么的不易,何苦非要鬧到以后看到了一些舊物卻只能以淚洗面,借物懷人呢!
Ps: 在這首詩(shī)里的藍(lán)田,我在幾年前曾去過(guò),一個(gè)本來(lái)以玉石聞名的地方現(xiàn)在只有青山依在,綠水長(zhǎng)流。可見(jiàn),就算有的時(shí)候是掌握了資源,掌握了財(cái)富,若干年后大家也沒(méi)什么不同。所以對(duì)于那些和我一樣在大都市里尋找角色的朋友,請(qǐng)你們不要悲傷,也不要郁悶,生命很短暫,如何在有限的時(shí)間里讓生命更充實(shí),讓生活更輕松,讓自己更快樂(lè)才是我們所應(yīng)該考慮的事情。因?yàn)椋覀円嘈牛瑫r(shí)間才是仲裁者,一切的不平等,不平均在時(shí)間的面前都是泡沫,最后等會(huì)消散于無(wú)形。另外,藍(lán)田值得你去看一下!
posted @
2010-05-14 19:57 Zhjiang 閱讀(203) |
評(píng)論 (0) |
編輯 收藏
Apache Qpid:
Wiki上的描述是:
Apache Qpid is an open source (Apache 2.0 licensed) messaging system which implements the Advanced Message Queuing Protocol. It provides transaction management, queuing, distribution, security, management, clustering, federation and heterogeneous multi-platform support.
OK,不廢話(huà),進(jìn)入正題,我今天搞了一天才將其配置好,稍微會(huì)有一點(diǎn)麻煩,不過(guò)還算好用,對(duì)于用到Message Queue或者想用的朋友,可以嘗試一下!
首先進(jìn)入
http://qpid.apache.org/getting-started.html,然后進(jìn)入download 頁(yè)面,由于我是用JAVA來(lái)開(kāi)發(fā),所以我選擇下載Mutiple Component Packages條目下的JAVA broker,client & tools這一個(gè),用C++開(kāi)發(fā)或者其他語(yǔ)言開(kāi)發(fā)的也可以適當(dāng)選擇下載。另外還有一個(gè)適用的工具可以下載是在Management tools條目下面(是一個(gè)基于Eclipse RUP 的軟件,由于今天調(diào)了半天沒(méi)調(diào)好所以就不說(shuō)明了)
然后回到getting-start那一頁(yè)看安裝說(shuō)明: 在這里我稍微說(shuō)下吧,反正也很簡(jiǎn)單(解壓什么的就略過(guò)了)!
1. 設(shè)置環(huán)境變量,這里有兩個(gè)環(huán)境變量需要設(shè)置 QPID_HOME 和QPID_WORK,上面的E問(wèn)很簡(jiǎn)單,QPID_WORK是用來(lái)設(shè)置broker產(chǎn)生文件的路徑,主要是LOG吧。
2.修改%QPID_HOME%\etc\config.xml文件,主要是修改management下面的<keyStorePath></keyStorePath>的文件路徑,否則直接啟動(dòng)會(huì)出現(xiàn)一個(gè)莫名其妙的找不到文件的錯(cuò)誤
3.修改%QPID_HOME%\bin\create-example-ssl-strores.bat文件這里要修改三處,將-keystore后面的路徑換成你在第二部設(shè)置的文件路徑,這里可以看到這個(gè)批處理文件其實(shí)用的是%JAVA_HOME%\bin的keytool命令,有關(guān)keytool的命令詳解可以看
http://shenzhenchufa.blog.51cto.com/730213/169390(這篇不是我寫(xiě)的,不好轉(zhuǎn)載,只好給鏈接,但是很詳細(xì))
4.執(zhí)行create-example-ssl-strores,然后執(zhí)行qpid-server命令即可,你可以發(fā)現(xiàn)broker很正常的啟動(dòng)了
在測(cè)試到broker啟動(dòng)之后可以利用svn Check(
https://svn.apache.org/repos/asf/qpid/trunk/qpid/java/client/example/)來(lái)得到具體例子(PS:什么還不會(huì)有SVN???)里面的例子寫(xiě)的還不錯(cuò),很詳細(xì),示例可以導(dǎo)入eclipse中執(zhí)行,當(dāng)然,在執(zhí)行示例的時(shí)候如果把broker給關(guān)掉了就不能出來(lái)結(jié)果了,當(dāng)運(yùn)行jmsexample下面的Hello.java出現(xiàn)了Hello world時(shí),那么恭喜你,Qpid安裝成功了,然后想干什么就可以具體發(fā)揮了!
對(duì)于JMS的Prodcer(PTP)/Publisher(PUB/SUB)執(zhí)行步驟一般是
1.通過(guò)ConnectionFactroy得到Connection(請(qǐng)注意Qpid示例中properties文件的connectionfactory.xxxxx鍵后面對(duì)應(yīng)的值一般都是amqp://xxxx:xxxx@xxxx/xxx?brokerlist='tcp://localhost:5672'格式的)
2. 通過(guò)Connection獲得一個(gè)Session(PTP)/TopicSession(PUB/SUB)
3. 獲得MessageProducer(PTP)/Topic(PUB/SUB)
4. 產(chǎn)生/發(fā)布消息
5. 關(guān)閉Connection(當(dāng)關(guān)閉Connection的時(shí)候,Session 也會(huì)自動(dòng)關(guān)閉)
消費(fèi)者/訂閱之的執(zhí)行步驟幾乎差不多,就是第四步是消費(fèi)/訂閱消息
好了,今天就寫(xiě)到這吧,很簡(jiǎn)單的介紹,以后再慢慢寫(xiě),有什么問(wèn)題,大家可以共同探討下!
最后,注意文明用語(yǔ),謝謝!~~~~
posted @
2010-05-14 18:48 Zhjiang 閱讀(1215) |
評(píng)論 (0) |
編輯 收藏