java.sql.SQLException: QueryRunner requires a DataSource to be invoked in this way, or a Connection

异常是酱紫的:

java.sql.SQLException: QueryRunner requires a DataSource to be invoked in this way, or a Connection should be passed in
	at org.apache.commons.dbutils.AbstractQueryRunner.prepareConnection(AbstractQueryRunner.java:315)
	at org.apache.commons.dbutils.QueryRunner.update(QueryRunner.java:495)
	at com.hanxiao.jdbc.util.TestUtils.TestInsert(TestUtils.java:19)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
	at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:89)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)

一般地,用java代码对数据库进行操作,需要先创建连接池,然后再进行查询
此处,问题在于,创建QueryRunner时,未将连接池传入QueryRunner
错误示例:

import org.apache.commons.dbutils.QueryRunner;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.junit.Test;
public class TestUtils {
@Test
public void TestInsert() throws SQLException {
	ComboPooledDataSource dataSource = new ComboPooledDataSource();
	QueryRunner queryRunner = new QueryRunner();	//此处未传入连接池
	......
	......
	......

正确示例:

import org.apache.commons.dbutils.QueryRunner;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.junit.Test;
public class TestUtils {
@Test
public void TestInsert() throws SQLException {
	ComboPooledDataSource dataSource = new ComboPooledDataSource();
	QueryRunner queryRunner = new QueryRunner(dataSource);		//此处传入连接池
	String sql = "select * from account where id=?";
	Account account = queryRunner.query(sql, new BeanHandler<Account>(Account.class), 10);	//传入Account泛型    //id=10
	System.out.println(account);
	}

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个错误提示意思是:QueryRunner需要以数据源的方式调用,或者需要传入一个连接对象。 简单来说,就是你在使用QueryRunner时,要么需要使用数据源来调用,要么需要手动传入一个连接对象。 ### 回答2: 该异常是Java中的SQL异常。它是由于没有提供数据源或连接而引起的。这种情况通常发生在使用Apache Commons DbUtils库中的QueryRunner类时。 QueryRunner类用于执行基于JDBC的数据库操作。它需要一个有效的数据源或连接来执行查询或更新操作。如果在调用QueryRunner方法时没有提供这些,就会引发上述异常。 解决这个问题的常用方法是提供一个有效的数据源或连接,这可以通过在代码中创建DataSource对象或使用连接池来实现。例如,如果使用连接池,则可以使用以下代码来获取连接并将其传递给QueryRunner: ``` DataSource ds = //create a DataSource object with the required configuration Connection conn = ds.getConnection(); QueryRunner runner = new QueryRunner(); //execute database operations using the QueryRunner object, passing the connection runner.query(conn, "SELECT * FROM table", handler); ``` 另一种解决方案是让QueryRunner自己管理连接。这可以通过在代码中使用QueryRunner的构造函数来实现。例如: ``` DataSource ds = //create a DataSource object with the required configuration QueryRunner runner = new QueryRunner(ds); //execute database operations using the QueryRunner object runner.query("SELECT * FROM table", handler); ``` 无论哪种方法,都需要提供一个有效的连接或数据源来避免上述异常。 ### 回答3: java.sql.sqlexceptionJavaSQL异常的一种,表示在执行SQL语句时发生了错误。而queryrunner则是Apache Commons DBUtils项目中的一个类,用于简化执行SQL查询和更新操作的代码。 当出现“queryrunner requires a datasource to be invoked in this way, or a connection should be passed in”时,意思是说在执行操作时,queryrunner需要一个数据源来调用,或者需要传递一个连接。 数据源是一个配置对象,用于管理应用程序与数据库之间的连接。如果没有指定数据源,queryrunner将无法知道如何获取连接信息,从而无法执行SQL语句。 解决这个问题的方法是在创建queryrunner对象时,传递一个数据源或连接作为参数。具体的实现步骤如下: 1. 使用数据源来创建连接 DataSource dataSource = new BasicDataSource(); ((BasicDataSource) dataSource).setUrl("jdbc:mysql://localhost:3306/test"); ((BasicDataSource) dataSource).setUsername("root"); ((BasicDataSource) dataSource).setPassword("password"); Connection connection = dataSource.getConnection(); 2. 将连接传递给queryrunner QueryRunner queryRunner = new QueryRunner(); queryRunner.query(connection, "SELECT * FROM user", new BeanHandler<>(User.class)); 通过这种方式,可以避免出现“queryrunner requires a datasource to be invoked in this way, or a connection should be passed in”的异常。如果仍然出现了异常,则需要检查连接信息是否正确,或者应该使用哪种类型的数据源来获取连接。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值