MyBatisテクノロジー概要テンプレート

50435 ワード

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作成コードの例:
    //1.      
    InputStream in = Resources.getResourceAsStream("mybatis-config.xml");//            ( src  );
    SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(in);
    Sqlsession:             SqlSession   。SqlSession           ,         ,                   。
    SqlSession      :
    SqlSession session=factory.openSession();
    

  • MyBatis構成
  • 設定(settings)
  • 主な役割:ログファイルとMyBatisフレームワークの実行規則構成を開く
    設定(settings)コードの例:
    <setting name="logImpl" value="LOG4J"/>value          ,name    (    ),   value   "STDOUT_LOGGING",  log4j       properties  
    
  • タイプ別名(typeAliases)
  • 主な役割:タイプ別名はJavaタイプに短い名前を設定します.XML構成にのみ関係し、クラスの完全な限定名の冗長性を減らすために使用される意味があります.
    タイプ別名(typeAliases)コードの例:
    
    <typeAliases>
      <typeAlias type="com.apesource.entity.Employee" alias="Employee"/>
    typeAliases>
    
    <typeAliases>
    		
    		<package name="com.apesource.entity"/>
    typeAliases>
    
  • 環境構成(environments)
  • 主な役割:MyBatisは、SQLマッピングを複数のデータベースに適用するのに役立つ複数の環境に適応するように構成できます.たとえば、テスト環境、本番環境(実際の使用環境)、1つのenvironmentsの下に複数のenvironmentがあります.
    環境構成(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>
    
  • マッパー
  • 主要な役割:エンティティクラスをデータベースのテーブルにマッピングし、各エンティティクラスはxxxMapper.xmlマッピングファイル(SQL文を書く)に対応する.
    マッパー(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>
        ```
    

  • MyBatis XMLマッパー1.共通ノード作用まとめ
  • select:クエリ用SQL文表記
  • <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:更新用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>
    
  • delete:削除用SQL文書込
  • <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:データを挿入するための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>
    
    2.常用属性作用総括
  • idプロパティ:インタフェース(xxxMapper.java)のメソッドの名前を書く
  • resultTypeプロパティ:結果を返すタイプ
  • parameterType属性:入力パラメータのタイプ
  • useGeneratedKeysプロパティ:プライマリ・キーが
  • に再入力されるかどうかを設定します.
  • keyPropertyプロパティ返されるプライマリ・キーを受信するためのプロパティ(一般的にはエンティティ・クラスのidプロパティ)
  • .
    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);