#{}と$ {}の違い
#{}はプレースホルダーを表します。#{}を使用すると、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>
テストコードを再度実行して、結果を確認します。
さあ!!!