MyBatisテクノロジー概要テンプレート
MyBatisテクノロジー概要テンプレート
JavaEEフレームワーク技術のMybatis作者:LL MyBatisとは?
MyBatisフレームワークはORM(Object/Relational Mapping、すなわちオブジェクト関係マッピング)フレームワークとも呼ばれる.MyBatisはjdbcに基づく持続化フレームワークである.データベース内のテーブルとjava内のエンティティクラスをマッピングファイル(xxxMapper.xml)を介してプロファイル(config.xml)に関連付けます.通常のSQLクエリー、ストレージ・プロシージャ、および高度なマッピングをサポートする優れた永続層フレームワーク.
MyBatisの主要な構成部分
MyBatisは、主にプロファイル(mybatisConfig.xml)、マッピングファイル(xxxMapper.xml)、サードパーティjarパッケージ(コアjarパッケージ)、SqlSessionFactoryBuilder(クラス)、SqlSessionFactory(インタフェース)、SqlSession(インタフェース)、Resources(クラス)から構成される.
SqlSessionの実装クラスはDefaultSqlSession(コンソール印刷で観察可能)SqlSessionFactoryの実装クラスは:DefaultSqlSessionFactory
SqlSessionFactoryは、SqlSessionを作成するために使用されます(セッションの意味:接続+データベース操作+結果セット+クローズ)
SqlSessionFactoryは、作成されるとアプリケーションの実行中に常に存在する必要があります.これを破棄したり、別のインスタンスを再作成したりする理由はありません.SqlSessionFactoryを使用するベストプラクティスは、アプリケーションの実行中に複数回作成しないことです.SqlSessionFactoryを複数回再構築することは、コード「悪い習慣」と見なされます.を選択します.したがって、SqlSessionFactoryの最適な役割ドメインはアプリケーション役割ドメインです.最も簡単な方法は、単一モードまたは静的単一モードを使用することです.
SqlSessionFactoryBuilderインスタンスは、SqlSessionFactoryの作成に伴って破棄されるため、メソッドの役割ドメイン(ローカルメソッド変数)が最適です.
SqlSessionFactory作成コードの例:
MyBatis構成 設定(settings) 主な役割:ログファイルとMyBatisフレームワークの実行規則構成を開く
設定(settings)コードの例:タイプ別名(typeAliases) 主な役割:タイプ別名はJavaタイプに短い名前を設定します.XML構成にのみ関係し、クラスの完全な限定名の冗長性を減らすために使用される意味があります.
タイプ別名(typeAliases)コードの例:環境構成(environments) 主な役割:MyBatisは、SQLマッピングを複数のデータベースに適用するのに役立つ複数の環境に適応するように構成できます.たとえば、テスト環境、本番環境(実際の使用環境)、1つのenvironmentsの下に複数のenvironmentがあります.
環境構成(environments)コードの例:マッパー 主要な役割:エンティティクラスをデータベースのテーブルにマッピングし、各エンティティクラスはxxxMapper.xmlマッピングファイル(SQL文を書く)に対応する.
マッパー(mappers)コードの例:
MyBatis XMLマッパー1.共通ノード作用まとめ select:クエリ用SQL文表記 update:更新用SQL文の書き込み delete:削除用SQL文書込 insert:データを挿入するためのsql文書写 idプロパティ:インタフェース(xxxMapper.java)のメソッドの名前を書く resultTypeプロパティ:結果を返すタイプ parameterType属性:入力パラメータのタイプ useGeneratedKeysプロパティ:プライマリ・キーが に再入力されるかどうかを設定します. keyPropertyプロパティ返されるプライマリ・キーを受信するためのプロパティ(一般的にはエンティティ・クラスのidプロパティ) .
3.一般的なSQLマッピングの例
例1:通常増加
例2:一括追加
例3:通常削除
例4:一括削除
例5:動的変更
例6:動的クエリー
例7:クエリ結果をMapにカプセル化
JavaEEフレームワーク技術のMybatis作者:LL
MyBatisフレームワークはORM(Object/Relational Mapping、すなわちオブジェクト関係マッピング)フレームワークとも呼ばれる.MyBatisはjdbcに基づく持続化フレームワークである.データベース内のテーブルとjava内のエンティティクラスをマッピングファイル(xxxMapper.xml)を介してプロファイル(config.xml)に関連付けます.通常のSQLクエリー、ストレージ・プロシージャ、および高度なマッピングをサポートする優れた永続層フレームワーク.
MyBatisは、主にプロファイル(mybatisConfig.xml)、マッピングファイル(xxxMapper.xml)、サードパーティjarパッケージ(コアjarパッケージ)、SqlSessionFactoryBuilder(クラス)、SqlSessionFactory(インタフェース)、SqlSession(インタフェース)、Resources(クラス)から構成される.
SqlSessionの実装クラスはDefaultSqlSession(コンソール印刷で観察可能)SqlSessionFactoryの実装クラスは:DefaultSqlSessionFactory
SqlSessionFactoryは、SqlSessionを作成するために使用されます(セッションの意味:接続+データベース操作+結果セット+クローズ)
SqlSessionFactoryは、作成されるとアプリケーションの実行中に常に存在する必要があります.これを破棄したり、別のインスタンスを再作成したりする理由はありません.SqlSessionFactoryを使用するベストプラクティスは、アプリケーションの実行中に複数回作成しないことです.SqlSessionFactoryを複数回再構築することは、コード「悪い習慣」と見なされます.を選択します.したがって、SqlSessionFactoryの最適な役割ドメインはアプリケーション役割ドメインです.最も簡単な方法は、単一モードまたは静的単一モードを使用することです.
SqlSessionFactoryBuilderインスタンスは、SqlSessionFactoryの作成に伴って破棄されるため、メソッドの役割ドメイン(ローカルメソッド変数)が最適です.
SqlSessionFactory作成コードの例:
//1.
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");// ( src );
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(in);
Sqlsession: SqlSession 。SqlSession , , 。
SqlSession :
SqlSession session=factory.openSession();
設定(settings)コードの例:
<setting name="logImpl" value="LOG4J"/>value ,name ( ), value "STDOUT_LOGGING", log4j properties
タイプ別名(typeAliases)コードの例:
<typeAliases>
<typeAlias type="com.apesource.entity.Employee" alias="Employee"/>
typeAliases>
<typeAliases>
<package name="com.apesource.entity"/>
typeAliases>
環境構成(environments)コードの例:
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc_driver}"/>
<property name="url" value="${jdbc_url}"/>
<property name="username" value="${jdbc_user}"/>
<property name="password" value="${jdbc_password}"/>
dataSource>
environment>
environments>
マッパー(mappers)コードの例:
<mapper namespace="com.apesource.dao.mapper.AnswerRecordMapper">
<insert id="insertAnswerRecord" parameterType="AnswerRecord" useGeneratedKeys="true" keyProperty="recordId">
insert into answer_record (respondent,question,right_answer,submit_answer,submit_datetime)
values(#{respondent},#{question},#{rightAnswer},#{submitAnswer},now())
insert>
<delete id="deleteAnswerRecord" parameterType="int">
delete from answer_record where
record_id=#{recordId}
delete>
<update id="updateAnswerRecord" parameterType="AnswerRecord">
update answer_record
<set>
<if test="respondent!=null">respondent=#{respondent},if>
<if test="question!=null">question=#{question},if>
<if test="rightAnswer!=null">right_answer=#{rightAnswer},if>
<if test="submitAnswer!=null">submit_answer=#{submitAnswer},if>
submit_datetime=now()
set>
where record_id=#{recordId}
update>
<select id="listAnswerRecordByRespondent" resultType="AnswerRecord">
select record_id as recordId,
respondent as respondent ,
question as question,
right_answer as rightAnswer,
submit_answer as submitAnswer,
submit_datetime as submitDatetime
from answer_record
where respondent=#{respondent}
select>
<select id="countAnswerRecordDataByRespondent" parameterType="AnswerRecord" resultType="map">
SELECT COUNT(record_id) AS totalAnswer,
(SELECT COUNT(record_id) FROM answer_record
WHERE right_answer=submit_answer AND respondent=' ')
AS rightAnswer,
(SELECT COUNT(record_id) FROM answer_record
WHERE right_answer!=submit_answer AND respondent=' ')
AS wrongAnswer
FROM answer_record
WHERE respondent=' '
select>
<insert id="insertBatchData" parameterType="list">
INSERT INTO answer_record(respondent,question,right_answer,submit_answer,submit_datetime)VALUES
<foreach collection="list" item="record" separator=",">
(
#{record.respondent},
#{record.question},
#{record.rightAnswer},
#{record.submitAnswer},
NOW()
)
foreach>
insert>
<delete id="deleteBatchData" parameterType="list">
DELETE FROM answer_record WHERE
record_id IN
<foreach collection="list" item="rid" open="(" close=")" separator=",">
#{rid}
foreach>
delete>
mapper>
```
<select id="listAnswerRecordByRespondent" resultType="AnswerRecord">
select record_id as recordId,
respondent as respondent ,
question as question,
right_answer as rightAnswer,
submit_answer as submitAnswer,
submit_datetime as submitDatetime
from answer_record
where respondent=#{respondent}
select>
<update id="updateAnswerRecord" parameterType="AnswerRecord">
update answer_record
<set>
<if test="respondent!=null">respondent=#{respondent},if>
<if test="question!=null">question=#{question},if>
<if test="rightAnswer!=null">right_answer=#{rightAnswer}if>
<if test="submitAnswer!=null">submit_answer=#{submitAnswer}if>
submit_datetime=now()
set>
where record_id=#{recordId}
update>
<delete id="deleteBatchData" parameterType="list">
DELETE FROM answer_record WHERE
record_id IN
<foreach collection="list" item="rid" open="(" close=")" separator=",">
#{rid}
foreach>
delete>
<insert id="insertAnswerRecord" parameterType="AnswerRecord" useGeneratedKeys="true" keyProperty="recordId">
insert into answer_record (respondent,question,right_answer,submit_answer,submit_datetime)
values(#{respondent},#{question},#{rightAnswer},#{submitAnswer},now())
insert>
2.常用属性作用総括3.一般的なSQLマッピングの例
例1:通常増加
SQL
<insert id="insertAnswerRecord" parameterType="AnswerRecord" useGeneratedKeys="true" keyProperty="recordId">
insert into answer_record (respondent,question,right_answer,submit_answer,submit_datetime)
values(#{respondent},#{question},#{rightAnswer},#{submitAnswer},now())
insert>
int insertAnswerRecord(AnswerRecord answerRecord);
例2:一括追加
<insert id="insertBatchData" parameterType="list">
INSERT INTO answer_record(respondent,question,right_answer,submit_answer,submit_datetime)VALUES
<foreach collection="list" item="record" separator=",">
(
#{record.respondent},
#{record.question},
#{record.rightAnswer},
#{record.submitAnswer},
NOW()
)
foreach>
insert>SQL
int insertBatchData(List<AnswerRecord>listBat);
例3:通常削除
SQL
<delete id="deleteAnswerRecord" parameterType="list">
DELETE FROM answer_record WHERE record_id = #{recordId}
foreach>
delete>
int deleteAnswerRecord(int recordId);
例4:一括削除
<delete id="deleteBatchData" parameterType="list">
DELETE FROM answer_record WHERErecord_id IN
<foreach collection="list" item="rid" open="(" close=")" separator=","> #{rid}
foreach>
delete>
int deleteBatchData(List<Integer>listBatId);
例5:動的変更
SQL
<update id="updateAnswerRecord" parameterType="AnswerRecord">
update answer_record
<set>
<if test="respondent!=null">respondent=#{respondent},if>
<if test="question!=null">question=#{question},if>
<if test="rightAnswer!=null">right_answer=#{rightAnswer},if>
<if test="submitAnswer!=null">submit_answer=#{submitAnswer},if>
submit_datetime=now()
set>
where record_id=#{recordId}
update>
int updateAnswerRecord(AnswerRecord answerRecord);
例6:動的クエリー
<select id="queryAllByCondition" resultType="AnswerRecord" parameterType="AnswerRecord">
SELECT record_id AS recordId,
respondent,
question,
right_answer AS rightAnswer,
submit_answer AS submitAnswer,
submit_datetime AS submitDatetime
FROM answer_record
<where>
<if test="respondent != null">AND respondent = #{respondent}if>
<if test="question != null">AND question LIKE concat('%',#{question},'%')if> <if test="rightAnswer != null">AND right_answer = #{rightAnswer}if>
<if test="submitAnswer != null">AND submit_answer = #{submitAnswer}if>
where>
select>
List<AnswerRecord> queryAllByCondition(AnswerRecord condition);
例7:クエリ結果をMapにカプセル化
SQL
<select id="countAnswerRecordDataByRespondent" resultType="map">
SELECT count(record_id) as total,
(SELECT count(record_id) FROM answer_record WHERE respondent = #{name} AND right_answer = submit_answer ) as right_count,
(SELECT count(record_id) FROM answer_record WHERE respondent = #{name} AND right_answer != submit_answer ) as fail_count
FROM answer_record
WHERE respondent = #{name}
select>
Map<String,Integer> countAnswerRecordDataByRespondent(String respondent);