沉痛記下這次與 mysql 的交鋒,以全面潰敗結束

最近在做一個博客系統,後臺使用 ssh 框架,前臺使用 bootstrap ,因爲不是太熟悉,所以遇到不少問題,但看到成果一步步做出來,喜悅之情溢於言表!

然而今天,遇到了一個讓我崩潰的問題,戰鬥了好久,最後才被解決,感覺代碼之路一片黑暗。

我定義了一個實體類,裏面有一些屬性,然後就用 eclipse 裏 配置的 hibernate 工具去自動生成數據表,這個普通的過程我以前重複過 n 次了,每次都是平穩完成,因爲這根本就算不上能出故障的地方,然後這一次,問題百出。因爲我定義了兩個實體間多對多的關聯關係,在我完成生成數據表步驟後我就去 mysql 中查看我的表是否生成成功,讓我驚訝的是,僅僅生成了一張中間表(關聯表),實體表卻沒有生成!程序也沒有報錯,一切都很正常。我有點無語,認真對照了屬性名是否和配置文件一致,認真查看數據類型是否有錯,又刪掉數據表重新生成......然後重複 n 次後,一切還是原樣。我只好放棄使用 hibernate 工具,自己去數據庫手動建表,按說這應該沒什麼問題了。然後在程序中執行保存操作的時候,又出問題了,報 sql 語法錯誤的異常,我再一次鬱悶了,看着控制檯中的insert語句,看不出半點不對的地方,我不死心,又重複了這個過程 n 次,然而結果並沒有什麼不同,呵呵!最後實在沒辦法了,把控制檯中看似正常的insert語句拿到mysql 的工具 sqlyog 中去執行,也是報sql語法錯的異常,但這次,我看到了一點不同的東西,我的字段居然跟 sql 語句中關鍵字一樣,被着了色!!!我立馬去網上查了一下 mysql 數據庫的關鍵字,果不其然,看到了我的屬性名靜靜的躺在保留字的列表中,瞬間淚崩,我 取了個跟 mysql 數據庫保留字同名的變量名!!!

這是mysql數據庫的保留字:

ADD ALL ALTER
ANALYZE AND AS
ASC ASENSITIVE BEFORE
BETWEEN BIGINT BINARY
BLOB BOTH BY
CALL CASCADE CASE
CHANGE CHAR CHARACTER
CHECK COLLATE COLUMN
CONDITION CONNECTION CONSTRAINT
CONTINUE CONVERT CREATE
CROSS CURRENT_DATE CURRENT_TIME
CURRENT_TIMESTAMP CURRENT_USER CURSOR
DATABASE DATABASES DAY_HOUR
DAY_MICROSECOND DAY_MINUTE DAY_SECOND
DEC DECIMAL DECLARE
DEFAULT DELAYED DELETE
DESC DESCRIBE DETERMINISTIC
DISTINCT DISTINCTROW DIV
DOUBLE DROP DUAL
EACH ELSE ELSEIF
ENCLOSED ESCAPED EXISTS
EXIT EXPLAIN FALSE
FETCH FLOAT FLOAT4
FLOAT8 FOR FORCE
FOREIGN FROM FULLTEXT
GOTO GRANT GROUP
HAVING HIGH_PRIORITY HOUR_MICROSECOND
HOUR_MINUTE HOUR_SECOND IF
IGNORE IN INDEX
INFILE INNER INOUT
INSENSITIVE INSERT INT
INT1 INT2 INT3
INT4 INT8 INTEGER
INTERVAL INTO IS
ITERATE JOIN KEY
KEYS KILL LABEL
LEADING LEAVE LEFT
LIKE LIMIT LINEAR
LINES LOAD LOCALTIME
LOCALTIMESTAMP LOCK LONG
LONGBLOB LONGTEXT LOOP
LOW_PRIORITY MATCH MEDIUMBLOB
MEDIUMINT MEDIUMTEXT MIDDLEINT
MINUTE_MICROSECOND MINUTE_SECOND MOD
MODIFIES NATURAL NOT
NO_WRITE_TO_BINLOG NULL NUMERIC
ON OPTIMIZE OPTION
OPTIONALLY OR ORDER
OUT OUTER OUTFILE
PRECISION PRIMARY PROCEDURE
PURGE RAID0 RANGE
READ READS REAL
REFERENCES REGEXP RELEASE
RENAME REPEAT REPLACE
REQUIRE RESTRICT RETURN
REVOKE RIGHT RLIKE
SCHEMA SCHEMAS SECOND_MICROSECOND
SELECT SENSITIVE SEPARATOR
SET SHOW SMALLINT
SPATIAL SPECIFIC SQL
SQLEXCEPTION SQLSTATE SQLWARNING
SQL_BIG_RESULT SQL_CALC_FOUND_ROWS SQL_SMALL_RESULT
SSL STARTING STRAIGHT_JOIN
TABLE TERMINATED THEN
TINYBLOB TINYINT TINYTEXT
TO TRAILING TRIGGER
TRUE UNDO UNION
UNIQUE UNLOCK UNSIGNED
UPDATE USAGE USE
USING UTC_DATE UTC_TIME
UTC_TIMESTAMP VALUES VARBINARY
VARCHAR VARCHARACTER VARYING
WHEN WHERE WHILE
WITH WRITE X509
XOR YEAR_MONTH ZEROFILL

經驗:1.給實體類取變量名的時候,一定要注意不能和數據庫保留字相沖突

    2.用其他工具操作數據庫有錯誤時,一定要將出故障的sql語句拿到數據庫管理工具中去執行,一眼就能看出sql語句的異常

我想,這個錯我再也不會遇到了!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章