デモ
たとえば、次のコードで、type が値 2 を渡した場合、方程式が成り立つかどうかはわかりませんか?
<if test="type == '2'">
詳細なコードは次のとおりです:
xml:
<select id="selectByUserNameTest" resultMap="BaseResultMap">
SELECT * FROM `sys_user`
WHERE is_delete = 0
<if test="type == '2'">
and is_delete = 1
</if>
</select>
マッパー:
SysUser selectByUserNameTest(Integer type);
テスト:
@Test
public void ssss() {
getAscii('2');
sysUserMapper.selectByUserNameTest(2);
System.out.println(1);
}
答えは真実ではありません。結果を見てください。
方程式内の SQL は実行されません。
その理由は、Java が強力な変換であるためです。比較では、式の両側のフィールドの型が一致するように調整する必要があります。ここでの '2' は文字型とみなされますが、渡す型は次のとおりです。数値型なので、一致しない場合は、この時点で Java が強制変換を実行し、文字 '2' が ASCII コード値に変換されます (文字の比較は ASCII の比較です)。ここで、'2' の ASCII 値は 50 であることがわかり、最終的な式は 2== 50 となり、方程式は成立しませんが、このとき type が値 50 を渡せば方程式は成立します。
展開1
<if test="type == '22'">
type が数値型でもある場合、値は 22 となり、方程式は成立しません。
まず 1 つ変更します
<if test="type == 22">
これは本当でしょうか? 答えは間違いなく「はい」です。2 番目の 22 は明らかに数値型であるため、答えは間違いなく true です。
ただし、最初の '22' の型はまだ固定されていません。これは、方程式の左側に渡されたパラメータに基づいて決定されます。前のパラメータは数値です。これは、方程式の右側が に変換されるためです。数値型. 答えも同様です。
型が文字列の場合、後で比較するために文字列型に変換されるため、答えも有効です。
拡張2
最初の例のように、type が文字列 "50" を渡す場合、方程式も true となり、Java が強制的に変換された後、ascll 値は文字列 "50" に変換されます。
拡張 3
Java は転送を強制するのに役立ちますが、すべてを転送できるわけではありません。たとえば、次のとおりです。
<if test="type == 'aa'">
type は数値型を渡し、上記の 'aa' は強制変換による例外を報告します。
質問
私もこれらの状況を見ていくつかまとめてみましたが、mybatis での Java の強制転送のルールがまだわかりません。上記の例に関して、もう 1 つよくわからない点があります。mybaitisでは、明らかにパラメータに基づいて変換が行われますが、デモの文字「2」が文字列または数値に変換されないのはなぜでしょうか?それが表示されている限り、文字は ascl として比較されます。これも私の推測です。神様が私に導きを与えてくださることを願っています。ありがとうありがとう。
道具
Java 文字を ASCII 値コードに変換
private void getAscii(char ch) {
int asciiValue = (int) ch;
System.out.println("ASCII value of " + ch + " is: " + asciiValue);
}
要約する
コードを書く際には上記の問題は起こらないかもしれませんが、数値は数値比較、文字列は文字列比較というルールに従って書いていれば、上記の問題を避けるために強制転送は極力避けるようにしましょう。でも、せっかく遭遇したのだから、今後誰かに聞かれても分からないとは言いたくないので、記録しておこうと思います、ふふ、バイ!!