mybatis入门系列二之详解输入与输出参数

 

基础知识

 

mybatis规定mapp.xml中每一个SQL语句形式上只能有一个@parameterType和一个@resultType

1、 返回值是一个对象的集合,@resultType中只能写该对象的类型,而不是写list<T>

2、 输入参数可以用#{}和${}两种取值方法,两者区别与联系:

1、 当传入类型为JDBC基本类型(8种java基本类型+String)时,#{}里面可以写成任意值,${}里面必须写value  

2、 当传入类型为对象时,两种方式里面都应该写成类中属性名

3、 #{}方式传值会将传入的值当做一个字符串处理,会自动将其加入"",而${}方式则不会  

4、 #{}方式能够有效防止SQL注入,而${}不会,因此能够用#{}就不要用${}

5、 ${}的适用场景是利用数据库中的字段动态排序等例如想要根据id排序
如果用#{}传入id,SQL语句会变成order by "id"这样的SQL语句不能排序,
因此只能用${},对应的SQL语句是order by id符合要求

 

输入参数@parameterType

 

输入参数为基本类型

当输入参数为JDBC基本类型,则可以直接用#{xxx}或者${value}取值

 

输入参数为对象

当输入参数为对象时,则可以用#{属性名}或者${属性名}取值

 

输入参数为HashMap

则#{key}即可取得该key对应的value

<select id="queryStudentBystuageOrstuNameWithHashMap" 	parameterType="HashMap"	resultType="student" >
select stuno,stuname,stuage from student
where stuage= #{stuAge} or stuname like '%${stuName}%'
<select/>

 

输出参数@resultType

 

输出参数为JDBC基本数据类型

直接写输出类型

 

输出参数为类对象(或者类对象的集合)

这时要求数据库中的属性名、属性类型要与类对象能够对应

 

输出参数为HashMap

<!-- 别名作为Map的key -->
<select id="queryStudentOutByHashMap" resultType="HashMap" >
select stuno "no",stuname "name" from student where stuno=1
<select/>

 

HashMap<String,Object> studentMap = studentMapper.queryStudentOutByHashMap();
System.out.println(studentMap.get(no));

 

输出参数为广义类对象,但是属性名或者属性类型不能对应

例如数据库person表中属性为int id,varchar(20) name

对应的实体类属性为int num,varchar(20) name

若直接查询select * from person会报错

 

解决方法一:resultMap(适用于属性名或者属性类型不同且不能自动转换)

以下示例为属性名不同,属性类型不同且不能自动转换应该自定义类型转换器,会单独开文章介绍

<select id="XXX" @resultMap="queryWithResultmap">
select id,name from person
<select/>
<resultMap type = "person" id="queryWithResultmap">
<!-- 指定实体类属性与数据库属性之间的关系,主键用id标签,非主属性用result属性-->
<id property="num",column="id">
<result property="name" column="name">
</resultMap>

 

解决方法二:resultType+HashMap(适用于属性名不同)

<select id="XXX" @resulttype="person">
select id "num", name "name" from person
</select>

