-- 映射器也可以使用注解完成,但是有所限制,面对复杂性,SQL显得无力,尤其是长SQL。注解可读性差。功能上注解丢失了
XML上下文互相引用的功能。
配置元素:
1、select 查询语句,最常用最复杂之一 ,可以自定义参数,返回结果集等
2、insert 插入语句 ,执行后返回一个整数,代表插入的条数
3、update 更新语句 ,返回一个整数,代表更新的条数
4、delete 删除语句 ,返回一个正数,代表删除的条数
5、parameterMap 定义参数映射关系 ,不推荐使用,可能即将删除
6、sql 定义一部分SQL,在其他地方引用 ,后边再说
7、resultMap 描述从数据库结果集中来加载对象, 提供映射规则 (太多了 换一篇写)
8、cache 给定命名空间的缓存配置
9、cache-ref 其他命名空间的缓存配置的引用
详细:
1、select
1.1、select元素配置(前7个较常用)
1.1.1、id 与Mapper命名空间组合起来是唯一的,供调用 ,若不唯一报异常
1.1.2、parameterType 可以是类的全名,也可以是别名,必须是注册过的,javaBean、Map
1.1.3、parameterMap 即将废弃
1.1.4、resultType 可以定义类的全路径,允许自动匹配的情况下,结果集将通过javabean的规范映射;或定义为int,long,map等
参数;也 可以使用别名,不能和resultMap同时使用
1.1.5、resultMap 映射集的引用,可以提供自定义映射规则的机会,可以配置级联、typeHandler等
1.1.6、flushCache 调用SQL后,是否需要清空之前查询本地缓存和二级缓存,true|false
1.1.7、useCache 启动二级缓存的开关,是否要求将此次结果缓存,true|false
1.1.8、timeout 超时参数,单位秒
1.1.9、fetchSize 获取记录的总条数设定
1.1.10、statementType 使用哪个statement工作,STATEMENT|PREPARED|CALLABLE ,默认Prepared
1.1.11、resultSetType 未完待续 FORWARD_ONLY(游标允许向前访问)|SCROLL_SENSITIVE(双向滚动,不及时更新)|
SCROLL_INSENTSITIVE(双向滚动,及时更新)
1.1.12、databaseId 数据库厂商标识,参考Mybatis配置
1.1.13、resultOrdered 待续 适用于嵌套结果select语句
1.1.14、resultSet 适用于多个结果集的情况,将列出执行SQL后每个结果集的名称,逗号隔开
1.2、示例
<mapper namespace="com.ssm.mapper.RoleMapper">
<select id="getRole" parameterType="long" resultType="role">
select id,r_name as roleName,note from role where id = #{id}
</select>
</mapper>
1.3、自动映射和驼峰映射
1.3.1、自动映射
默认开启,在<setting/>元素中配置(可见Mybatis配置)autoMappingBehavior
自动映射配置值可以为:NONE(不进行自动映射)|PARTIAL(默认值,只对没有嵌套结果集自动映射)|FULL(对所有自动映射)
示例如:POJO类Role.java有属性如下:mapper.xml如1.2;
private int id;
private String roleName;
private String note;
自动映射需要SQL列名和属性名保持一致,r_name被别名roleName替代,这样就和POJO属性保持一致,会进行自动映射
1.3.2、驼峰映射
mapUnderscoreToCamelCase在<setting/>元素中设置为true即可
数据库字段名为r_name,则POJO类中属性名为rName;
要求严格对应,降低灵活度。
可能有些字段有主从表级联,又或typeHandler的复杂转换,resultType已经满足不了需求,此时需要采用resultMap
1.4、传递多个参数
1.4.1、使用map传递参数
接口定义:
public List<Role> findByMap(Map<String,Object> parametermap);
XML:
<select id="findByMap" parameterType="map" resultType="role">
select id,r_name as roleName,note from role where id = #{id} and r_name = #{roleName}
</select>
缺点:可读性差,但是严格来说,适合几乎所有场景
1.4.2、注解
接口定义:
public List<Role> findByMap(@Param("id") int id, @Param("roleName") String rolename);
XML:
<select id="findByMap" resultType="role">
select id,r_name as roleName,note from role where id = #{id} and r_name = #{roleName}
</select>
此时不需要parameterType属性
1.4.3、通过JavaBean 传递
定义一个参数的POJO类RoleParams.java:
public class RoleParams{
private int id;
private String roleName;
//getter and setter
}
接口定义:
public List<Role> findByMap(RoleParams roleParams);
XML:
<select id="findByMap" parameterType="com.ssm.pojo.param.RoleParams" resultType="role">
select id,r_name as roleName,note from role where id = #{id} and r_name = #{roleName}
</select>
1.4.4、混合使用注解和JavaBean
分页参数PageParams.java:
public class PageParams{
private int start;
private int limit;
//getter and setter
}
接口定义:
public List<Role> findByMap(@Param("roleparams") RoleParams rp,@Param("pageparams") PageParams pp);
XML:
<select id="findByMap" resultType="role">
select id,r_name as roleName,note from role
where id = #{roleparams.id} and r_name = #{roleparams.roleName}
limit #{pageparams.start},#{pageparams.limit}
</select>
对JavaBean提供EL支持
1.5、resultMap映射结果集
<mapper namespace="com.ssm.mapper.RoleMapper">
<resultMap id="roleMap" type="role">
<id property="id" column="id"/>
<result property="roleName" column="r_name"/>
<result property="notr" column="note"/>
</resultMap>
<select id="getRole" parameterType="long" resultMap="roleMap">
select id,r_name as roleName,note from role where id = #{id}
</select>
</mapper>
-- 定义了一个标识为roleMap的映射规则,type代表使用哪个类作为映射的类,可以使别名或全名,role是别名
-- 子元素id代表resultMap的主键,result代表其属性,property和column分别代表POJO类属性名和数据库列名。
-- 在select元素中使用resultMap设置采用哪个映射规则
1.6、分页参数RowBounds
Mybatis支持分页,内置一个处理分页的类--RowBounds。类似1.4.4中的PageParams.java
持有私有变量offset和limit ,默认值构造函数,也可以传递参数自定义值构造。
使用时只需要在接口中增加一个RowBounds参数即可
--示例接口定义:
public List<Role> findByMap(@Param("roleparams") RoleParams rp,RowBounds rowBounds);
--对于XML中SQL不需要任何关于RowBounds参数的信息,Mybatis会自动识别并进行分页
--原理是执行SQL查询后,按照偏移量和限制条数返回查询结果,对于大量查询,性能并不佳,此时可以通过分页插件处理,详情见下
篇
2、insert
2.1、insert属性配置
2.1.1、id 同select
2.1.2、parameterType 同select
2.1.3、flushCache 是否刷新缓存 默认true
2.1.4、timeout 同select
2.1.5、statementType 同select
2.1.6、useGeneratedKeys 是否使用JDBC的getGenneratedKeys方法来取出数据库内部生成的主键 默认false
2.1.7、keyProperty 仅对insert和update有用,标记一个属性,会通过getGenneratedKeys或者selectKey子元素设置键值
2.1.8、keyColumn 仅对insert和update有用,当主键列不是表中第一列时设置,复合主键(,)逗号隔开
2.1.9、databaseId 参照Mybatis配置
2.2、示例
<insert id="insertRole" parameterType="role">
insert into role(r_name,note) values(#{roleName},#{note})
</insert>
2.3、主键回填
--2.2示例并没有插入id列,因为mysql采用自增主键,会自动为该记录生成对应主键,但有时候我们还需要使用这个主键,用来关联
其他业务,所以在插入的同时获取到主键,Mybatis提供了支持
2.3.1、JDBC的Statement对象执行插入sql后,通过getGenneratedKeys方法获得生成的主键,insert语句属性useGenneratedKeys
用来控制是否开启这个功能,默认是false;打开这个开关后,还要配置keyProperty或keyColumn,告诉系统把生成的主键
放入哪个属性,若存在多个主键,(,)逗号隔开
<insert id="insertRole" parameterType="role"
useGenneratedKeys="true" keyProperty="id">
insert into role(r_name,note) values(#{roleName},#{note})
</insert>
2.3.2、selectKey selectKey在执行SQL前后设置键值,也可以用于主键回填或者其他一些情况,自定义键值的生成规则
<insert id="insertRole" parameterType="role">
<selectKey keyProperty="id" resultType="long" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey>
insert into role(r_name,note) values(#{roleName},#{note})
</insert>
-- LAST_INSERT_ID()函数使用坑很多,详情见https://blog.csdn.net/slvher/article/details/42298355
-- selectKey中keyProperty设置需要设值的属性,order值为BEFORE|AFTER,表示selectKey中SQL在insert语句执行前或后
执行设值 操作,不仅仅可以用作主键回填,可以在插入之前根据数据库情况改变相应属性值,再进行插入。
比如on duplicate key update语句,插入之后进行非主键的获值。。。。详情再说吧
3、update 4、delete
和insert属性差不多,执行完返回一个整数,表示SQL影响数据库的记录行数。
6、sql元素
<sql id="roleCols">
id,r_name as roleName,note
</sql>
<select id="findByMap" resultType="role">
select <include refid="roleCols"/> from role where id = #{id}
</select>
也支持变量传递如:
<sql id="roleCols">
${alias}.id,${alias}.r_name,${alias}.note
</sql>
<select id="findByMap" resultMap="roleMap">
select
<include refid="roleCols">
<property name="alias" value="r"/>
</include>
from role r where id = #{id}
</select>
--参考书目
JavaEE互联网轻量级框架整合开发--SSM框架(Spring MVC +Spring+Mybatis)和Redis开发