mapper映射文件9大元素
映射文件是以<mapper>作为根节点,在根节点中支持9个元素,分别为
insert、update、delete、select(增删改查);
cache、cache-ref、resultMap、parameterMap、sql。
例子:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace必须和所描述接口的全类名保持一致 -->
<mapper namespace="com.imooc.dao.MessageDao">
<!--
数据库的字段和java类的属性对应:
1,type就是类的全名
2,id是配置主键的 result是普通键的 ,column是数据库字段名字 ,property是类属性
-->
<!--
<resultMap type=" pojo.Message" id="MessageResult">
<id column="ID" jdbcType="INTEGER" property="id"/>
<result column="COMMAND" jdbcType="VARCHAR" property="command"/>
<result column="DESCRIPTION" jdbcType="VARCHAR" property="description"/>
<result column="CONTENT" jdbcType="VARCHAR" property="content"/>
</resultMap>
-->
<!--
1,select的id必须和当前接口里面的方法名字保持一致
2,resultMap必须和返回结果的全类名保持一致
-->
<select id="selectMessage" resultMap=" com.imooc.pojo.Message">
select ID,COMMAND,DESCRIPTION,CONTENT from MESSAGE WHERE ID=#{id}
</select>
</mapper>
一,resultMap 自定义结果集映射
$返回结果要么用resultType,要么用自定义的resultMap,二选一
resultMap中:
- type就是类的全名,一般是一个封装好的pojo,id就是引用这个结果集的标记
- id是配置主键的, result是普通键的
- column是数据库字段名字 ,property是类属性
<!--
数据库的字段和java类的属性对应:
1,type就是类的全名
2,id是配置主键的 result是普通键的 ,column是数据库字段名字 ,property是类属性
-->
<resultMap type=" pojo.Message" id="MessageResult">
<id column="ID" jdbcType="INTEGER" property="id"/>
<result column="COMMAND" jdbcType="VARCHAR" property="command"/>
<result column="DESCRIPTION" jdbcType="VARCHAR" property="description"/>
<result column="CONTENT" jdbcType="VARCHAR" property="content"/>
</resultMap>
<!--
1,select的id必须和当前接口里面的方法名字保持一致
2,resultMap必须和返回结果的全类名保持一致
-->
<select id="selectMessage" resultMap="MessageResult">
select ID,COMMAND,DESCRIPTION,CONTENT from MESSAGE WHERE ID=#{id}
</select>
</mapper>
resultMap的关联查询-------association
例如:有一个员工,他有个属性叫部门,部门会关联一个部门表,我们希望查询员工信息的时候,把他部门相应的信息也带出来
1,级联属性
2,association -----关联对象
可以指定关联的对象(部门),然后下面的property就直接写部门里面的属性
3,association -----分步查询
select标签可以引用其他mapper映射文件的sql查询语句。
4, association 之延迟加载,在上一个的基础上,有时候我们不需要关联出部门的信息,全部关联的话就会给数据库造成负担,如果要按需加载查询的话,需要在mybatis的全局配置文件里面加这两个setting(懒加载和按需加载)就可以了。
* resultMap------collection嵌套结果集
1,运用场景,查询部门,部门下有很多员工,是一个集合list,需要把所有员工信息关联查询出来就可以写collection
注:得到员工的list结果集之后,然后再调用department类之中get方法getEmps(),将结果输出。
结果:
2,collection-------分步查询
接口:
sql:
sql1,按照部门id先查询出部门信息
sql2,按照部门id查出员工信息list(一个部门很多员工)
resultMap:select属性为sql2的id,column为传过来的查询参数(部门id)
注意:当遇到多个参数需要传递时,可以封装为Map,fetchType可以直接设置延迟加载
resultMap-----dicriminator鉴别器
可以根据查询得到的结果,判断之后,执行不同的封装规则,case就是一个判断的条件,如果结果等于case的值,就执行下面的结果封装。
二,动态sql
if , foreach ,trim , choose四个标签
1,if的用法
OGNL表达式:
判断和拼接:根据传过来的条件查询员工信息
如果满足test条件,就在sql上拼接上下面的语句
select * from tbl_employee where id=? and last_name like ? and email= ? and gender=?
注:如果第一个判断没有成功就会出现语法错误-------“后面开头以and开始”
解决办法1:在前面的sql写成 where 1=1
解决方法2:把所有的if判断都放在一个<where></where>标签中(并去掉sql的where,标签会自动加上),但是:只能解决and拼在前面,要用trim标签
2,trim标签
例子 :trim标签用法
https://blog.csdn.net/wt_better/article/details/80992014
3,choose标签的使用
具体文章:choose具体用法
4,set标签的使用-----由于更新,update
-
MyBatis在生成update语句时若使用if标签,如果前面的if没有执行,则可能导致有多余逗号的错误。
- 使用set标签可以将动态的配置SET 关键字,和剔除追加到条件末尾的任何不相关的逗号。
没有使用if标签时,如果有一个参数为null,都会导致错误,如下示例:
注意:set语句之后一定别忘记加逗号
5,foreach循环标签
传过来的是一个list集合
例子,细节参考文章:foreach使用
https://blog.csdn.net/qq_34107571/article/details/77834548
三,mybatis的两个内置参数
- _parameter
- _databaseId
注:这两个参数是不需要我们定义也可以直接拿来使用的。
parameter:代表整个参数,如果传入的是单个参数或对象,那么_parameter就可以代表这个参数或对象,如果传入的是多
个参数,那么_parameter代表的就是一个map(MyBatis会默认将参数封装为map)
_datebaseId:代表我们当前使用的数据库别名,前提是我们在全局配置文件里面配置了databaseIDProvider标签
databaseIDProvider标签用于配置多个数据库
具体用法见文章:mybatis内置参数详解
https://blog.csdn.net/postersxu/article/details/79058626
四,sql标签----抽取可重用的sql片段
<sql> 和 <include>
<sql>封装SQL语句简写select 和 insert语句, <include>根据id在查询和新增语句中调用<sql>标签中的语句
<sql>标签中的id 唯一对应<include>标签中的refid