Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaSpring-RowMapperResultSet-Integer/null值_Java_Spring_Jdbc_Jdbctemplate - Fatal编程技术网

JavaSpring-RowMapperResultSet-Integer/null值

JavaSpring-RowMapperResultSet-Integer/null值,java,spring,jdbc,jdbctemplate,Java,Spring,Jdbc,Jdbctemplate,我有一个JavaSE8Spring4.1.6版本的应用程序,我在其中实现接口,我对在其方法中传递的接口有一些疑问 当我检查ResultSet类时,我看到了一系列方法来获取列值: ╔══════════════╦═════════════════════╦═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════

我有一个JavaSE8Spring4.1.6版本的应用程序,我在其中实现接口,我对在其方法中传递的接口有一些疑问

当我检查
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() );
        }
    }