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
|
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<!
DOCTYPE
configuration PUBLIC "-//mybatis.org//DTD SQL MAP Config 3.1//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<
configuration
>
<
settings
>
<
setting
name
=
"callSettersOnNulls"
value
=
"true"
/>
</
settings
>
</
configuration
>
|
配置Mybatis的SqlSessionFactoryBean
1
2
3
4
5
6
|
<
bean
id
=
"sqlSessionFactory"
class
=
"org.mybatis.spring.SqlSessionFactoryBean"
>
<
property
name
=
"dataSource"
ref
=
"dataSource"
/>
<
property
name
=
"configLocation"
value
=
"classpath:/META-INF/spring/configuration. xml"
/>
<
property
name
=
"mapperLocations"
value
=
"classpath:/META-INF/spring/mybatis/modelMap/*.xml"
/>
</
bean
>
|
在这种配置中,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<String> {
@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);
}
<span></span>
@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) <span></span><span style=
"font-size:9pt;line-height:1.5;"
>
throws
SQLException {</span><span style=
"font-size:9pt;line-height:1.5;"
> }</span><span style=
"font-size:9pt;line-height:1.5;"
>}</span>
|
继续在resultMap中使用,即可配置age的默认值(上述代码中age的默认值为"")
1
2
3
4
5
|
<
resultMap
id
=
"list"
type
=
"java.util.LinkedHashMap"
>
<
result
property
=
"name"
column
=
"name"
/>
<
result
property
=
"sex"
column
=
"sex"
/>
<
result
property
=
"age"
column
=
"age"
typeHandler
=
"com.demo.EmptyStringIfNull"
/>
</
resultMap
>
|
网上有些资料中提到可以使用 defaultValue 和 nullValue的配置,但是这中配置是ibatis的用法,在Mybatis中已经移除。