在 mybatis 中,${} 和 #{} 的区别是什么?(必会)

{}是占位符,预编译处理,${}是字符串替换
mybaits处理#{}时,会将sql中的#{}处理成?, 调用PreparedStatement的set方法复制
mybatis处理${}时,就是把${}替换成变量的值

MyBatis 编程步骤是什么样的?

  1. 创建SqlSessionFactory对象
  2. 通过SqlSessionFactory对象创建SqlSession
  3. 通过SqlSession执行数据库操作
  4. 调用SqlSession.commit()提交事务
  5. 调用SqlSession.close()关闭会话

    在 Mybatis 中,resultType 和 ResultMap 的区别是什么?(必会)

    如果数据库的字段名和封装的实体属性名完全一致可以使用resultType
    如果不一致,就要使用resultMap手动建立关系映射,resultMap 要配置一下表和类的一一对应关 系,所以说就算你的字段名和你的实体类的属性名不一样也没关系,都会给你映射出来

    Mybatis中的动态标签(必会)

  6. if用来判断传入的值是否符合条件条件

  7. where用来做动态拼接,和if配合使用可以不用写where 1=1这种

    1. <select id="findByCondition" parameterType="student" resultType="student">
    2. select * from student
    3. <where>
    4. <if test="id!=0">
    5. and id=#{id}
    6. </if>
    7. <if test="username!=null">
    8. and username=#{username}
    9. </if>
    10. </where>
    11. </select>
  8. 可以把传入的集合对象进行遍历,然后每项内容作为参数传入到sql中

    1. 属性collection:参数容器类型, (list-集合, array-数组)。
    2. open:开始的 SQL 语句。
    3. close:结束的 SQL 语句。
    4. item:参数变量名。
    5. separator:分隔符。
      1. <select id="findByIds" parameterType="list" resultType="student">
      2. select * from student
      3. <where>
      4. <foreach collection="array" open="id in(" close=")" item="id" separator=",">
      5. #{id}
      6. </foreach>
      7. </where>
      8. </select>
  9. 可以把大量的重复代码整理起来,当使用的时候直接 include 即可,减少重复代码的编写;

    1. <!--抽取sql片段简化编写-->
    2. <sql id="selectStudent" select * from student</sql>
    3. <select id="findById" parameterType="int" resultType="student">
    4. <include refid="selectStudent"></include> where id=#{id}
    5. </select>
    6. <select id="findByIds" parameterType="list" resultType="student">
    7. <include refid="selectStudent"></include>
    8. <where>
    9. <foreach collection="array" open="id in(" close=")" item="id" separator=",">
    10. #{id}
    11. </foreach>
    12. </where>
    13. </select>
  10. 适用于更新,当某些条件适合时执行更新操作

  11. sql片段抽取