一 介绍
映射文件指导着MyBatis如何进行数据库增删改查,有着非常重要的意义;
-
cache
–命名空间的二级缓存配置 -
cache-ref
– 其他命名空间缓存配置的引用。 -
resultMap
– 自定义结果集映射 -
parameterMap
– 已废弃
!老式风格的参数映射 -
sql
–抽取可重用语句块。 -
insert
– 映射插入语句 -
update
– 映射更新语句 -
delete
– 映射删除语句 -
select
– 映射查询语句
二 主键生成方式
- 若数据库
支持
自动生成主键的字段(比如 MySQL和 SQL Server),则可以设置useGeneratedKeys=”true”
,然后再把keyProperty
设置到目标属性上。
insert into t_user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
还可以
将insert插入的数据的主键返回
到User对象中
select last_insert_id()
mysql的uuid()
,实现非自增主键的返回
select uuid()
insert into t_user (id,username,birthday,sex,address) values(#{id},#{username},#{birthday},#{sex},#{address})
- 而对于
不支持
自增型主键的数据库(例如Oracle),则可以使用 selectKey 子元素:selectKey 元素将会首先运行,id 会`被设置·,然后插入语句会被调用
select EMPLOYEE_SEQ.nextval from dual
insert into employee(id,last_name,age,email)
values(#{id},#{lastName},#{age},#{email})
三 参数传递
单个参数
mybatis不会做特殊处理,#{参数名/任意名}
:取出参数值(测试得:真的任意名都可以
)
多个参数
mybatis会做特殊处理,多个参数会被封装成 一个map
key:param1...paramN
,或者arg0...argN-1
命名参数
明确指定封装参数时map的key;@Param("id")
public User findUserByIdAndName(@Param("id")int id, @Param("name")String name);
映射文件
POJO
如果多个参数正好是我们业务逻辑的数据模型,我们就可以直接传入pojo;
#{属性名}
:取出传入的pojo的属性值
Map
这个是我们自己传得map,不是上面多参数是mybatis帮我们处理得。所以可以直接通过key
来获取
集合类型参数
#{list[0]}
,数组就是#{array[0]}
四 #和$
#{key}
:获取参数的值,预编译到SQL中(因为预编译
,最好用在where
里面,测试发现:在编译之后加了引号)。安全。
${key}
:获取参数的值,拼接到SQL中。有SQL注入问题。
五 resultType
简单类型
POJO
使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以
映射成功。如果查询出来的列名和pojo中的属性名全部不一致,没有创建pojo对象。
只要查询出来的列名和pojo中的属性有一个
一致,就会创建pojo对象。(验证通过
)
List类型
没什么区别
Mapper
public List findUserByName(String username);
映射文件
Map类型
查询一条记录
将查询的数据以{表字段名, 对应的值}
方式存入到Map中。
Mapper
Map getEmpAsMapById(Integer id);
映射文件
查询多条记录
可以把查询的数据以{表中某一字段名, JavaBean}
方式来封装成Map。
mapper
// 查询所有员工的信息,把数据库中的 'id' 字段作为 key,对应的 value 封装成 Employee 对象
// @MapKey 中的值表示用数据库中的哪个字段名作 key
@MapKey("id")
Map getAllEmpsAsMap();
映射文件
自动映射
全局setting设置
-
autoMappingBehavior
默认是PARTIAL
,开启自动映射的功能。唯一的要求是列名和javaBean属性名一致
- 如果autoMappingBehavior设置为
null
则会取消自动映射 - 数据库字段命名规范,POJO属性符合
驼峰命名法
,如A_COLUMNaColumn,我们可以开启自动驼峰命名规则映射功能,mapUnderscoreToCamelCase=true
。
六 自定义resultMap
可以实现高级结果集映射
范例
"一对一"
查询Employee的同时查询员工对应的部门
,就像hibernate中得一对一
sql语句
级联属性
使用association
association分步查询
- 先按照员工id查询员工信息
- 根据查询员工信息中的d_id值去部门表查出部门信息
- 部门设置到员工中;
延迟加载(懒加载)
主配置文件
"一对多"
例如:查询部门的时候将部门对应的所有员工信息也查询出来
sql语句
一次查询
分步查询
扩展:传递多列得值
- 分步查询的时候通过column指定,将对应的列的数据传递过去,我们有时需要传递
多列数据
。使用{key1=column1,key2=column2…}
的形式 -
association
或者collection
标签的fetchType=eager/lazy
可以覆盖全局
的延迟加载策略,指定立即加载(eager)或者延迟加载(lazy)
鉴别器
discriminator
参考
- 尚硅谷mybatis教材
- MyBatis查询结果resultType返回值类型详细介绍
- https://www.cnblogs.com/xiaoxi/p/6378960.html