在mapper.xml中,定义很多的statement,statement需要parameterType指定输入参数的类型、需要resultType指定输出结果的映射类型。

如果在指定类型时输入类型全路径,不方便进行开发,可以针对parameterType或resultType指定的类型定义一些别名,在mapper.xml中通过别名定义,方便开发。

在mybatis的开发中, 实体类对应的映射xml配置文件(比如UserMapper.xml等)里面的sql语句(比如:

<select id="findUserByid"  parameterType="int" resultType="store.cloudspace.pojo.User">
     SELECT * FROM USE WHERE id = #{id}
</select>
)都需要有输入/输出参数类型(上面的parameterType/resultType)。其中前者完整的写法应该是:parameterType="java.lang.Integer",但是在这里mybatis已经自动转换了,mybatis支持自动的类型有:

所以入参的类型一般不需要我们转换,但是输出参数的类型却需要我们做一些事情,因为输出参数大部分是某个包里面的实体类型。那么,我们该如何自定义这些类型呢?

返回值

返回值用resultType指定其类型,类型为简单类型,map,类等。

类型的形式为:

string  java.lang.String

int     java.lang.Integer

...

map    java.util.Map

类    类的全路径,如self.exercise.model.User

举例说明:

返回值只是一个简单的数据类型。

<select id="getUserName" resultType="string">
select user_name from user where id = 1
</select>
String userName = sqlSession.selectOne("self.eercise.dao.UserDao.getUserName");

如果是多个字段对应的多个返回值,可以返回值类型设为map或类。

返回值为map,字段名会自动映射成key,属性名映射为key值;返回值为类,类中的变量名必须跟数据库中的字段名或者字段别名相同才可以,否则即使数据库中的字段值不为空,在类中对应的变量值也为空。

如果返回值不止一个,而是多个记录的结果集,返回值类型应设为为泛型,得到的结果集会自动封装到List集合中。

<select id="load_map" resultType="map" parameterType="map">
select * from user where id = #{id} and account = #{account}
</select>
Map<String, Object> map = new HashMap<String, Object>();
map.put("id", 1);
map.put("account", "dva");
List<Map<String, Object>> listMap = sqlSession.selectList("self.exercise.dao.UserDao.load_map", map);

参数

当只有一个参数时,参数类型用parameterType指定类型,可以是简单类型,map或者对象。

如果参数是一个简单的数据类型,那么#{param}中的param可以任意取名。

<select id="getUserName" resultType="string" parameterType="int">
select user_name from user where id = #{id}
</select>
String userName = sqlSession.selectOne("self.exercise.dao.UserDao.getUserName",1);

另外,在参数是一个简单类型的情况下,如果控制台报如下错误:

Caused by: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'user_name' in 'class java.lang.String'

那么要将param改名为_parameter,具体原因还不清楚。。。在何种情况下使用也不清楚,目前我只能通过控制台报错来获取线索。如果有知道的dalao还请告知,谢谢。

如果有多个参数,有两种方法可以实现传参。

一  可以将参数封装到map或者类中

在parameterType中指明容器的类型即可;param取名要与map中的key或者类中的变量名相同,这样获取值时才会正确映射。例如上面load_map的例子。

二  直接传递参数,这种方式只有接口代理的才能使用。

这种情况下不用在映射文件中指明参数类型,又分三种解决方式。

(一)用0,1,2....来指明第几个参数

//接口中的方法
User getUser(String user_name,String account);

映射文件中的语句应为

<select id="getUser" resultType="sel.exercise.dao.UserDao">
select user_name from user where user_name = #{0} and account = #{1}
</select>

(二)用param1,param2...来代替参数

//接口中的方法
User getUser(String user_name,String account);

映射文件中的语句应为

<select id="getUser" resultType="sel.exercise.dao.UserDao" >
select user_name from user where user_name = #{param1} and account = #{param2}
</select>

前两种方式,where语句中字段名的顺序必须严格遵循接口中方法参数的顺序。

(三)@Param方法进行映射

//接口中的方法
User getUser(@Param("userName") String user_name,@Param("account") String account);

映射文件中的语句应为

<select id="getUser" resultType="sel.exercise.dao.UserDao" >
select user_name from user where user_name = #{userName} and account = #{account}
</select>

注意,#{param}中的param名为@Param方法映射出的新的参数名

