百度
360搜索
搜狗搜索

resultmap,mybatis的查询必须指定resultType或者resultMap吗?详细介绍

本文目录一览: MyBatis中关于resultType和resultMap的区别

一、概述
MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,但是resultType跟resultMap不能同时存在。
在MyBatis进行查询映射时,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值。
①当提供的返回类型属性是resultType时,MyBatis会将Map里面的键值对取出赋给resultType所指定的对象对应的属性。所以其实MyBatis的每一个查询映射的返回类型都是ResultMap,只是当提供的返回类型属性是resultType的时候,MyBatis对自动的给把对应的值赋给resultType所指定对象的属性。
②当提供的返回类型是resultMap时,因为Map不能很好表示领域模型,就需要自己再进一步的把它转化为对应的对象,这常常在复杂查询中很有作用。
二、ResultType
Blog.java
public class Blog {
private int id;
private String title;
private String content;
private String owner;
private List

comments;

}

其所对应的数据库表中存储有id、title、Content、Owner属性。

select * from t_blog where id = #{id}

MyBatis会自动创建一个ResultMap对象,然后基于查找出来的属性名进行键值对封装,然后再看到返回类型是Blog对象,再从ResultMap中取出与Blog对象对应的键值对进行赋值。

三、ResultMap

当返回类型直接是一个ResultMap的时候也是非常有用的,这主要用在进行复杂联合查询上,因为进行简单查询是没有什么必要的。先看看一个返回类型为ResultMap的简单查询,再看看复杂查询的用法。

①简单查询的写法

select * from t_blog where id = #{id}

select映射中resultMap的值是一个外部resultMap的id,表示返回结果映射到哪一个resultMap上,外部resultMap的type属性表示该resultMap的结果是一个什么样的类型,这里是Blog类型,那么MyBatis就会把它当作一个Blog对象取出。resultMap节点的子节点id是用于标识该对象的id的,而result子节点则是用于标识一些简单属性的,其中的Column属性表示从数据库中查询的属性,Property则表示查询出来的属性对应的值赋给实体对象的哪个属性。简单查询的resultMap的写法就是这样的。

②复杂查询

有一个Comment类,其中有一个Blog的引用,表示是对哪个Blog的Comment,那么在查询Comment的时候把其对应的Blog也要查出来赋给其blog属性。

public class Comment {

private int id;

private String content;

private Date commentDate = new Date();

private Blog blog;

}

select * from t_Comment where id = #{id}

select * from t_Blog where id = #{id}

先是请求id为selectComment的select映射,然后得到一个id为CommentResult的ResultMap对象,可以看到在对应的resultMap的返回类型是一个Comment对象,其中只有一个association节点,而没有像前面说的简单查询所对应的id、result子节点,但是其仍会把对应的id等属性赋给Comment对象,这就是前面所说的MyBatis拥有自动封装功能,只要提供了返回类型,MyBatis会根据自己的判断来利用查询结果封装对应的对象,所以前面的简单查询中,如果不在resultMap中明确的指出id对应哪个字段,title对应哪个字段,MyBatis也会根据自身的判断来帮封装,MyBatis的自身判断是把查询的field或其对应的别名与返回对象的属性进行比较,如果相匹配且类型也相匹配,MyBatis则会对其进行赋值。在上面对应的resultMap中关联了一个blog属性,其对应的java类型为Blog,在上述的写法中,关联对象是通过子查询来进行关联的,当然也可以直接通过关联查询来进行关联。上面的association子节点中,Property属性表示是resultMap返回类型的哪个关联属性,对于上面的例子就是Comment管理的blog属性;select表示进行哪个select映射来映射对应的关联属性,即会去请求id为select所对应的值的select映射 来查询出其所关联的属性对象;Column表示当前关联对象在id为CommentResult的resultMap中所对应的键值对,该键值对将作为对关联对象子查询的参数,即将把在selectComment中查询出来的blog属性的值作为参数传给进行关联对象blog的子查询selectBlog的参数;javaType表示当前关联对象在JAVA中是什么类型。

上述介绍的是一对一或一对多的情况下,对一对一方的关联的查询。在实际应用中还有一个用的比较多的应用是通过一对一方查出对应的多的一方,在拿出多的一方的时候也同样要把一对一方关联上:在拿出Blog对象时,就把其对应的Comment全部拿出来,在拿出Comment的时候也还是需要把其对应的Blog拿出来,这是在java中通过一次请求就拿出来的。

select * from t_blog where id = #{id}


select * from t_Comment where blog = #{blogId}

上述请求的入口是id为selectBlog的select映射,返回结果为id为BlogResult的resultMap,id为BlogResult的类型为Blog,其中指定了id的属性和字段,指定id将对MyBatis内部的构造作用非常大。其中关联了一个comments对象,因为一个Blog可以有很多Comment,该comments为一个集合,所以用集合collection进行映射,其中的select还是表示进行哪个子查询来查询对应的comments,column表示把上述查出来的哪个字段值当作参数传给子查询,ofType也是表示返回类型,这里的返回类型是集合内部的类型,之所以用ofType而不是用type是MyBatis内部为了和关联association进行区别。

