なお、MyBatisの細部を使用した場合

1. Mapper.xmlインターフェイスマッパー返される値との対応関係

  • このSQL文は、チェックアウトするもののMapper.xmlファイルでは、結果はresuleTypeはここで、複数のかもしれませんが、リストを書いていない、まだラインに学生を書きます
<select id="findStudentByUsername" parameterType="String" resultType="cn.ykf.domain.Student">
    SELECT * FROM student WHERE username LIKE #{key};
</select>
  • マッパーインターフェースを使用せずに使用されるべきで自動的にリストの対応するタイプのセットにクエリ複数のパッケージを記録SelectListのある()メソッドを、
List<Student> students = sqlSession.selectList("test.findStudentByUsername", "%测试%");
  • マッパーインターフェースは、インターフェースは、マッパー対応する方法は、本明細書戻り値として定義されるものと定義されるべきである場合のリストパッケージは、生徒の複数の集合である場合、コールは戻ります
/**
 * 根据用户名模糊查询
 *
 * @param key 用户名模糊查询关键字
 * @return 全部符合条件的Student集合
 */
List<Student> findStudentByUsername(String key);
  • あなたの場合は上記のSQL文のような定義は、その後、ときコールは次のようでなければならないこと。その時間を渡すパラメータは、前と後に「%」パラメータを使用して、独自のを必要とします
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
List<Student> students = mapper.findStudentByUsername("%测试%");
  • あなたがしたい場合はキーワードだけを着信時にパラメータを渡す、それは、SQLステートメントに変更することができます
<select id="findStudentByUsername" parameterType="String" resultType="cn.ykf.domain.Student">
	SELECT * FROM student WHERE username LIKE "%"#{key}"%";
</select>

若しくは

<select id="findStudentByUsername" parameterType="String" resultType="cn.ykf.domain.Student">
    SELECT * FROM student WHERE username LIKE '%${value}%';
</select>
  • 第2の方式以来、最初のオプションをお勧めします 預金 S q l S t r i n g {...} SQLインジェクションの問題が存在し、かつのでString型のパラメータ渡しの、我々だけ書くことができます {値}を回避せずにエラーを書き込むことができませんここに画像を挿入説明

    • 最初のオプションを使用する場合にも、パラメータが書くべき「%」#{キー}「%」を、両側の引用符は、単一引用符である必要はないと%単一引用符が自動的に外で可変であるパースに{...}#SQL文なのでとき、そうそこに単一引用符を使用しないように、二重引用符の%を使用する必要がある、または任意の結果を見つけることができません
    • 最初のシナリオSQLパラメータ名を簡単に書くことができます
  • 参考資料

戻り値の変化のチェックの削除に関しては2

  • 唯一のクエリ</ select>タグのみresultTypeとプロパティ<選択> <挿入> </挿入>に、他の追加および削除、 </削除> <削除>、<更新> </更新> resultTypeとプロパティはありませんが、デフォルトの戻り偏見の記事へ数、int型

データの修正3.ハング

引数を変更すると、NULLが存在する中、そのフィールドの値を覆われている3.1。

  • 最初は、のように変更したSQL文は、Mapper.xmlは、SQL文の修正に定義された次のレコードIDのすべてのフィールド値が削除します
<update id="updateStudent" parameterType="cn.ykf.domain.Student">
    UPDATE student SET username = #{username}, password = #{password}, birthday = #{birthday}, chinese = #{chinese}, math = #{math}, english = #{english} WHERE id = #{id}
</update>
  • 作成、請求次に、以下のテストコードは、ID 5、唯一のユーザ名とパスワードのプロパティは空でない学生オブジェクトを、その後、変更するパラメータとしてオブジェクトを使用します
