连接池中,User对象setter方法中return this对程序的影响

在连接池中使用DBUtils对数据库中的表格进行查询调用操作的时候,创建了User类,利用快捷键一键生成getter、setter方法。代码如下:

1.下面我定义的User类

    public class User  implements Serializable{
    private int id ;
    private String username;
    private String password;
    private String nickname;

    public User() {
    }

    public User(int id, String username, String password, String nickname) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.nickname = nickname;
    }

    public int getId() {
        return id;
    }

    public User setId(int id) {
        this.id = id;
        return this;
    }

    public String getUsername() {
        return username;
    }

    public User setUsername(String username) {
        this.username = username;
        return this;
    }

    public String getPassword() {
        return password;
    }

    public User setPassword(String password) {
        this.password = password;
        return this;
    }

    public String getNickname() {
        return nickname;
    }

    public User setNickname(String nickname) {
        this.nickname = nickname;
        return this;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", nickname='" + nickname + '\'' +
                '}';
            }
    }

2.下面是创建的C3P0Utils工具包

    public class C3P0Utils {
    //1.创建连接池
    private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
    public static ComboPooledDataSource getDataSource(){
        return dataSource;
    }

    public static Connection getConnection() throws Exception{
        //2.创建连接(C3P0不需要设置参数,自动读取)
        Connection connection = dataSource.getConnection();
        return connection;
    }
    public static void release(Connection connection, Statement statement, ResultSet resultSet){
        if(connection !=null){
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(statement !=null){
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(resultSet !=null){
            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    }

3.下面是C3P0工具包的xml文件

<c3p0-config>
    <default-config>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/day21_1</property>
        <property name="user">root</property>
        <property name="password">root</property>
        <property name="initialPoolSize">5</property>
    </default-config>
</c3p0-config>

4.下面是 主体语句

@Test
    public void select()throws  Exception{
        //创建连接
        QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
        String sql ="select * from users ";
        //将查询的内容放进list集合中
        List<User> list = qr.query(sql, new BeanListHandler<User>(User.class));
        //遍历打印集合数据
        for (User user : list) {
            System.out.println(user);
        }
    }

5.下面是执行结果

8月 05, 2020 3:36:18 下午 com.mchange.v2.log.MLog <clinit>
信息: MLog clients using java 1.4+ standard logging.
8月 05, 2020 3:36:19 下午 com.mchange.v2.c3p0.C3P0Registry banner
信息: Initializing c3p0-0.9.1.2 [built 21-May-2007 15:04:56; debug? true; trace: 10]
8月 05, 2020 3:36:19 下午 com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource getPoolManager
信息: Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, dataSourceName -> 31sqhtab1glcu2xlxxjj4|ef9296d, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> com.mysql.jdbc.Driver, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> 31sqhtab1glcu2xlxxjj4|ef9296d, idleConnectionTestPeriod -> 0, initialPoolSize -> 5, jdbcUrl -> jdbc:mysql://localhost:3306/day21_1, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 0, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 15, maxStatements -> 0, maxStatementsPerConnection -> 0, minPoolSize -> 3, numHelperThreads -> 3, numThreadsAwaitingCheckoutDefaultUser -> 0, preferredTestQuery -> null, properties -> {password=******, user=******}, propertyCycle -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, usesTraditionalReflectiveProxies -> false ]
User{id=0, username='null', password='null', nickname='null'}
User{id=0, username='null', password='null', nickname='null'}
User{id=0, username='null', password='null', nickname='null'}
User{id=0, username='null', password='null', nickname='null'}

问题:在连接池中,创建了连接,用query方法对数据库的数据进行了查询调用,就是DBUtils底层中不知道是如何实现调用的。在User类中setter方法有return this语句的时候,执行结果就为默认值0或者null。然后将setter方法中return this 语句删除后,一切打印正常。

retrun this 时setter方法返回值不是void的了

属性值写入是调用类的对应属性的WriteMethod方式,而java底层获取属性WriteMethod必须是void,否则会获取失败。
带了return就不能为void,从而造成属性值写入失败。