在连接池中使用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,从而造成属性值写入失败。