美文网首页
MyBatis技术总结

MyBatis技术总结

作者: 头发旺盛的程序猿 | 来源:发表于2020-08-29 13:06 被阅读0次
    • 什么是MyBatis?

      MyBatis是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。

      MyBatis通过xml或注解的方式将要执行的各种statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句,最后由MyBatis框架执行sql并将结果映射为java对象并返回。

    • MyBatis中的主要组成部分

      SqlSessionFactory:SqlSessionFactory是MyBatis中的一个重要的对象,它是用来创建SqlSession对象的,而SqlSession用来操作数据库的,SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由对它进行清除或重建。

      SqlSessionFactory创建代码示例:
    ```java
    //1.InputStream in = Resources.getResourceAsStream("xxx.xml");
      SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder();
      SqlSessionFactory sqlSessionFactory = sfb.build(in);
      ```
    

    SqlSession:使用Mybatis的主要java接口就是SqlSession。可以通过这个接口来执行命令,获取映射器和管理事务,从而实现增删改查,每个线程都应该有它自己的 SqlSession 实例,SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。

    SqlSession创建代码示例:
    ```java
    //1.SqlSession sqlSession = sqlSessionFactory.openSession();
    ```
    
    • MyBatis配置

      • 设置(settings)

      主要作用:settings是MyBatis中极为重要的调整设置,会改变Mybatis的运行时行为。

      设置(settings)代码示例:
      <settings>
          <setting name="xxx" value="xxx"/>
      </settings>
      
      • 类型别名(typeAliases)

      主要作用:给很长的包路径起别名,简化使用对象,

      类型别名(typeAliases)代码示例:
      <typeAliases>
            <!--type属性:完整的实体类、包路径;
                alias属性:实体类别名-->
         <typeAlias alias="userinfo" type="xxx.Userinfo"/>
      </typeAliases>
      
      • 环境配置(environments)

      主要作用:在 MyBatis 中,environments 是放有关数据库连接数据的配置信息的,其中可以配置多个数据库的连接环境,方便 sql 语句可以适用于多个数据库环境。

      环境配置(environments)代码示例:
      <!-- 环境列表 -->
      <environments default="development">
        <!-- 环境1(开发) -->
         <environment id="development">
         </environment>
      </environments>
      
      • 映射器(mappers)

      主要作用:添加映射文件,可以通过读取映射文件调用相应的方法。(sql语句都写在映射文件中:增删改查)

      映射器(mappers)代码示例:
      <mappers>
         <!-- SQL映射文件 -->
        <mapper resource="xxx/ProductMapper.xml"/>
      </mappers>
      
    • MyBatis XML 映射器

      1.常用节点作用总结

      • select :映射查询语句
      • update:映射更新语句
      • delete:映射删除语句
      • insert:映射插入语句

      2.常用属性作用总结

      • id 属性:表示命名空间中唯一的标识符,常与明明空间组合起来使用。组合后如果不唯一,MyBatis会抛出异常。
      • resultType 属性:从SQL语句中返回的类型的类的完全限定名或别名。如果是集合类型,那应该是集合可以包含的类型,而不能是集合本身。返回时可以使用 resultType 或 resultMap,但不能同时使用。
      • parameterType 属性:该属性表示传入SQL语句的参数类的完全限定名或别名。这个属性是可选的,因为 MyBatis 可以通过 TypeHandler 推断出具体传入语句的参数,默认值为 unset。
      • useGeneratedKeys属性:在settings元素中设置useGeneratedKeys参数作用是允许JDBC支持自动生成主键,需要驱动兼容;xml映射器中配置的useGeneratedKeys参数只会对xml映射器产生影响,且在settings元素中设置的全局useGeneratedKeys参数值对于xml映射器不产生任何作用;在接口映射器中设置的useGeneratedKeys参数会覆盖在<settings>元素中设置的对应参数值。
      • keyProperty属性

      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:批量增加
    
    > SQL映射配置
        <insert id="insertAnswerRecordBatch"
                parameterType="list"
                useGeneratedKeys="true" keyProperty="recordId">
            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>
    
    接口方法定义
    int insertAnswerRecordBatch(List<AnswerRecord> answerRecordList);
    
    >示例3:普通删除
    
    > SQL映射配置
        <delete id="deleteAnswerRecord">
            delete from answer_record
            where record_id = #{recordId}
        </delete>
        
    >> 接口方法定义
    int deleteAnswerRecord(int recordId);
    
    >示例4:批量删除
    >
    >​  > SQL映射配置
    >
    >   <delete id="deleteAnswerRecordBatch" parameterType="list">
    >       DELETE FROM answer_record
    >       WHERE record_id IN
    >       <foreach collection="list" item="rid" separator="," open="(" close=")">
    >           #{rid}
    >       </foreach>
    >   </delete>
    >   >>```java
    >   >>  >> 接口方法定义
    >   >>  int deleteAnswerRecordBatch(List<Integer> recordIdList);
    >   >>```
    
    >示例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:动态查询
    >
    >​  > SQL映射配置
    >
    >   <select id="listAnswerRecordByCondition" 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 = #{question}
    >           </if>
    >           
    >           <if test="rightAnswer != null">
    >               AND right_answer = #{rightAnswer}
    >           </if>
    >           
    >           <if test="submitAnswer != null">
    >               AND submit_answer = #{submitAnswer}
    >           </if>
    >       </where>
    >   </select>```
    >   >> 接口方法定义
    >List<AnswerRecord> listAnswerRecordByCondition(AnswerRecord condition);
    
    >示例7:查询结果封装为Map
    

    ​ > SQL映射配置```

        <select id="countAnswerRecordDataByRespondent" resultType="Map">
            select count(record_id) as total_question,
                   (select count(record_id) from answer_record where respondent = #{respondent} and right_answer = submit_answer) as right_question,
                   (select count(record_id) from answer_record where respondent = #{respondent} and right_answer != submit_answer) as wrong_question 
                   from answer_record 
            where respondent = #{respondent}
        </select>```
        >> 接口方法定义
        Map<String,Integer> countAnswerRecordDataByRespondent(String respondent);

    相关文章

      网友评论

          本文标题:MyBatis技术总结

          本文链接:https://www.haomeiwen.com/subject/vkbzjktx.html