JavaSpring-RowMapperResultSet-Integer/null值
我有一个JavaSE8Spring4.1.6版本的应用程序,我在其中实现接口,我对在其方法中传递的接口有一些疑问 当我检查JavaSpring-RowMapperResultSet-Integer/null值,java,spring,jdbc,jdbctemplate,Java,Spring,Jdbc,Jdbctemplate,我有一个JavaSE8Spring4.1.6版本的应用程序,我在其中实现接口,我对在其方法中传递的接口有一些疑问 当我检查ResultSet类时,我看到了一系列方法来获取列值: ╔══════════════╦═════════════════════╦═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
ResultSet
类时,我看到了一系列方法来获取列值:
╔══════════════╦═════════════════════╦════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
║ Return Type ║ Method ║ Return (javadoc, se 8) ║
╠══════════════╬═════════════════════╬════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╣
║ String ║ getString ║ the column value; if the value is SQL NULL, the value returned is null ║
║ boolean ║ getBoolean ║ the column value; if the value is SQL NULL, the value returned is false ║
║ byte ║ getByte ║ the column value; if the value is SQL NULL, the value returned is 0 ║
║ short ║ getShort ║ the column value; if the value is SQL NULL, the value returned is 0 ║
║ int ║ getInt ║ the column value; if the value is SQL NULL, the value returned is 0 ║
║ long ║ getLong ║ the column value; if the value is SQL NULL, the value returned is 0 ║
║ float ║ getFloat ║ the column value; if the value is SQL NULL, the value returned is 0 ║
║ double ║ getDouble ║ the column value; if the value is SQL NULL, the value returned is 0 ║
║ BigDecimal ║ getBigDecimal ║ the column value; if the value is SQL NULL, the value returned is null ║
║ byte[] ║ getBytes ║ the column value; if the value is SQL NULL, the value returned is null ║
║ Date ║ getDate ║ the column value; if the value is SQL NULL, the value returned is null ║
║ Time ║ getTime ║ the column value; if the value is SQL NULL, the value returned is null ║
║ Timestamp ║ getTimestamp ║ the column value; if the value is SQL NULL, the value returned is null ║
║ InputStream ║ getAsciiStream ║ a Java input stream that delivers the database column value as a stream of one-byte ASCII characters; if the value is SQL NULL, the value returned is null ║
║ Reader ║ getCharacterStream ║ a java.io.Reader object that contains the column value; if the value is SQL NULL, the value returned is null in the Java programming language ║
║ InputStream ║ getBinaryStream ║ a Java input stream that delivers the database column value as a stream of uninterpreted bytes; if the value is SQL NULL, the value returned is null ║
║ <T> T ║ getObject ║ an instance of type holding the column value ║
╚══════════════╩═════════════════════╩════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
等等,对于所有的基本类型?对于sqlnull
的实例,其他一切都返回null
如果是这样,当类型化对象方法存在时,为不同类型提供所有方法有什么意义
此外,每种方法的优缺点是什么
getInt(字符串列标签)
:
getObject(字符串列标签,类类型)
:
Integer resultingActionId=rs.getObject(“RESULTING\u ACTION\u ID”,Integer.class)代码>
queryForLong
、queryForInt
等方法从单行查询中获取单个值,并将它们全部替换为键入的queryForObject
方法
谢谢 如果你看一下,你会发现你不需要这么明确。实际上,除非您有一个typeMapper for Your连接,它允许您使用getObject方法,否则它将无法工作()
我不知道这对你是否有帮助,但我设法找到了一个我自己的划船图,它非常适合我的需要
private class ShabaUserMapper implements RowMapper<ShabaUser>
{
@Override
public ShabaUser mapRow( ResultSet rs, int rowNum ) throws SQLException
{
Collection<SimpleGrantedAuthority> roles = new ArrayList<SimpleGrantedAuthority>();
String auths = rs.getString( "role" );
roles.add( new SimpleGrantedAuthority( auths ) );
ShabaUser user = new ShabaUser( rs.getString( "username" ), rs.getString( "password" ),
rs.getBoolean( "enabled" ), rs.getString( "first_name" ),
rs.getString( "last_name" ), rs.getString( "email" ),
rs.getString( "date_joined" ), rs.getString( "last_online" ), true, true, true,
roles );
// Can be null!
Integer awesomeness = rs.getInt( "awesomeness" );
if ( rs.wasNull() )
{
awesomeness = null;
}
user.setAwesomeness( awesomeness );
return user;
}
}
private class ShabaUserListExtractor implements ResultSetExtractor<List<ShabaUser>>
{
private final ShabaUserMapper rowMapper;
private int rowsExpected;
public ShabaUserListExtractor()
{
this( new ShabaUserMapper(), 0 );
}
public ShabaUserListExtractor( ShabaUserMapper rowMapper, int rowsExpected )
{
Assert.notNull( rowMapper, "RowMapper is required" );
this.rowMapper = rowMapper;
this.rowsExpected = rowsExpected;
}
@Override
public List<ShabaUser> extractData( ResultSet rs ) throws SQLException
{
HashMap<String, ShabaUser> results = ( this.rowsExpected > 0
? new HashMap<String, ShabaUser>(
rowsExpected )
: new HashMap<String, ShabaUser>() );
int rowNum = 0;
while ( rs.next() )
{
ShabaUser user = rowMapper.mapRow( rs, rowNum++ );
if ( results.containsKey( user.getUsername() ) )
{
ShabaUser inUser = results.get( user.getUsername() );
ArrayList<GrantedAuthority> combinedAuthorities = new ArrayList<GrantedAuthority>();
combinedAuthorities.addAll( inUser.getAuthorities() );
combinedAuthorities.addAll( user.getAuthorities() );
results.put( user.getUsername(),
createUserDetails( user.getUsername(), user, combinedAuthorities ) );
} else
{
results.put( user.getUsername(), user );
}
}
return new ArrayList<ShabaUser>( results.values() );
}
}
私有类ShabaUserMapper实现行映射器
{
@凌驾
public ShabaUser映射行(ResultSet rs,int rowNum)抛出SQLException
{
集合角色=新的ArrayList();
字符串auths=rs.getString(“角色”);
添加(新的SimpleGrantedAuthority(auths));
ShabaUser user=新的ShabaUser(rs.getString(“用户名”)、rs.getString(“密码”),
rs.getBoolean(“已启用”)、rs.getString(“第一个名称”),
rs.getString(“姓氏”)、rs.getString(“电子邮件”),
rs.getString(“加入日期”)、rs.getString(“上次在线”)、true、true、true、,
角色);
//可以为空!
整数awesomeness=rs.getInt(“awesomeness”);
如果(rs.wasNull())
{
惊人=零;
}
user.setAwesomeness(awesomeness);
返回用户;
}
}
私有类ShabaUserListExtractor实现ResultsTextRactor
{
私人最终Shabauermapper rowMapper;
私家侦探;
公共ShabaUserListExtractor()
{
这个(新的ShabaUserMapper(),0);
}
公共ShabaUserListExtractor(ShabaUserMapper rowMapper,内行预期)
{
notNull(行映射器,“需要行映射器”);
this.rowMapper=rowMapper;
this.rowsExpected=rowsExpected;
}
@凌驾
公共列表提取数据(结果集rs)引发SQLException
{
HashMap结果=(this.rowsExpected>0
?新哈希映射(
行(预期)
:newhashmap());
int rowNum=0;
while(rs.next())
{
ShabaUser=rowMapper.mapRow(rs,rowNum++);
if(results.containsKey(user.getUsername()))
{
ShabaUser inUser=results.get(user.getUsername());
ArrayList combinedAuthorities=新的ArrayList();
combinedAuthorities.addAll(inUser.getAuthorities());
combinedAuthorities.addAll(user.getAuthorities());
results.put(user.getUsername(),
createUserDetails(user.getUsername(),user,combinedAuthorities));
}否则
{
results.put(user.getUsername(),user);
}
}
返回新的ArrayList(results.values());
}
}
我知道这是很多代码,但希望您能看到这里完成了什么。实际的RowMapper实现实际上是为了容纳从行信息中提取对象的所有“脏活”
只要数据库设置正确,并且使其在必需列上不为NULL,就永远不会遇到提取空行的问题。尽管我认为检查结果集中是否有空响应不会有什么坏处,但如果该列的值为,那么最终还是会抛出异常。TLDR
- 如果不允许使用
或只关心返回原语(无对象、装箱或数组类型),请使用SQL NULL
resultSet.getXXX(String columnLabel)
- 如果值可以是
,请使用SQL NULL
,但如果类型是装箱类型,请不要取消装箱,例如resultSet.getObject(String columnLabel,Class type)
,因为原语不能是Integer
NULL
- 如果您运行的是Java6,请将
与强制转换一起使用resultSet.getObject(String columnLabel)
SQL NULL
,或者您的代码严格需要或需要一个基元,即无对象类型(这包括装箱类型,例如整数
,例如字节[]
),则使用特定的get方法:
//如果值为SQL NULL,则整数为0
inti=resultSet.getInt(列);
//这很好,但整数永远不会为空。这可能不是你想要的
整数j=resultSet.getInt(列);
据我所知,使用此方法的原因是方便,因为它可以优雅地处理SQL NULL
,其中必须有一个原语,例如,对于int
返回0
如果列允许sqlnull
,或者代码需要对象类型(包括装箱类型或数组),则使用Integer resultingActionId = rs.getInt("RESULTING_ACTION_ID");
if (rs.wasNull) {
resultingActionId = null
}
Integer resultingActionId = (Integer) rs.getObject("RESULTING_ACTION_ID");
Integer resultingActionId = rs.getObject("RESULTING_ACTION_ID", Integer.class);
private class ShabaUserMapper implements RowMapper<ShabaUser>
{
@Override
public ShabaUser mapRow( ResultSet rs, int rowNum ) throws SQLException
{
Collection<SimpleGrantedAuthority> roles = new ArrayList<SimpleGrantedAuthority>();
String auths = rs.getString( "role" );
roles.add( new SimpleGrantedAuthority( auths ) );
ShabaUser user = new ShabaUser( rs.getString( "username" ), rs.getString( "password" ),
rs.getBoolean( "enabled" ), rs.getString( "first_name" ),
rs.getString( "last_name" ), rs.getString( "email" ),
rs.getString( "date_joined" ), rs.getString( "last_online" ), true, true, true,
roles );
// Can be null!
Integer awesomeness = rs.getInt( "awesomeness" );
if ( rs.wasNull() )
{
awesomeness = null;
}
user.setAwesomeness( awesomeness );
return user;
}
}
private class ShabaUserListExtractor implements ResultSetExtractor<List<ShabaUser>>
{
private final ShabaUserMapper rowMapper;
private int rowsExpected;
public ShabaUserListExtractor()
{
this( new ShabaUserMapper(), 0 );
}
public ShabaUserListExtractor( ShabaUserMapper rowMapper, int rowsExpected )
{
Assert.notNull( rowMapper, "RowMapper is required" );
this.rowMapper = rowMapper;
this.rowsExpected = rowsExpected;
}
@Override
public List<ShabaUser> extractData( ResultSet rs ) throws SQLException
{
HashMap<String, ShabaUser> results = ( this.rowsExpected > 0
? new HashMap<String, ShabaUser>(
rowsExpected )
: new HashMap<String, ShabaUser>() );
int rowNum = 0;
while ( rs.next() )
{
ShabaUser user = rowMapper.mapRow( rs, rowNum++ );
if ( results.containsKey( user.getUsername() ) )
{
ShabaUser inUser = results.get( user.getUsername() );
ArrayList<GrantedAuthority> combinedAuthorities = new ArrayList<GrantedAuthority>();
combinedAuthorities.addAll( inUser.getAuthorities() );
combinedAuthorities.addAll( user.getAuthorities() );
results.put( user.getUsername(),
createUserDetails( user.getUsername(), user, combinedAuthorities ) );
} else
{
results.put( user.getUsername(), user );
}
}
return new ArrayList<ShabaUser>( results.values() );
}
}