public void selectCommentsByBlogTest() {

SqlSession session = Util.getSqlSessionFactory().openSession();

CommentMapper commentMapper = session.getMapper(CommentMapper.class);

List

comments = commentMapper.selectCommentsByBlog(6);

for (Comment comment : comments)

System.out.println(comment);

session.close();

}

public void testSelectOne() {

SqlSession session = Util.getSqlSessionFactory().openSession();

BlogMapper blogMapper = session.getMapper(BlogMapper.class);

Blog blog = blogMapper.selectBlog(6);

List

comments = blog.getComments();

if (comments != null) {

for (Comment comment : comments)

System.out.println(comment);

}

session.close();

}

MyBatis中关于resultType和resultMap的区别

MyBatis中resultType和resultMap的区别:
1、esultType是直接表示返回类型的(对应着我们的model对象中的实体)。
2、resultMap是对外部ResultMap的引用(提前定义了db和model之间的隐射key value关系)。
3、resultType跟resultMap不能同时存在。

cannot find result map

意思为没有找到返回类型resultMap的定义当查询得到的列名和pojo中定义的属性名不一致,则需要定义resultMap设置列名和属性名之间的映射关系。顾名思义,当我们定义了resultMap映射,查询标签中输出参数应该使用resultMap属性,当resultMap属性没有引用到定义的resultMap时,会出现这个问题。

mybatis中resultmap用法问题

难道#{id}不是在mapper里定义的嘛?
接口里写意的这个对应id="selectBlog" 的方法里会定义一个参数
resultMap="CommentResult"
对应

的ID

怎么放进去的 那是mybatis的事

你上边贴出来的那段配置应该是没有问题的配置吧?不知道是否已经实现你的目的:查询以后comment类中已经封装好blog类,如果上述配置可以实现此目的,应该是这样实现的association配置里指明了将来属性blog的封装要采用selectblog这句sql执行后的结果,所以实现了你想要的结果。如果上述配置达不到你要的结果,你可以这样配置:

在这里配置你blog类中的各个属性信息

这样配置后下边select语句这样配:

select * from t_Comment where id = #{id}

此时就不需要在配置selectBlog这条sql语句了,只需要这样就能达到你要的结果。

最后说明一下#{id},id是如何获得的。当你parameterType后面只传递一个参数时,并且该参数是基本数据类型,此时在sql语句的条件位置会自动取这个传过来的参数为值,#{id}并无多大的实际意义。当需要传递多个参数时,此时parameterType="map",此时取值就需要根据map中的key来取值了。

batis resultMap空值映射问题解决

【南京·10月17日】OSC源创会开始报名:Swift、大型移动项目构架分享 ?

Mybatis在使用resultMap来映射查询结果中的列,如果查询结果中包含空值的列(不是null),则Mybatis在映射的时候,不会映射这个字段,例如 查询 name,sex,age,数据库中的age字段没有值,Mybatis返回的map中只映射了 name和sex字段,而age字段则没有包含。

那么如何将age字段映射到map中呢。提供两种解决方法:

使用Mybatis config配置

创建configuration.xml

?

1

2

3

4

5

6

7

8



"http://mybatis.org/dtd/mybatis-3-config.dtd">

配置Mybatis的SqlSessionFactoryBean

?

1

2

3

4

5

6

<property name="mapperLocations"
value="classpath:/META-INF/spring/mybatis/modelMap/*.xml" />

在这种配置中,age将以null值映射到map中。

如果想要配置age的默认值,则可以建立一个类,实现Mybatis的TypeHandler接口

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

public class EmptyStringIfNull implements TypeHandler

{

@Override

public String getResult(ResultSet rs, String columnName) throws SQLException {

return (rs.getString(columnName) == null) ? "" : rs.getString(columnName);

}

@Override

public String getResult(ResultSet rs, int columnIndex) throws SQLException {

return (rs.getString(columnIndex) == null) ? "" : rs.getString(columnIndex);

}

@Override

public String getResult(CallableStatement cs, int columnIndex) throws SQLException {

return (cs.getString(columnIndex) == null) ? "" : cs.getString(columnIndex);

}

@Override

public void setParameter(PreparedStatement ps, int arg1, String str, JdbcType jdbcType)

继续在resultMap中使用,即可配置age的默认值(上述代码中age的默认值为"")

?

1

2

3

4

5

阅读更多 >>>  spring+mybatis,spring+mybatis实现事务的配置

网上有些资料中提到可以使用 defaultValue 和 nullValue的配置,但是这中配置是ibatis的用法,在Mybatis中已经移除。

参考链接http://stackoverflow.com/questions/22852383/how-to-change-valuenull-to-empty-string-from-query-when-using-mybatis

