プロキシDaoに基づくMybatis CRUD操作
CRUDオペレーション
1 マッパーのパスはtoパスと同じであることが望ましい。
2 自動コミットをfalseに設定 JDBC接続のロールバック
sqlSession.commit();
3 parameterType の整数書き込み
5 ファジー・クエリの設定方法
select * from user where ユーザー名 like '%${値}%'
上記では、元の#{}プレースホルダーは{value}に変更され、他の名前で書くことはできません。
public String handleToken(String content) {
Object parameter = context.getBindings().get("_parameter");
if (parameter == null) {
context.getBindings().put("value", null);
} else if (SimpleTypeRegistry.isSimpleType(parameter.getClass())) {
context.getBindings().put("value", parameter);
}
Object value = OgnlCache.getValue(content, context.getBindings());
return (value == null ? "" : String.valueOf(value)); // issue #274 return "" instead of "null"
}
ソースコードでは、読み込むキーの名前は「value」と指定されているので、パラメータをバインドするときにのみvalueを呼び出すことができます。
6
'%${value}%':
select * from user where username like '%111%'
A: #{aaa}: select * from user where username like ?
#はプレースホルダ記号
はSQL文字列のスプライスを意味します。
単純な値やpojo属性の値は{}で受け取ることができます。 parameterTypeが単一の単純な値を渡す場合、${}括弧は値のみとなります。
7 ユーザーIDの戻り値の追加
<!-- keyProperty 返される値の名前を表す Entity クラス keyColumn データベースのカラム名 Table order 挿入後の振る舞いを表すために AFTER という値を取る resultType 返される値の型を表す-->
<selectKey keyProperty="id" keyColumn="id" order="AFTER" resultType="java.lang.Integer">
SELECT 1712435;
</selectKey>
8 Mybatis と JDBC プログラミングの比較
1.この問題を解決するためにデータベースリンクプールを使用すると、データベースリンクが頻繁に作成および解放されるため、システムリソースの浪費が発生し、システムのパフォーマンスに影響します。
解決策: SqlMapConfig.xml でデータ・リンク・プールを構成し、接続プールを使用してデータベース・リンクを管理します。
2コードによって引き起こされるコードに書かれたSQLステートメントは、維持することは容易ではない、SQLの変更の実際のアプリケーションが大きくなることがあります、SQLの変更は、Javaのコードを変更する必要があります。
解決策:Javaコードとは別にXXXXmapper.xmlファイルにSqlステートメントを設定します。
3.sql文にパラメータを渡すのは、sql文のwhere条件が定かでなく、多かれ少なかれあり、プレースホルダがパラメータに対応する必要があるので面倒です。
4.結果セットの構文解析の問題、SQLの変更は構文解析コードの変更につながり、構文解析の前にトラバースする必要がありますが、データベースのレコードをpojoオブジェクトにカプセル化できれば、構文解析がより便利になります。
解決策:Mybatisは、SQLの実行結果を自動的にjavaオブジェクトにマッピングし、文中のresultTypeで出力結果の型を定義します。
Mybatisにおけるパラメータの深さ
parameterType 入力タイプ
1 シンプルなタイプ
2 pojo オブジェクト
オブジェクト・フィールドの値を、プロパティの名前に#{}または${}を使ったognl式でパースします。
ognl 式 オブジェクト・グラフィック・ナビゲーション言語 オブジェクト・グラフィック・ナビゲーション言語
オブジェクトのfetchメソッドでデータを取得します。getは省略します。
例えば
クラスへの書き込み: user.getUserName() OGNL: user.username
なぜuserを使わずにmybatisで直接usernameを書けるのですか?
属性が属するクラスは parameterType で指定されています。
3 pojoラップオブジェクト
resultType結果型のカプセル化
1 シンプルなタイプ
2 pojo オブジェクト
3ポジョリスト
mysql は Windows では大文字と小文字を区別しません!
resultMap タグは、クエリ列名とエンティティ・クラスの属性名が矛盾している場合の対応を確立します。
(1) エイリアスクエリを使用して、SQL テキストを効率的に実行します。
<!-- すべての操作に対してクエリーを設定する -->
<select id="findAll" resultType="com.itheima.domain.User">
select id as userId,username as userName,birthday as userBirthday,
sex as userSex,address as userAddress from user
</select>
2) resultMapの定義 実行効率は遅い 開発効率は速い
<resultMap type="com.itheima.domain.User" id="userMap"> <id column="id" property="userId"/>
<result column="username" property="userName"/>
<result column="sex" property="userSex"/>
<result column="address" property="userAddress"/>
<result column="birthday" property="userBirthday"/>
</resultMap>
idタグ:主キーフィールドを指定するために使用します。
result タグ:プライマリ・キー以外のフィールドを指定するために使用します。
column属性:データベースのカラム名を指定します。
プロパティproperty:エンティティクラスのプロパティ名を指定します。
<select id="findAll" resultMap="userMap">
select * from user
</select>
PreparedStatementオブジェクトの実行メソッド
executeはCRUD文のいずれかを実行します。 結果セットがあるかどうかを示すboolenを返します。あるものは真
executeUpdate は CUD 文のみを実行できます。
executeQueryはSELECT文しか考えられませんが、ResultSetオブジェクトの返り値を追加、削除、変更することはできません。
設定内容
1 プロパティの設定
<!-- プロパティを設定する
タグの内部でデータベースへの接続に関する情報を設定することもできるし、プロパティを通じて外部の設定ファイルを参照することもできる。
urlはURLとして記述する必要があり、クラスパスに存在する必要がある。
url リソースの場所を一意に特定する URL として記述する必要がある。
write: プロトコル ホスト ポート URI
http://:/is
URI: Uniform Resource Identifier (統一資源識別子) アプリケーションがリソースの位置を一意に特定できる。
-->
<properties resource="jdbcConfig.properties">
<!-- <properties url="file:///C://XXX">-->
<!-- <property name="driver" value="com.mysql.cj.jdbc.Driver"/>-->
<!-- <property name="url" value="jdbc:mysql://localhost:3306/htoa?serverTimezone=GMT"/>-->
<!-- <property name="username" value="root"/>-->
<!-- <property name="password" value="htoa"/>-->
</properties>
<dataSource type="POOLED">
<!-- データベースに接続するための基本情報を設定する -->
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
2 typeAliasesの設定
<!-- typeAliasesによるエイリアスの設定 ドメイン内のクラス名のみが設定可能である。-->
<typeAliases>
<!-- typeAlias エイリアスの構成 タイプ エンティティ・クラスの完全修飾クラス名を指定する エイリアス 指定したエイリアスが大文字と小文字を区別しない場合は、エイリアスを指定する。-->
<!-- <typeAlias type="com.mybatis.domain.User" alias="user"></typeAlias>-->
<!-- エイリアスを設定するパッケージの実行に使用する。 指定すると、パッケージ配下のすべてのエンティティ・クラスに対してエイリアスが登録される。-->
<package name="com.mybatis.domain"/>
</typeAliases>
3 パッケージ
<!-- マッピング・プロファイルの場所を指定する。 -->
<mappers>
<!-- <mapper resource="com/mybatis/dao/User.xml"></mapper>-->
<!-- 完了を指定する場合、マッパーやクラスは必要ない。-->
<package name="com.mybatis.dao"></package>
</mappers>