mybatis入门系列二之输入与输出参数的更多相关文章

  1. Java I/O系统学习系列二:输入和输出

    编程语言的I/O类库中常使用流这个抽象概念,它代表任何有能力产出数据的数据源对象或者是有能力接收数据的接收端对象.“流”屏蔽了实际的I/O设备中处理数据的细节. 在这个系列的第一篇文章:<< ...

  2. MyBatis入门(二)—— 输入映射和输出映射、动态sql、关联查询

    一.输入映射和输出映射 1. parameterType(输入类型) 1.1 传递简单类型 <select id="getUserById" parameterType=&q ...

  3. JavaWeb_(Mybatis框架)输入和输出参数_五

    系列博文: JavaWeb_(Mybatis框架)JDBC操作数据库和Mybatis框架操作数据库区别_一 传送门 JavaWeb_(Mybatis框架)使用Mybatis对表进行增.删.改.查操作_ ...

  4. mybatis入门系列三之类型转换器

    mybatis入门系列三之类型转换器 类型转换器介绍 mybatis作为一个ORM框架,要求java中的对象与数据库中的表记录应该对应 因此java类名-数据库表名,java类属性名-数据库表字段名, ...

  5. C# 互操作性入门系列(二):使用平台调用调用Win32 函数

    好文章搬用工模式启动ing ..... { 文章中已经包含了原文链接 就不再次粘贴了 言明 改文章是一个系列,但只收录了2篇,原因是 够用了 } --------------------------- ...

  6. [转]C# 互操作性入门系列(二):使用平台调用调用Win32 函数

    传送门 C#互操作系列文章: C# 互操作性入门系列(一):C#中互操作性介绍 C# 互操作性入门系列(二):使用平台调用调用Win32 函数 C# 互操作性入门系列(三):平台调用中的数据封送处理 ...

  7. Maven入门系列(二)--设置中央仓库的方法

    原文地址:http://www.codeweblog.com/maven入门系列-二-设置中央仓库的方法/ Maven仓库放在我的文档里好吗?当然不好,重装一次电脑,意味着一切jar都要重新下载和发布 ...

  8. MyBatis学习系列二——增删改查

    目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring 数据库的经典操作:增删改查. 在这一章我们主要说明一下简单的查询和增删改, ...

  9. python入门(6)输入和输出

    python入门(6)输入和输出 输出 >>> print 'hello, world' >>> print 'The quick brown fox', 'jum ...

随机推荐

  1. RabbitMQ (二)工作队列

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37620057 本系列教程主要来自于官网入门教程的翻译,然后自己进行了部分的修改与 ...

  2. key.go

    package].Key)         if err = waitDelete(ctx, client, lastKey, resp.Header.Revision); err != nil { ...

  3. bzoj4904 [Ctsc2017]最长上升子序列

    我们发现他让求的东西很奇怪,于是通过某D开头定理,我们转化为前m位的序列用k个不上升子序列最多能覆盖多少.数据范围小的时候可以网络流做,但是这道题显然不支持网络流的复杂度.然后有一个奇怪的东西叫杨氏矩 ...

  4. BZOJ_4006_[JLOI2015]管道连接_斯坦纳树

    BZOJ_4006_[JLOI2015]管道连接_斯坦纳树 题意: 小铭铭最近进入了某情报部门,该部门正在被如何建立安全的通道连接困扰. 该部门有 n 个情报站,用 1 到 n 的整数编号.给出 m ...

  5. Appium+python的环境搭建!

    我的电脑64位操作系统 下载并安装所需软件: 1.adb环境 2.下载(python-2.7.12.amd64.msi)并安装python 3.下载并解压adt,如(adt-bundle-window ...

  6. 描述性统计指标 - 众数 Mode

    定义- 数值型数据 - 出现频数最多的变量值- 品质型数据.单项式分组数据 - 频数最多的组为众数组,该组的变量值(类型)就是众数- 组距式分组数据 - 频数最多的组为众数组,通过公式求得众数 - 公 ...

  7. Spark学习之在集群上运行Spark

    一.简介 Spark 的一大好处就是可以通过增加机器数量并使用集群模式运行,来扩展程序的计算能力.好在编写用于在集群上并行执行的 Spark 应用所使用的 API 跟本地单机模式下的完全一样.也就是说 ...

  8. javascript引擎执行的过程的理解--执行阶段

    一.概述 同步更新sau交流学习社区(nodeJSBlog):javascript引擎执行的过程的理解--执行阶段 js引擎执行过程主要分为三个阶段,分别是语法分析,预编译和执行阶段,上篇文章我们介绍 ...

  9. java游戏开发杂谈 - 游戏编程浅析

    每个游戏,你所看到的它的一切,都是计算机画出来的! 地图是画出来,人物是画出来的,树木建筑是画出来的,菜单按钮是画出来的,滚动的文字.闪烁的图标.云雾烟火,都是画出来的. 游戏编程,所要做的,就是控制 ...

  10. android渠道打包怎样实现最方便

    我们都知道,Android 市场被分割成几十个应用商店渠道,程序员给渠道打包.更新是一件异常繁杂又不得不做的工作,但现在有一种快捷灵活的免费多渠道统计方式,能最大程度的提高打包效率和数据安全性. 首先 ...