1 MyBatis
1.1 简介
持久层框架,用于简化JDBC开发
JavaEE三层架构:表现层、业务层、持久层
表现层:做页面展示
业务层:做逻辑处理
持久层:负责将数据保存到数据库的那一层代码
框架:半成品软件,一套可重用的、通用的、软件基础代码模型
1.2 快速入门
2 解决SQL语句警告提示
3 Mapper代理开发
4 Mybatis 核心配置文件
5 配置文件完成增删改查
5.1 查询
5.1.1 查询所有结果
MyBatis完成操作需要三步:编写接口方法->编写SQL->执行方法
【注】数据库表的字段名称和实体类的属性名称不一样,则不能自动封装数据
解决一:起别名:对不一样的列名起别名,让别名和实体类的属性名一样
缺点:每次查询都要定义一次别名
5.1.2 查看详情
说明 :
1、参数占位符:
#{}:会将其替换为 ? ,为了防止SQL注入
${}: 进行sql拼接,会存在SQL注入问题
2、参数占位符使用时机:
- 参数传递时:#{}
- 对表名和列名进行动态设置时:${} // 比较少
【注】SQL注入问题可以理解为SQL语句不合法
<select id = "selectById" resultMap = "brandResultMap">
select *
from ${tbName} where id = #{id}
3、parameterType:用于设置参数类型,该参数可以省略
4、SQL语句中特殊字符处理:
① 转义字符,如:< :<
② <![CDATA[内容]]>
5.1.3 条件查询
【分析】
1、条件表达式
2、如何连接各个条件表达式
5.1.4 动态条件查询
要求:输入所有条件中的其中一个条件也能够实现查询
【注】SQL语句随着用户的输入或外部条件的变化而变化,我们称为动态SQL
多条件动态查询:
if:
<select id="findActiveBlogLike"
resultType="Blog">
SELECT * FROM BLOG WHERE state = ‘ACTIVE’
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null and author.name != null">
AND author_name like #{author.name}
</if>
</select>
语法结构:
<if test = “逻辑表达式”>
条件表达式 // if 用于判断参数是否有值,使用 test 属性进行条件判断
问题:第一个条件不需要逻辑运算符
解决①:where后面加一个恒等式 使得后面的执行语句格式统一,都有and解决②:<where> 替代 where 关键字
单条件动态查询
choose(when、otherwise)
从多个条件中选择一个使用,针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句
choose -------------> switch
when ---------------> case
otherwise ---------> default
<select id="findActiveBlogLike"
resultType="Blog">
SELECT * FROM BLOG WHERE state = ‘ACTIVE’
<choose>
<when test="title != null">
AND title like #{title}
</when>
<when test="author != null and author.name != null">
AND author_name like #{author.name}
</when>
<otherwise>
AND featured = 1
</otherwise>
</choose>
</select>
foreach
对集合进行遍历(尤其是在构建 IN 条件语句的时候)
<select id="selectPostIn" resultType="domain.blog.Post">
SELECT *
FROM POST P
<where>
<foreach item="item" index="index" collection="list"
open="ID in (" separator="," close=")" nullable="true">
#{item}
</foreach>
</where>
</select>
【注】可以将任何可迭代对象(如 List、Set 等)、Map 对象或者数组对象作为集合参数传递给 foreach。当使用可迭代对象或者数组时,index 是当前迭代的序号,item 的值是本次迭代获取到的元素;当使用 Map 对象(或者 Map.Entry 对象的集合)时,index 是键,item 是值 。
5.2 添加
【存在问题】无法获取到 id ,原因是这个 id 值没有绑定到对象上
【解决方法】
<insert id = "addOrder" useGeneratedKeys = "true" keyProperty = "id">
5.3 修改
5.3.1 修改全部字段
5.3.2 修改动态字段
【注】如上图左下角代码,当修改部分字段如新密码时,只有用户id和密码会进行输入,这个时候执行SQL语句,其他值就会被设置为Null,所以需要进行动态修改字段,即上图右,主要是利用<set></set> 和 <if></if>标签来完成的动态修改
5.4 删除
5.4.1 删除一个
5.4.2 批量删除
将选中的 id 封装到 id 数组,然后遍历数组,根据 id 进行删除
这里的?占位符个数是随着传入数组的变化而变化的,所以需要动态SQL语言编写,mybatis提供了<foreach>标签完成遍历。
【注】mybatis会将数组参数封装为一个Map集合。默认key的名称叫 array ,value 值=数组。可以使用 @Param 注解改变 map 集合的默认 key 的名称。
6 参数传递
6.1 多个参数
mybatis会将传入的多个参数封装为Map集合
可以使用 @Param 注解,替换 Map 集合中默认的 arg 键名
@Param("**")注解中的参数应当和SQL语句中的参数占位符的名称保持一致
6.2 单个参数
【注】建议将来都使用 @Param 注解来修改 Map 集合中的默认的键名,并使用修改后的名称来获取值,这样可读性更高!