MyBatisのを使用する場合は、多かれ少なかれ、これらの問題に実行します。質問自体は、解決するためにも非常に簡単です、難しいことではありません。以下は、1様々な問題、原因と解決策のシーンずつ紹介します。最後に、このような問題を回避する方法について話を統一。
(存在しないカラム)を発行
MyBatisの持つ問題は、より一般的な低レベルのエラーです。
問題の説明:
###エラーデータベースに照会します。原因:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:不明な列「名前」「フィールドリスト」で ###エラーが伴うことがdefaultParameterMap ###パラメータの設定中にエラーが発生しました ###原因:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:「フィールドリスト」で不明な列「名」 ; 悪いSQL文法[]
主な理由:
-
SQLクエリではなく、データベース内でMyBatisのXML列。
-
SQL文は、データベースにない列またはデータ型に対応する値を列を追加します。
解決策:プロジェクトの実際の状況によると、通常は以下の三つのソリューションを持っています:
-
SQLステートメントを変更し、声明から削除何の列は存在しません。
-
データベースには、存在しない新しい列。
-
ときに新しい、 ``文字列表現の中国の記号を使用しないでください。すなわち、 - キーシンボルに対応します。
注意事項:
-
データベース内の列を削除します。SQLステートメントでは、フィールドを削除する同期はありません。問題が発生しやすくなります。
-
特別なシーンもあり、それは、これらの問題の発生につながります。
次のSQLは、新しいアクションを実行しませんが、Windows環境で上記のエラーが表示されます。
()(現在)(今、NAME` `)(名前、CREATED_TIME、updated_time)値t_base_user挿入。
しかし、Linux環境では、それが新しい操作になります。しかし、名前の値が追加されることはありません。
第二の問題(曖昧フィールド)
問題の説明:
###エラーデータベースに照会します。原因:com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:列フィールドリストの「OIDは、」あいまいです ###エラーが伴うことがdefaultParameterMap ###パラメータの設定中にエラーが発生しました 原因###:com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationExceptionを:フィールドリストの列「OIDは、」あいまいです ; SQL []; フィールドリストの列「OIDは、」あいまいです
主な理由:あなたのテーブルがクエリに参加したときに何も指定されたフィールドはありません。それは言うことです。表には、名前フィールドを持ち、Bテーブルには、フィールド名を持っています。クエリ名は、クエリに参加すると。SQL Serverは、鉛の名前フィールドを返すために、どのテーブルを知りません。
解決策:明確なクエリは、テーブルの列に属します。
例えば:
最後に、テーブル構造では、我々はテストすることができる子供用の靴に興味を持っています。上記のような問題点を復元するには、以下のSQLを実行し、
uはRIGHT JOINのようt_base_userから、名前を選択しu.id u.id = r.user_id上のRとしてt_base_user_role
注:上記の文は u.id 修正 idが 適切に実行することができます。idフィールドが公開されていないので、唯一のユーザーテーブルのみidフィールド。
質問3(一貫性のない受信側オブジェクト)
問題の説明:
スレッド「メイン」org.mybatis.spring.MyBatisSystemExceptionの例外:ネストされた例外はorg.apache.ibatis.exceptions.TooManyResultsExceptionです:期待つの結果(またはnull)selectOne()によって返されたが、発見されます。
主な理由は:オブジェクトは、単一のインタフェースを指定返します。ただし、SQL、記事の条件を満たしているか、データの実装後。
解決策:
実際のビジネスシナリオによると、通常2つのソリューションがあります。
図1に示すように、インターフェースの結果セットを返すように修正されます。
それが唯一の予選結果を返すように2、SQLステートメントを変更します。
質問4(重複メソッド名)
説明:
Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.lang.RuntimeException: Error parsing Mapper XML. Cause: java.lang.IllegalArgumentException: Mapped Statements collection already contains value for UserDao.getUserByName
原因: 在UserDao中,有两个同名方法getUserByName导致。
解决办法: 重命名其中一个方法名即可。
问题五 (不存在的属性)
描述:
Error updating database. Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'username' in 'com.andyqian.user.bean.User' Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'education' in 'class com.andyqian.user.bean.User'
原因: SQL中查询的列,在其实体对象中不存在对应的属性。
解决办法: 在对应的实体对象上,添加上缺失的属性即可。
数据结构
在本文中,所有测试均使用以下表结构。SQL语句如下所示,有兴趣的童鞋可以进行实验。
create table t_base_user_role( oid bigint(20) not null primary key auto_increment comment "", user_id bigint(20) null comment "", name varchar(50) null comment "", create_time datetime null comment "", update_time datetime null comment "" ) CREATE TABLE `t_base_user` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(50) CHARACTER SET utf8mb4 DEFAULT NULL, `created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `deleted` tinyint(4) NOT NULL DEFAULT '1', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
最后
上述几个都属于比较常见且容易解决的问题。基本上能够通过描述,就能定位到问题的原因。之所以能够发生。简答归纳为以下两点:
-
xml文件中的SQL,没有在数据库中执行。
-
没有写单元测试。
由此可见,单元测试能够为我们排除掉一些比较低级,甚至是手误带来的bug。也能为我们节省不少时间来解决更复杂,更有挑战性的问题。