MyBatis配置文件之— Mapper映射配置文件中的各标签以及作用
Mapper映射配置文件:主要是配置sql语句 需要在核心配置文件中 通过Mapper标签引入
<?xml version="1.0" encoding="UTF-8" ?> xml文件的固定写法 必须要在第一行
MyBatis的DTD约束:固定写法 记住即可
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
Mapper映射配置文件中的各标签以及作用
1.<mapper根标签 namespace属性>
a.mapper映射根标签 mapper标签在映射配置文件中 有且仅有一个
a1.namespace属性:名称空间 分两种情况:
① 正常情况【通过 数据访问层 接口实现类 实现功能】
namespace的值 一般定义成配置文件的文件名
功能仅仅是在核心配置文件中引入时作为映射文件的唯一标识
② 企业常用情况【接口代理方式实现功能】
namespace的值 定义成 数据访问层的接口的路径(从src开始)
功能有两个:第一个是在核心配置文件中引入时作为映射文件的唯一标识,第二个是使核心配置文件可以找到 数据访问层 的接口
2.<sql标签 id属性>
重复使用的sql语句 例:select * from student
</sql>
a.sql标签
作用:当sql中有重复的sql语句组成部分 可以将这些sql语句中的重复部分进行抽取 放到sql标签中 类似于方法中的代码的共性抽取
注意事项:sql标签与对应的sql语句标签的顺序是随意的【但一般是放在所有的sql语句的最前面 可以增加代码的可读性】
b.id属性
作用:由于可能会有多条sql标签包裹的sql语句,所以 id属性是 sql标签的唯一标识
注意事项: id属性 在同一个映射文件中 必须是唯一的
3.select标签
3.1<select标签 id属性 resultType属性 parameterType属性>
<include标签 refid属性/> sql语句的其余部分 例:<include标签 refid属性/> where uname=#{uname}
</select>
3.2<select标签 id属性 resultType属性 parameterType属性>
完整sql语句 例:select * from student where sid = #{sid} and uname=#{uname}
</select>
3.3<select标签 id属性 resultType属性 >
完整sql语句 例: select * from student where sid= #{sid}
</select>
a.select标签:执行选择功能的sql语句标签
作用:配置sql语句中的查询功能的sql语句
注意事项:只能执行查询sql 不能执行增删改sql语句
a1.id属性:
作用:多条select标签的sql语句的唯一标识
注意事项:唯一标识 所以在同一个映射文件中 必须是唯一的
a2.resultType属性:
作用:查询方法的返回值类型的配置
注意事项:
① 查询sql 一定会有一条或者多条数据返回 所以resultType属性一定会有
② 值 代表的一般是依据该数据表创建的javaBean类 分两种情况:
如果在核心配置文件中有<typeAliases>起别名标签 需要配合该标签的值来决定 resultType的值是什么
如果没有<typeAliases>标签 :值为对应javaBean的路径(从src出发)
返回值是list集合 而配置javaBean :框架底层做了转换
a3.parameterType属性:
作用:查询方法的参数类型的配置
注意事项:
① 查询sql对应的方法的参数列表分两种情况:
①①:没有参数:
情况:没有选择条件 即 查询所有 例:select * from student
注意事项:不需要parameterType属性
①②:有参数:又分三种情况:
第一种:
例:
* sql语句:select * from student where sid=#{sid}
* 对应的方法:public Student selectById(Integer sid){方法体}
情况:参数设置的是基本数据类型的包装类 可以将值写成基本数据类型:框架底层自动匹配
第二种:
例:
* sql语句:select * from student where sid=#{sid}
* 对应的方法:public Student selectById (Student student){方法体}
情况:参数设置的对应的javaBean类的实例对象 parameterType属性的值 需要看核心配置文件中是否有<typeAliases>起别名标签
如果有起别名标签:需要配合该标签的值来决定paramaterType的值是什么
如果没有<typeAliases>标签 :值为对应javaBean的路径(从src出发)
第三种:请参照foreach标签中的情况
b.include标签:将相应的sql标签中的共性sql语句引入该select标签中 组合成完整的sql语句
b1.refid属性:
作用:与sql标签中的id属性对应 用来找到响应的sql标签中的共性sql语句
注意事项:必须要有 且取值一定是与该映射文件中的某个sql标签的id属性对应
4.<update标签 id属性 parameter属性>sql语句<update>
5.<insert标签 id属性 parameter属性>sql语句<insert>
6.<delete标签 id属性 parameter属性>sql语句<delete>
(4/5/6)修改、添加、删除的sql语句配置 标签 属性 参照select标签 完全一样
注意事项:
1.增删改 标签的 resultType属性的值 一定都是int 而int类型不需要配置 所以 这三个标签是没有resultType属性的
</mapper>
特殊sql语句的整理【if标签和foreach标签】
特殊sql语句整理:
1.可选择参数的实现:
实现需求:重载方法的共性抽取(可变参数)【即 配置可以根据参数传递的是什么而自动匹配相应的sql语句】
组成标签及写法:
<select标签 id标签 resultType属性 parameterType属性>
<include标签 refid属性/>
<where标签>
<if标签 test属性="sid != null">
执行sql语句:sid = #{sid}
</if>
<if标签 test属性="name != null">
执行sql语句:AND uname = #{uname}
</if>
<if标签 test属性="age != null">
执行sql语句:AND age = #{age}
</if>
</where>
</select>
a.<select标签 id标签 resultType属性 parameterType属性>、<include标签 refid属性/> 请遵循上面解释
b.<where标签>
作用:用来包裹<if标签> 相当于sql语句中的where关键字
注意事项:注意在结构中的位置 相当于sql语句中 where的位置
c.<if标签>
作用:相当于java中的if...else... 是用来做选择判断的
注意事项:
* 1.多个条件之间是并行关系 如果写在上面的if语句 包含写在下面的if语句的判断条件 可能会导致下面的if语句中的sql失效,无法执行
* 2.test属性必须要有 如果没有 相当于这个条件一直是true 那就失去意义了
* 3.除了第一个<if>标签之外 后面的每一个<if>标签包裹的sql语句的前面都需要 + and关键字
c1:test属性:
作用:相当于java中if判断的条件
注意事项:条件的设立等等【可以想一下java中 if条件的注意事项 基本类似】
*
2.sql语句中 in 关键字的实现:
实现需求:同字段多个值的sql语句 即:in关键字的作用的实现
组成标签及写法:
<select标签 id属性 resultType属性 patameterType属性=“list”>
<include标签 refid属性/>
<where标签>
<foreach标签 collection属性 open属性 close属性 item属性 separator属性>
#{随意的一个变量名:看下面的解释}
</foreach>
</where>
</select>
a.<select标签 id标签 resultType属性 parameterType属性>、<include标签 refid属性/> 请遵循上面解释
需要提及一点:foreach标签存在的sql语句 其对应的方法的参数的类型一定是list!!!!!!!!!
原因是:同字段多个值的并集查询 正常情况下 只能用list集合作为容器【数组由于需要考虑的过多,这里不适用】
b.<where标签>请遵循上面解释
c.<foreach标签>
作用:相当于java中的for循环 用来循环遍历 参数list数组中的每一个值
注意事项:由于属性过多 需要注意每个属性的值 极容易出错 【要检查拼接之后是否是一个正确的sql语句】
c1.collection属性(String类型的值):
作用:表示的参数的容器类型【一般包含两种类型 list集合,array数组 但是由于 数组 实现起来比较麻烦 所以一般使用的是集合】
c2.open属性(String类型的值):
作用:where关键词后连接的sql语句部分
c3.close属性(String类型的值):
作用:结束的sql语句部分 即:是list循环遍历之后连接的sql语句部分
c4.item属性(String类型的值):
作用:参数变量名 即:list集合中对应的数据表中的字段名(列名)
c5.separator属性(String类型的值):
作用:分隔符 即:代表的是 in()括号中不同的值之前的分隔符 在Mysql中 固定是 ,
整体串联起来:
<include标签代表的sql语句> + <where标签代表的where关键字> + <foreach标签 open属性的值> + <foreach标签 【遍历list集合获得的值 并且每一个值之间用 separator的值做分割】 + <foreach标签 close属性的值>