よくある間違いMyBatisの

  MyBatisのを使用する場合は、多かれ少なかれ、これらの問題に実行します。質問自体は、解決するためにも非常に簡単です、難しいことではありません。以下は、1様々な問題、原因と解決策のシーンずつ紹介します。最後に、このような問題を回避する方法について話を統一。

(存在しないカラム)を発行

MyBatisの持つ問題は、より一般的な低レベルのエラーです。

問題の説明

###エラーデータベースに照会します。原因:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:不明な列「名前」「フィールドリスト」で
###エラーが伴うことがdefaultParameterMap
###パラメータの設定中にエラーが発生しました
###原因:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:「フィールドリスト」で不明な列「名」
; 悪いSQL文法[]

主な理由

  1. SQLクエリではなく、データベース内でMyBatisのXML列。

  2. SQL文は、データベースにない列またはデータ型に対応する値を列を追加します。

解決策:プロジェクトの実際の状況によると、通常は以下の三つのソリューションを持っています:

  1. SQLステートメントを変更し、声明から削除何の列は存在しません。

  2. データベースには、存在しない新しい列。

  3. ときに新しい、 ``文字列表現の中国の記号を使用しないでください。すなわち、 - キーシンボルに対応します。 

注意事項

  1. データベース内の列を削除します。SQLステートメントでは、フィールドを削除する同期はありません。問題が発生しやすくなります。

  2. 特別なシーンもあり、それは、これらの問題の発生につながります。 

次の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

  

最后

上述几个都属于比较常见且容易解决的问题。基本上能够通过描述,就能定位到问题的原因。之所以能够发生。简答归纳为以下两点:

  1. xml文件中的SQL,没有在数据库中执行。

  2. 没有写单元测试。

     

由此可见,单元测试能够为我们排除掉一些比较低级,甚至是手误带来的bug。也能为我们节省不少时间来解决更复杂,更有挑战性的问题。

おすすめ

転載: www.cnblogs.com/lqs649646508/p/11627151.html