Mapper.xml映射器(学习笔记)

 

--    映射器也可以使用注解完成,但是有所限制,面对复杂性,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开发

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在信号处理领域,DOA(Direction of Arrival)估计是一项关键技术,主要用于确定多个信号源到达接收阵列的方向。本文将详细探讨三种ESPRIT(Estimation of Signal Parameters via Rotational Invariance Techniques)算法在DOA估计中的实现,以及它们在MATLAB环境中的具体应用。 ESPRIT算法是由Paul Kailath等人于1986年提出的,其核心思想是利用阵列数据的旋转不变性来估计信号源的角度。这种算法相比传统的 MUSIC(Multiple Signal Classification)算法具有较低的计算复杂度,且无需进行特征值分解,因此在实际应用中颇具优势。 1. 普通ESPRIT算法 普通ESPRIT算法分为两个主要步骤:构造等效旋转不变系统和估计角度。通过空间平移(如延时)构建两个子阵列,使得它们之间的关系具有旋转不变性。然后,通过对子阵列数据进行最小二乘拟合,可以得到信号源的角频率估计,进一步转换为DOA估计。 2. 常规ESPRIT算法实现 在描述中提到的`common_esprit_method1.m`和`common_esprit_method2.m`是两种不同的普通ESPRIT算法实现。它们可能在实现细节上略有差异,比如选择子阵列的方式、参数估计的策略等。MATLAB代码通常会包含预处理步骤(如数据归一化)、子阵列构造、旋转不变性矩阵的建立、最小二乘估计等部分。通过运行这两个文件,可以比较它们在估计精度和计算效率上的异同。 3. TLS_ESPRIT算法 TLS(Total Least Squares)ESPRIT是对普通ESPRIT的优化,它考虑了数据噪声的影响,提高了估计的稳健性。在TLS_ESPRIT算法中,不假设数据噪声是高斯白噪声,而是采用总最小二乘准则来拟合数据。这使得算法在噪声环境下表现更优。`TLS_esprit.m`文件应该包含了TLS_ESPRIT算法的完整实现,包括TLS估计的步骤和旋转不变性矩阵的改进处理。 在实际应用中,选择合适的ESPRIT变体取决于系统条件,例如噪声水平、信号质量以及计算资源。通过MATLAB实现,研究者和工程师可以方便地比较不同算法的效果,并根据需要进行调整和优化。同时,这些代码也为教学和学习DOA估计提供了一个直观的平台,有助于深入理解ESPRIT算法的工作原理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值