11、mybatis的映射xml中参数类型的别名的更多相关文章

  1. Mybatis配置文件SqlMapConfig.xml中的标签

    SqlMapConfig.xml配置文件中的属性 1 配置内容 properties(属性) settings(全局配置参数) typeAliases(类型别名) typeHandlers(类型处理器 ...

  2. Spring Boot (11) mybatis 关联映射

    一对多 查询category中的某一条数据,同时查询该分类下的所有Product. Category.java public class Category { private Integer id; ...

  3. Mybatis配置映射文件中parameterType的用法小结

    原创: 在mybatis映射接口的配置中,有select,insert,update,delete等元素都提到了parameterType的用法,parameterType为输入参数,在配置的时候,配 ...

  4. MyBatis 关系映射XML配置

    关系映射 在我看来这些实体类就没啥太大关联关系,不就是一个sql语句解决的问题,直接多表查询就完事,程序将它设置关联就好 xml里面配置也是配置了sql语句,下面给出几个关系的小毛驴(xml) 一对多 ...

  5. Python函数中参数类型

    在学习Python函数的时候,函数本身的定义和调用并不是很复杂,但是函数的参数类型和用法的确有些复杂.在此做一个小结,加深理解. Python参数的定义 负责给函数提供一些必要的数据或信息,以保证函数 ...

  6. mybatis where in语句中参数过多

    ps : mybatis在in中参数过多 出现问题 com.microsoft.sqlserver.jdbc.SQLServerException: 传入的请求具有过多的参数.该服务器支持最多 210 ...

  7. mybatis配置文件xxxx.xml中缺失返回类型的后果A query was run and no Result Maps were found

    使用mybatis时出现异常问题: 有如下的错误 Error querying database.  Cause: org.apache.ibatis.executor.ExecutorExcepti ...

  8. Hibernate映射数据库中longtext类型属性时报错No Dialect mapping for JDBC type: -1的解决方案

    出现错误的原因是:hibernate中对于数据库的longtext数据类型不支持. 解决方案: 1.写个类集成方言,然后自己实现对longtext的支持 import java.sql.Types; ...

  9. Spring集成mybatis时mybatis的映射XML配置

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "- ...

随机推荐

  1. 【NOIP2018】为什么这么无力啊

    菜鸡又要爆零了 辛辛苦苦背板子结果考时候脑子一片空白 第一题线段树调了半小时 看完三道题两道写暴搜一道写暴力(说是暴搜,觉得更像写了个背包) 别提暴搜还忘记剪枝. . . . . . 我觉得考场上最菜 ...

  2. Java之POI读取Excel的Package should contain a content type part [M1.13]] with root cause异常问题解决

    Java之POI读取Excel的Package should contain a content type part [M1.13]] with root cause异常问题解决 引言: 在Java中 ...

  3. PCB 奥宝LDI 输出自动改周期检测内容

    继续完善奥宝LDI输出,在自动更新周期发现前期梳理不过完善或出些从未考虑到的工艺问题, 今天将更改线路周期检测内容整理如下

  4. E20170906-mk

    portrait   n. 肖像,肖像画; 模型,标本; 半身雕塑像; 人物描写; orientation  n. 方向,定位,取向,排列方向; 任职培训; (外交等的) 方针[态度]的确定; 环境判 ...

  5. day-05 python函数

    # #-*- coding:utf-8 -*-# 1:编写一个名为 make_shirt()的函数,它接受一个尺码以及要印到 T 恤上的字样.这个函数应打印一个句子,概要地说明 T 恤的尺码和字样.d ...

  6. B - Cows and Poker Game

    Problem description There are n cows playing poker at a table. For the current betting phase, each p ...

  7. Prism.Interactivity 之 PopupWindowAction 用法简记

    PopupWindow通过InteractionRequestTrigger(EventTrigger的派生类)侦听目标对象(InteractionRequest<T>类型)的Raised ...

  8. Django学习案例一(blog):六. 开发博客内容页面

    目标:某条博客具体内容的展示,可返回博客主页面,可进行评论. 1. 编辑路由 一篇博客,要将其找出来,就需要有一个唯一的标识.Django 的模型中默认有一个唯一的且未自增长的主键,即 id 字段.我 ...

  9. 八:前端---Vue下的国际化处理

    1:首先安装 Vue-i8n npm install vue-i18n --save 注:-save-dev是指将包信息添加到devDependencies,表示你开发时依赖的包裹. -save是指将 ...

  10. angualr2之路由与导航(一)

    1. 唯一根模块式组件导航 在唯一根模块式组件导航中,全局只有一个模块,即根模块. 1.1 根模块 在根模块中,需要导入所有组件及其对应的服务,并将组件加入声明,将其对应的服务加入提供商. // ap ...