美文网首页
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