@Test
public void testUpdateStudent() {
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
    // 测试数据,如果对象只有一个属性被赋值,那么写入数据库后,数据库中原本有值的字段是否会变成NULL?
    Student stu = new Student();
    stu.setId(5);
    stu.setUsername("test");
    stu.setPassword("test");

    int flag = mapper.updateStudent(stu);
    // 提交事务
    sqlSession.commit();
    System.out.println(flag);

    // 释放资源
    MybatisUtils.close(sqlSession);
}
  • NULLを含む方法に渡されたログの表示パラメータ、
    • ここに画像を挿入説明
  • オリジナルデータベースレコードIDが5以下で
    • ここに画像を挿入説明
  • 修正後、レコードはなり
    -ここに画像を挿入説明
  • 結論
    • データを変更する場合、SQL文は複数のフィールドを変更する場合は、あなたがする必要がありますNULL値の変化が存在するデータベース内のレコードを避け、NULLにプロパティに渡された引数は注意

3.2。渡されたID値が存在しません

  • 上記に代えて、テストデータ値のIDコードがデータベースに存在しない場合、例えばstu.setId(1000);、次に何が起こりますか?
  • パスの場合に見出さ試験後のID値が存在しない場合、データベースは、対応するレコードに見つけることができない存在し、変更されないであろう、それはデータベース内のデータに影響を与えないであろう
    • ここに画像を挿入説明

3.3。レコードの挿入/削除/を変更するには、間違ったメソッドを呼び出します

  • 私たちは、レコードを更新したい場合は、Mapper.xmlファイルに定義されたSQL文は正しいですが、コードの中で、私たちは間違ったメソッドを呼び出すように注意していない、何が起こるのでしょうか?例えば、次のコード
<mapper namespace="test">
    <!-- 修改 -->
    <update id="updateStudent" parameterType="cn.ykf.domain.Student">
        UPDATE student SET username = #{username}, password = #{password}, birthday = #{birthday}, chinese = #{chinese}, math = #{math}, english = #{english} WHERE id = #{id}
    </update>
</mapper>
@Test
    public void testUpdateStudent() {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        Student stu = new Student();
        stu.setId(5);
        stu.setUsername("test");
        stu.setPassword("test");

        // 比如在这里想要修改数据,结果调用了delete()或者insert()
        int flag = sqlSession.delete("test.updateStudent", stu);
        // 提交事务
        sqlSession.commit();
        System.out.println(flag);

        // 释放资源
        MybatisUtils.close(sqlSession);
    }
  • 上記のコードでは、我々はIDレコード5を変更したい、もともと)()(更新を使用していますが、私たちのために間違った手の、誤って削除を使用して()、またはINSERT必要がありますファイル名を指定して実行]をクリックし、我々はプログラムが与えられていないことを見つけるために驚いたが、データベースを閲覧した後、データ変更成功なぜ?
  • 前変更ここに画像を挿入説明
  • 変更されましたここに画像を挿入説明
  • 分析
    • ビューMyBatisのソースorg.apache.ibatis.session.defaults.DefaultSqlSessionここに画像を挿入説明
    • I)は、そのようなコードがあることが見出されたインサート()および()メソッドを削除し、最終的に(更新を呼び出します。私たちは、更新操作のコードで削除()/挿入()を呼び出すが、最終的にMyBatisのデータを更新するために)(更新を使用している間、だから、それは影響を与えません。
    public int insert(String statement) {
      return insert(statement, null);
    }
    
    public int insert(String statement, Object parameter) {
      return update(statement, parameter);
    }
    
    public int update(String statement) {
      return update(statement, null);
    }
    
    public int update(String statement, Object parameter) {
      try {
        dirty = true;
        MappedStatement ms = configuration.getMappedStatement(statement);
        return executor.update(ms, wrapCollection(parameter));
      } catch (Exception e) {
        throw ExceptionFactory.wrapException("Error updating database.  Cause: " + e, e);
      } finally {
        ErrorContext.instance().reset();
      }
    }
    
    public int delete(String statement) {
      return update(statement, null);
    }
    
    public int delete(String statement, Object parameter) {
      return update(statement, parameter);
    }
    
  • 参考資料
リリース元の4件の記事 ウォンの賞賛2 ビュー128

おすすめ

転載: blog.csdn.net/a1092882580/article/details/103486201