  使用现有的Service接口,或者自己在编写一些用到的接口,手动使用Java代码来分别调用Service接口来查出各个model,然后在业务层将model转换为vo,最后返回给前端json串。

为需求相关的页面定义自己的vo,在vo中只定义前端用到的字段。而不是像第一种方式一样vo中一层一层的嵌套model。然后使用sql语句进行表关联,查询用到的字段。组装为vo直接返回

SELECT account_id,sub_account_id,status,account_status,total_count,sms_sign FROM sub_account account_id=#{account_id} and sub_account_id = #{sub_account_id} and status=1 and total_count!=0 and account_status=1

mybatis里面对于VO类是怎么处理的,怎么写resultmap

  MyBatis关于resultTyperesultMap区别   MyBatis查询进行select映射候返类型用resultType用resultMapresultType直接表示返类型(应着我model象实体)resultMap则外部ResultMap引用(提前定义dbmodel间隐射key-->value关系)resultType跟resultMap能同存   MyBatis进行查询映射其实查询每属性都放应Map面其键属性名值则其应值   ①提供返类型属性resultTypeMyBatisMap面键值取赋给resultType所指定象应属性所其实MyBatis每查询映射返类型都ResultMap提供返类型属性resultType候MyBatis自给应值赋给resultType所指定象属性   ②提供返类型resultMapMap能表示领域模型需要自再进步转化应象复杂查询作用

mybatis 配置sql 当返回值为int的时候,resulttype怎么写

resultType="java.lang.Integer"
Integer如果一条都没有是会返回null的,所以不会报错,而用int的话没有会返回0
MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,但是resultType跟resultMap不能同时存在。
扩展资料:注意事项
一、若
查询语句中配置的是resultType=“实体类/DTO”,则从mybatis返回的键值对结果集(Map)会直接赋值给该DTO(根据set()/get()方法,因此该DTO属性名要与表字段名一致,若不一致,可再sql查询语句中用as更换查出来表字段名)中相映射的属性值,而与该mappper.xml文件配置
里的
无关。
二、若
查询语句中配置的是resultMap=“
中配置的
”,则从mybatis返回的键值对结果集(Map)会根据该
配置中(column-property)的相应属性赋值。

mybatis中resultMap嵌套查询如果使用的是其它xml中的语句应该怎么写

另外一个xml里的命名空间点getAccountBaseInfoById
如另外一个文件的命名空间是xxx,
<resultmap
id="result"

type="Account">

<association
property="accountBaseInfo"

column="accountId"

javaType="AccountBaseInfo"

select="xxx.getAccountBaseInfoById"/>

</association
</resultmap

java高级映射 mybatis 如何注解resultmap 一对多关系 一个公司映射多个部门

SELECT * FROM GONGSI G LEFT JOIN BUMEN B ON B.GONGSIID = G.ID WHERE G.ID = #{id}

ibatis 中关于resultMap= 在后台如何用map 接收的问题

其中 配置文件如下

<!--

-->

<!--
#username# ---向map获取键值为username的值
#password# -- 同上
resultClass="map" ——代表返回前台的数据封转为map格式,键值对应和你sql的列名对应,
但是要注意返回后台的是不是键值都是大写了。不同数据库返回的键可能有些都是大写的例如oracle,sqlserver 是sql中的列名
--><br> select username,password from user where username=#username# and password=#password#<br>
public Map getUserByNameAndPass(String username,String password){
//用map封转多个参数
Map params = new HashMap();
params.put("username",username);
params.put("password",password);
//如果定义命名空间的需要加前缀,第一个是你xml配置sql的id,第二个是map参数
Map map=sqlmap.queryForMap("getUserByNameAndPass", params);
System.err,println(map.get("password"));//获得password
//System.err,println(map.get("PASSWORD"));//有些数据库返回的是大写,例如oracle
System.err.println(map.get("username"));//获得username
//System.err,println(map.get("USERNAME"));//有些数据库返回的是大写,例如oracle
return map;
}
select * from user where username=? and password=?
==>
select * from user where username=#nm# and password=#pw#
Map map=sqlmap.queryForMap(arg0, arg1, arg2);
==>
Map mp = new HashMap();
mp.put("nm","ss");
mp.put("pw","mm");
Map map=sqlmap.queryForMap("getUserByNameAndPass", mp);

mybatis的查询必须指定resultType或者resultMap吗?

数组需要修改源码,不过也挺简单的。
必须指定resultType或者resultMap
可以,
resultMap="uobj"
在方法的返回类型定义成List

就可以了

网站数据信息

"resultmap,mybatis的查询必须指定resultType或者resultMap吗?"浏览人数已经达到15次,如你需要查询该站的相关权重信息,可以点击进入"Chinaz数据" 查询。更多网站价值评估因素如:resultmap,mybatis的查询必须指定resultType或者resultMap吗?的访问速度、搜索引擎收录以及索引量、用户体验等。 要评估一个站的价值,最主要还是需要根据您自身的需求,如网站IP、PV、跳出率等!