Mapper
insert
1.parameterType: 参数类型,对象和可以直接取内部属性
2.useGeneratedKeys: 使用自增主键
3.keyProperty="id" : 返回自增主键 id, id为返回对象属性键名
4.selectKey返回非自增主键
使用mysql的uuid()函数生成主键,需要修改表中di字段类型为String,长度设置成35位。
执行顺序:
先通过UUID()查询到主键,将主键输入到sql语句中
执行uuid()顺序相对于insert语句之前执行
<selectKey keyProperty="id" order="before" resultType="java.lang.String">
select uuid()
</selectKey>
insert into *******
select
1.返回对象 : resultType="对象全类名"
2.返回集合 : resultType="对象全类名" //mybatis会自动返回对象集合
3.返回Map单条记录 :resultType="map"
4.返回Map多条记录 : 需要使用注解@MapKey()指定查询出来的数据哪个为map的key
resultMap:自定义结果集,不能和resultType一起用
用来指定数据库数据的映射规则
# 普通resultMap查询
<resultMap type="返回类型全类名" id="被其他标签引用的id">
<id column="数据库列名" property="对应实体类属性名"/>
<result column="数据库列名" property="对应实体类属性名"/>
</resultMap>
# 关联查询 之 级联查询
# 查询时联表查询
<resultMap type="返回类型全类名" id="被其他标签引用的id">
<id column="数据库列名" property="对应实体类属性名"/>
<result column="数据库列名" property="对应实体类属性名"/>
<result column="数据库列名" property="对应实体类对象属性.属性名"/>
</resultMap>
# 关联查询 之 association
<resultMap type="返回类型全类名" id="被其他标签引用的id">
<id column="数据库列名" property="对应实体类属性名"/>
<result column="数据库列名" property="对应实体类属性名"/>
<association property="联合对象属性名" javaType="联合对象全类名">
<id column="数据库列名" property="对应实体类属性名"/>
<result column="数据库列名" property="对应实体类属性名"/>
</association>
</resultMap>
# 关联查询 之 association分布查询
# 查询时分布查询 association查询第二步
<resultMap type="返回类型全类名" id="被其他标签引用的id">
<id column="数据库列名" property="对应实体类属性名"/>
<result column="数据库列名" property="对应实体类属性名"/>
<association property="联合对象属性名" select="查询方法(另外一个有<select标签的查询方法>)">
<id column="数据库列名" property="对应实体类属性名"/>
<result column="数据库列名" property="对应实体类属性名"/>
</association>
</resultMap>
# 关联查询 之 association分布查询延迟加载
全局配置文件中 settings标签中开启延迟加载和按需加载
lazyLoadingEnabled:延迟加载的全局开关
aggressiveLazyLoading:开启时,任一方法的调用都会加载该对象的所有延迟加载属性。 否则,每个延迟加载属性会按需加载
# 关联查询之 collection 查询内置对象集合
# 也可以开启分布查询延迟加载 使用select属性传入查询方法,map集合需要指定mapKey column属性
# fetchType属性指定是否开启延迟加载 eager立即 lazy延迟
<resultMap type="返回类型全类名" id="被其他标签引用的id">
<id column="数据库列名" property="对应实体类属性名"/>
<result column="数据库列名" property="对应实体类属性名"/>
<collection property="联合集合属性名" ofType="指定集合中的对象全类名">
<id column="数据库列名" property="对应实体类属性名"/>
<result column="数据库列名" property="对应实体类属性名"/>
</association>
</resultMap>
# 鉴别器
discriminator mybatis可以根据鉴别器判断某列的值,根据值改变封装行为
比如,查出来是男就显示名字,女就显示部门
在resultMap中使用
<discriminator javaType="string" column="gender">
<case value="0" resultType="全类名">
<result>
</case>
</discriminator>
动态sql
动态拼接sql
# if 根据参数判断 是否添加语句
<if test="id!=null">
id=#{id}
</if>
# where 自动删除每个动态sql开头多出来的and或者or
# trim自定义字符串截取
属性
prefix 前缀 包含体中所有语句组合之后的语句前加个前缀
prefixOverrides 前缀覆盖,用来覆盖每条语句前多余的字符
suffix 后缀,包含体中所有语句组合之后的语句后加个后缀
suffixOverrides 后缀覆盖,用来覆盖每条语句后多余的字符
# choose (when otherwise) "==" switch (case default)
<choose>
<when test="id!=null">
id = #{id}
</when>
<otherwise>
</otherwise>
</choose>
# set 修改方法中使用,结合if
<set>
<if test="">
</if>
</set>
where id = #{id}
# foreach
属性
collection 指定要遍历的集合,list参数会被特殊处理为map,map的key就是list
item 定义每次遍历取出值赋值的名称
separator 定义每个元素之间的分隔符
open 将open中的值拼接到遍历的属性之前
close 将close中的值拼接到遍历的属性之后
index 索引
#{item}
in
<foreach collection="ids" item="id" separator="," open="(" close=")">
#{id}
</foreach>
批量查询
values(),()
# bind标签可以在select等标签中定义属性
<bind name="" value="" /> value中可以使用ognl表达式,就像el表达式的值一样
可以使用#{name}使用
concat函数可以拼接模糊查询 concat("%",#{id},"%")
# 公共sql
<sql id="">
</sql>
## 引用公共sql
<include refid="sqlid">
<property name="" value=""> //可以在sql中使用#{name}调用
</include>
mybatis内置参数
1._parameter:
如果只有一个参数
_parameter就是这个参数
如果是一个对象
_parameter就是对象自动封装的map