zoukankan      html  css  js  c++  java
  • Mybatis参数传递及返回类型

    mybatis参数传递:


        单个参数:不做特殊处理
            #{参数名}:取出参数值
        多个参数:做特殊处理
            多个参数会被封装成一个map
                key:param1   ...   paramN
                value:传入的参数值
            #{}就是从map中获取指定的key值
            
            操作:
                方法:public Employee getEmployeeByNmaeAndPass(String name,String pass);
                取值:#{name},#{pass}

        命名参数:明确指定封装参数时map的key:@Param("id")
            多个参数会被封装成一个map
                key:使用@Param注解指定的值
                value:参数值
                #{指定的key}取出对应的参数值

        POJO:

        如果多个参数是业务模型中的数据,可以直接使用POJO:
                #{属性名}:取出传入的POJO 的属性值


        Map:

        如果多个参数不是业务模型中的数据,没有对应的POJO,为了方便,可以传入map
                #{key}:取出map中对应的值

        
        TO:
        如果多个参数不是业务模型中的数据,但是经常要是用,推荐来编写一个TO(Transfer Object)数据传输对象
        Page{
            int index;
            int size;
        }

    示例:

    1、public Employee getEmployee(@Param("name")String name,String pass);
        取值:name=====>#{name/param1}   pass=====>#{param2}

    2、public Employee getEmployee(String name,@Param("emp")Employee employee);
        取值:name====>#{param1}      pass=====>#{emp.pass/param2.pass}

    3、如果是Collection(List   Set)类型或者是数组型,也会特殊处理,
        也是把传入的list或者数组封装在map中
            key:Collection(collection),如果是List还可以使用这个key(list)
                 数组(array)
        public Employee getEmpById(List<Integer> ids);
        取值:取出第一个id的值:#{list[0]}


    mybatis处理参数:
    总结:参数多时会封装map,未了不混乱,可以使用@Param来指定封装时使用的key;
    #{key}就可以取出map中的值

    (@Param("id")Integer id,@Param("name")String name);
    ParamNameResolver解析参数封装的map:
        names:{0=id,1=name}
        1、获取每个标了param注解的参数的@Param的值:id,name:赋值给name
        2、每次解析一个参数给map中保存信息:(key:参数索引,value:name的值)
            name的值:
                标注了param注解:注解值
                没有标注:
                1、全局配置:userActualParam(jdk1.8):name=参数名
                2、name=map.size();相当于当前元素索引

    mybatis参数值的获取
    #{}:可以获取map中的值或者pojo对象属性的值
    ${}: 可以获取map中的值或者pojo对象属性的值
    区别:
        #{}:是以预编译的形式,将参数设置到sql语句中:PreparedStatement;防止sql注入
        ${}:取出的值,直接拼接在sql语句中,会由安全问题;
        大多情况下,都会使用#{}
        当存在分表、排序:按照年份分表拆分
            原生jdbc不支持占位符的地方就可以使用${}进行取值
            select * from  ${year}_salary where xxxx;
            select * from tb_student order by ${name}
            
    #{}:
        可以规定参数的一些规则:
        JavaType、jdbcType、mode(存储过程)、numeriScale、resultMap、typeHandler、jdbcTypeName

        jdbcType通常需要在某种特定的条件下呗被设置:
            在数据为null的时候,有些数据库可能不能识别mybatis对null的默认处理。
            比如:Oracle(报错)
            insert into student(id,name,age) values(null,'test',null)
            oracle不能识别对null的操作,报错。因为mybatis对所有的null都映射的是原生jdbc的other类型。
            但是MySQL可以识别对null的操作,若想解决此问题,则使用以下添加语句;
            
            1、insert into student(id,name,age) values(#{id},#{name},#{age,jdbcType=NULL})
        
            2、由于全局配置中,jdbcTypeForNull=OTHER:oracle不支持
                <setting name="jdbcTypeForNull" value="NULL">
                此配置对使用MySQL数据库时的影响。

    返回参数类型:
    List型:
        resultType:返回的是一个集合,要写集合中元素的类型

    Map型:
        resultType=“map”:返回一条记录
        key:就是列名    value:对应的值
        mybatis对用到的部分类进行了封装,可直接使用封装类型。

        返回多条记录封装一个map:
        1、resultType:要写集合中元素的类型。
            Map<Integer,Employee>:
                    键是这条记录的主键,值是记录封装后的JavaBean
        2、在对应的方法上添加@MapKey("id") 告诉mybatis封装这个map的时候使用哪个属性作为map的key
       

  • 相关阅读:
    切换到真正的最高权限 SYSTEM 账户界面
    javascript中replace的正则表达式语法
    微软系统漏洞_超长文件路径打造私人地盘
    JAVA控制台
    PowerPoint绘图笔不能用
    《JavaScript核心技术》
    Catch(...) C++中三个点
    XMLHttp连续调用SEND需要注意的问题
    Wscript中的事件机制
    JavaScript(JS)常用的正则表达式
  • 原文地址:https://www.cnblogs.com/staticking/p/7001091.html
Copyright © 2011-2022 走看看