Mybatisの#{}と$ {}の違いと詳細なパラメータ

#{}と$ {}の違い

   #{}はプレースホルダーを表します。#{}を使用すると、preparedStatementの値をプレースホルダーに設定し、Javaタイプとjdbcタイプの間で自動的に変換できます。#{}はSQLインジェクションを効果的に防ぐことができます。#{}単純な型の値またはpojo属性の値を受け取ることができます。parameterTypeが単一の単純型値を送信する場合、#{}角かっこは値または他の名前にすることができます。
   $ {}は、SQL文字列のスプライシングを意味します。parameterTypeで渡されたコンテンツは、jdbc型変換なしで$ {}を介してSQLにスプライシングでき、SQLインジェクションの問題が発生します。$ {}は、単純型の値またはpojo属性値を受け取ることができます。parameterTypeが単一の単純型の値を送信する場合、$ {}は括弧内の値のみにすることができます。

parameterType

   sqlステートメントの受け渡しパラメーターは、このプロパティを介して設定されます。このプロパティの値は、基本型、参照型(例:文字列型)、またはエンティティ型(POJO型)にすることができます。同時に、エンティティクラスのパッケージングクラスを使用することもできます。基本型と文字列型名を直接書き込むことも、パッケージ名を使用することもできます。クラス名のメソッド(例:java.lang.String)。前の章では、idクエリに従ってユーザーから渡されたパラメーターを追加、削除、変更、および確認します。渡されたパラメーターは整数です。ユーザーから渡されたパラメーターを保存すると、エンティティークラスUserも以下に示すように、pojoラッパークラスオブジェクトで渡されます。mavenプロジェクトについては、前の章を参照してください
。QueryVoパッケージングクラス:

/**
 * @ClassName QueryVo
 * @description: 该类中包含一个对象属性
 * @author: zjw
 * @Date 2021/2/25 19:04
 * @Version 1.0
 **/
public class QueryVo implements Serializable {
    
    
    //该属性是一个对象
    private User user;
    public User getUser() {
    
    
        return user;
    }
    public void setUser(User user) {
    
    
        this.user = user;
    }
}

UserMapperインターフェースにメソッドを追加します。

    /*** 
    * @Description 
    * @Param: [vo]
    * @return: java.util.List<com.zy.domin.User>
    * @Date: 2021/2/26
    */ 
    List<User> findQueryVo(QueryVo vo);

SqlMapConfig.xmlのコア構成ファイルは前の章と同じです。UserMappe.xmlはsqlステートメントを追加します。

    <!--传入包装类-->
    <select id="findQueryVo" parameterType="com.zy.vo.QueryVo" resultType="com.zy.domin.User">
        select * from user where username like #{
    
    user.username}
    </select>

テストコード:

@Test
    public void testFindQueryVo(){
    
    
        QueryVo vo = new QueryVo();
        User user = new User();
        user.setUsername("%小%");
        vo.setUser(user);
        for (User u:userMapper.findQueryVo(vo)){
    
    
            System.out.println(u);
        }
    }

ここに画像の説明を挿入

resultType

resultType属性は、結果セットのタイプを指定でき、基本タイプとエンティティクラスタイプをサポートし、前のクラッドに役立ちます。エンティティクラス属性に要件がある場合、エンティティクラス属性名はデータベースフィールドと一致している必要があります。一致していないと、カプセル化を実現できません。
daoインターフェース:

    /***
    * @Description 查询所有
    * @Param: []
    * @return: java.util.List<com.zy.domin.User>
    * @Date: 2021/2/22
    */
    List<User> findAll();

マッピング構成:

    <!--查询所有-->
    <select id="findAll" resultType="com.zy.domin.User">
        select * from user
    </select>

SqlMapConfig.xml、jdbc.properties、log4j.properties構成ファイルは、前の章と同じです。
エンティティクラス、属性、およびデータベースフィールドに一貫性がありません。

public class User {
    
    
    private Integer uid;
    private String userName;
    private Date userBirthday;
    private String userSex;
    private String userAddress;
    //getXXX,setXXX,toString()方法此处省略
}

テストコード:

    @Test
    public void testFindAll(){
    
    
        List<User> list = userMapper.findAll();
        for (User user : list){
    
    
            System.out.println(user);
        }
    }

ここに画像の説明を挿入
テスト結果から、userNameのみが値を持っていることがわかります。これは、MySQLデータベースがWindowsシステムで大文字と小文字を区別しないためです。ただし、他の属性には値がありません。それを解決する方法は、エイリアスでクエリできます:
マッピング構成を変更します:

    <!--查询所有-->
    <select id="findAll" resultType="com.zy.domin.User">
        select id as uid,
        username as userName,
        birthday as userBirthday,
        sex as userSex,
        address as userAddress 
        from user
    </select>

テストコードを再度実行して、結果を確認します。
ここに画像の説明を挿入思考:クエリが多い場合、エイリアスを使用するのは面倒ですか?他の解決策はありますか?以下を参照してください。

resultMap

resultMapタグは、クエリ列名とエンティティクラスの属性名に一貫性がない場合に、対応する関係を確立できます。パッケージングを実現するために。resultMap属性を使用して、selectタグで参照を指定します。同時に、resultMapは、クエリ結果を複雑なタイプのpojoにマッピングできます。たとえば、クエリ結果マッピングオブジェクトにpojoとlistを含めて、1対1のクエリと1対多のクエリを実現します。
マッピング構成:

<mapper namespace="com.zy.dao.UserMapper">
    <resultMap id="userMap" type="com.zy.domin.User">
        <!--
        id 标签:用于指定主键字段
        result 标签:用于指定非主键字段
        column 属性:用于指定数据库列名
        property 属性:用于指定实体类属性名称
        -->
        <id property="id" column="uid"/>
        <result property="userName" column="username"/>
        <result property="userBirthday" column="birthday"/>
        <result property="userSex" column="sex"/>
        <result property="userAddress" column="address"/>
    </resultMap>
    
    <!--查询所有-->
    <select id="findAll" resultMap="userMap">
        select id,username,birthday,sex,addressfrom user
    </select>
</mapper>

テストコードを再度実行して、結果を確認します。
ここに画像の説明を挿入さあ!

おすすめ

転載: blog.csdn.net/qq_42494654/article/details/114072859