在 mybatis 中,${} 和 #{} 的区别是什么?(必会)
{}是占位符,预编译处理,${}是字符串替换
mybaits处理#{}时,会将sql中的#{}处理成?, 调用PreparedStatement的set方法复制
mybatis处理${}时,就是把${}替换成变量的值
MyBatis 编程步骤是什么样的?
- 创建SqlSessionFactory对象
- 通过SqlSessionFactory对象创建SqlSession
- 通过SqlSession执行数据库操作
- 调用SqlSession.commit()提交事务
-
在 Mybatis 中,resultType 和 ResultMap 的区别是什么?(必会)
如果数据库的字段名和封装的实体属性名完全一致可以使用resultType
如果不一致,就要使用resultMap手动建立关系映射,resultMap 要配置一下表和类的一一对应关 系,所以说就算你的字段名和你的实体类的属性名不一样也没关系,都会给你映射出来Mybatis中的动态标签(必会)
if用来判断传入的值是否符合条件条件 where用来做动态拼接,和if配合使用可以不用写where 1=1这种 <select id="findByCondition" parameterType="student" resultType="student">
select * from student
<where>
<if test="id!=0">
and id=#{id}
</if>
<if test="username!=null">
and username=#{username}
</if>
</where>
</select>
可以把传入的集合对象进行遍历,然后每项内容作为参数传入到sql中 - 属性collection:参数容器类型, (list-集合, array-数组)。
- open:开始的 SQL 语句。
- close:结束的 SQL 语句。
- item:参数变量名。
- separator:分隔符。
<select id="findByIds" parameterType="list" resultType="student">
select * from student
<where>
<foreach collection="array" open="id in(" close=")" item="id" separator=",">
#{id}
</foreach>
</where>
</select>
可以把大量的重复代码整理起来,当使用的时候直接 include 即可,减少重复代码的编写; <!--抽取sql片段简化编写-->
<sql id="selectStudent" select * from student</sql>
<select id="findById" parameterType="int" resultType="student">
<include refid="selectStudent"></include> where id=#{id}
</select>
<select id="findByIds" parameterType="list" resultType="student">
<include refid="selectStudent"></include>
<where>
<foreach collection="array" open="id in(" close=")" item="id" separator=",">
#{id}
</foreach>
</where>
</select>
适用于更新,当某些条件适合时执行更新操作 sql片段抽取