标签: spring-jdbc

使用JdbcTemplate进行分页查询

我目前正在开发一个迁移项目,将数据从旧数据库迁移到新数据库(请不要问我为什么要通过Java应用程序,这是客户需要的).

有一些初始代码我现在正在更新.我正在改变的一件事是使用Spring JdbcTemplate而不是那里的锅炉板代码.

不幸的是,我还没有找到一种方法来执行分页查询JdbcTemplate,类似于旧代码:

Statement statement = getConnection().createStatement(
    ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
statement.setFetchDirection(ResultSet.FETCH_FORWARD);
statement.setFetchSize(1000);
return statement.executeQuery();
Run Code Online (Sandbox Code Playgroud)

getConnection()只返回一个Connection对象,以纯JDBC代码中创建(它不是一部分SessionFactory或框架实现).

然后我将遍历结果集,一次映射一行.有谁知道是否有一种简单的方法来实现相同的功能JdbcTemplate

TIA

java spring spring-jdbc jdbctemplate

7
推荐指数
1
解决办法
7763
查看次数

SimpleJdbcCall不能调用多个过程

SimpleJdbcCall 不能调用多个程序

这是我的测试代码:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;


public class TestCall {

    public static void main(String[] args) {

        ApplicationContext context = new ClassPathXmlApplicationContext(
                new String[] { "spring/applicationContext.xml",
                        "spring/applicationDb.xml" });

        SimpleJdbcCall call = context.getBean("simpleJdbcCall",
                SimpleJdbcCall.class);

        call.withProcedureName("proc1").execute("p1", "p2");

        System.out.println("CallString: " + call.getCallString());

        call.withProcedureName("proc2").execute("p1");

        System.out.println("CallString: " + call.getCallString());

    }
}
Run Code Online (Sandbox Code Playgroud)

在代码中,我定义了 simpleJdbcCall

<bean id="simpleJdbcCall" class="org.springframework.jdbc.core.simple.SimpleJdbcCall" >
    <constructor-arg ref="dataSource" />
</bean>
Run Code Online (Sandbox Code Playgroud)

并且程序proc1接收2个参数,并且程序proc2接收1个参数.

当我运行它时,发生异常.

然后我调试并发现它AbstractJdbcCall.callString仍然是CallString:{call proc1(?, ?)} 当调用时proc2.

那么,这是一个Spring的错误吗?

有没有人告诉我如何联系作者Thomas Risberg?

java spring jdbc spring-jdbc

7
推荐指数
1
解决办法
6276
查看次数

Spring NamedParameterJDBCTemplate重用Prepared Statements

我使用Spring NamedParameterJdbcTemplate从表中获取一些值.出于某种原因,查询在我的Java应用程序中运行速度非常慢,而不是在SQL Management Studio上运行相同的查询.我也注意到在分析器中,准备好的语句不会被重用.如果我多次在我的JAVA应用程序中运行相同的查询,我会看到正在执行的不同预处理语句.因此,不确定为什么语句不会被重用.性能是否因为我在查询中使用IN子句而变慢?

这是我的示例java代码

StringBuilder vQuery = new StringBuilder();
vQuery.append(" SELECT SUM(Qty) FROM vDemand");
vQuery.append(" WHERE ProductID = :ProductID");
vQuery.append(" AND [Date] >= :StartDate AND [Date] <= :EndDate");
vQuery.append(" AND CustomerID IN ( :CustomerID )");

MapSqlParameterSource vNamedParameters = new MapSqlParameterSource();
vNamedParameters.addValue("ProductID", aProductID);
vNamedParameters.addValue("CustomerID", aCustomerlIDs);
vNamedParameters.addValue("StartDate", aDate, Types.TIMESTAMP);
vNamedParameters.addValue("EndDate", aDate, Types.TIMESTAMP);

int vTotalQuantity = this.getNamedParameterJdbcTemplate().queryForInt(vQuery.toString(), vNamedParameters);
return vTotalQuantity;
Run Code Online (Sandbox Code Playgroud)

java spring jdbc spring-jdbc jdbctemplate

7
推荐指数
1
解决办法
7975
查看次数

JdbcTemplate多个结果集

我试图找到一种简单的方法来处理Stored Procedures/SQL返回多个结果集.我一直在使用该SimpleJdbcOperations#queryForList()方法,但这只会返回第一个结果集作为a List<Map<String, Object>>.我需要能够得到多个结果集,理想状态为CollectionList<Map<String, Object>>什么的.我正在编写的程序是一个中间件组件,所以我不知道SQL将是什么,或结果集的形式.

我想我必须使用这个JdbcOperations让我可以访问更多方法的类,包括 execute(CallableStatementCreator csc, CallableStatementCallback<T> action)但现在我被卡住了.

    CallableStatementCallback<T> callback = new CallableStatementCallback<T>() {
       @Override
       public T doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException
       {
           boolean results = cs.execute(request);
           while(results)
           {
               ResultSet result = cs.getResultSet();
               results = cs.getMoreResults();
           }
           return null;
        }
};
Run Code Online (Sandbox Code Playgroud)

我不确定如何使用该方法,或者如何处理ResultSet以获取我的通用List<Map<String, Object>>s.

java jdbc spring-jdbc

7
推荐指数
1
解决办法
1万
查看次数

我应该抓住EmptyResultDataAccessException吗?

我有一个SQL语句,我希望将返回一行,因为我传递的是主键.所以我的选择是

  1. tryForObject包装在try/catch中,捕获EmptyResultDataAccessException,并返回null
  2. 将调用更改为queryForList,并打开List并(希望)返回第1个元素,或者为null.

我在某处读取了一个EmptyResultDataAccessException,因为它扩展了运行时异常,这是一个不好的做法.

但我看不出有什么不妥.

我有兴趣听取意见

java spring spring-jdbc

7
推荐指数
1
解决办法
9430
查看次数

验证spring JDBC批量更新是否成功

我使用Spring JDBCTemplate batchUpdate批量插入数据.我想验证数据是否已成功插入.JDBCTemplate batchUpdate返回一个int [] [],这是验证数据是否插入的正确方法?

链接显示 "所有批处理更新方法返回一个int数组,其中包含每个批处理条目的受影响的行数.此计数由JDBC驱动程序报告,并且它并不总是可用,在这种情况下JDBC驱动程序只返回-2值".我无法理解在这里返回-2值的重要性.这是否意味着插入不成功?

java jdbc spring-jdbc batch-updates

7
推荐指数
1
解决办法
9395
查看次数

Spring RowMapper接口究竟如何工作?

我正在学习Spring Core认证,我对Spring如何处理JDBC查询有些怀疑:

所以我知道我可以通过各种方式从我的数据库表中获取数据,具体取决于我希望获得的数据类型:

1)查询简单类型(作为int,long或String):我使用jdbcTemplate类的queryForObject()方法,类似于:

String sql = "SELECT count(*) FROM T_REWARD";
int rowsNumber = jdbcTemplate.queryForObject(sql, Integer.class);
Run Code Online (Sandbox Code Playgroud)

因此,为了获得一个简单的对象作为int值,我使用queryForObject()方法向它传递sql stattment和我期望在该方法的输出中接收的对象类型.

好的,这很简单,我认为没问题.

2)查询放入Map对象的整个表行:所以如果我不需要单个值(可能是某个表的特定行的单个列或类似于preovious示例的东西),我可以使用queryForMap( ..)queryForList()方法,以这种方式:

2.1)queryForMap():我使用它,如果我期望将单个行放入单个Map对象中,其中每个列值都映射到我的Map中,如下所示:

String sql = "select * from T_REWARD where CONFIRMATION_NUMBER = ?";
Map<String, Object> values = jdbcTemplate.queryForMap(sql,confirmation.getConfirmationNumber());
Run Code Online (Sandbox Code Playgroud)

2.2)queryForList():如果我希望有更多行作为我的查询输出,我会使用它.因此,我将获得一个Map对象列表,其中每个Map对象代表查询输出的特定行.喜欢它的东西:

String sql = “select * from PERSON”;
return jdbcTemplate.queryForList(sql);
Run Code Online (Sandbox Code Playgroud)

我认为这也很清楚.

然后我可以使用JdbcTemplate 将ResultSet …

java spring spring-jdbc jdbctemplate

7
推荐指数
1
解决办法
3万
查看次数

何时在namedParameterJdbcTemplate中使用Map和SqlParameterSource?

String SQL = "INSERT INTO Employee (name, age, salary) VALUES (:name,:age,:salary)";
Map namedParameters = new HashMap();   
namedParameters.put("name", name);   
namedParameters.put("age", age);
namedParameters.put("salary", salary);
namedParameterJdbcTemplate.update(SQL, namedParameters);

String SQL = "UPDATE Employee SET age = :age WHERE empid = :empid";
SqlParameterSource namedParameters = new MapSqlParameterSource();
namedParameters.addValue("age", age);
namedParameters.addValue("empid", empid);
namedParameterJdbcTemplate.update(SQL, namedParameters);
Run Code Online (Sandbox Code Playgroud)

似乎Map和SqlParameterSource都是相同的。但是,为什么API开发人员添加了这些API?有没有使用Map或SqlParameterSource的特定方案,可以使执行速度更快?请给我解释清楚。提前致谢。

spring-jdbc

7
推荐指数
2
解决办法
6983
查看次数

如何使用 H2 嵌入式数据库获取序列中的下一个值?

背景

我使用 Oralce 作为数据库,使用 H2 Embedded 内存数据库进行集成测试。

我在 H2 中创建了一些表并能够获取一些插入的数据。但是,我无法检索我在 H2 中创建的序列的当前序列值。

我知道 Oracle 和 H2 不一样,并且使用相似但不同的语法。我还知道您可以在 H2 内存数据库中定义一些别名并嵌入 java 代码来代替 Oracle SQL 函数。这给了我一个提示,即必须有一个解决方法,可以通过 H2 数据库使用 Oracle 语法检索序列值。

问题

如何使 Oracle 选择序列当前值的语法适用于 H2?我是否需要创建别名并编写嵌入式 java 代码来代替 Oracle 语法?我有什么选择?

被测代码使用以下假设但类似的 SQL

select myschema.mysequence.nextval from dual
Run Code Online (Sandbox Code Playgroud)

但我收到如下错误

org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "nextval" not found [42122-199]
Run Code Online (Sandbox Code Playgroud)

由于语法的差异,很明显这是行不通的。我正在寻找一种解决方法,而无需更改使用 Oracle 语法的正在测试的代码。

更新

我正在使用 Spring JDBC 的 EmbeddedDatabaseBuilder,这意味着我不会连接到单独的独立 H2 数据库实例,而是连接到动态创建的实例,其中包含 DDL 脚本来创建 DB 对象。

以下帖子以及已接受的答案帮助解决了这个问题。

Spring嵌入式数据库支持不同的SQL方言吗?

java integration-testing h2 spring-jdbc

7
推荐指数
1
解决办法
2万
查看次数

R2DBC、Spring Jdbc、Spring Data JDBC?

关于使用 Spring JDBC,它工作得非常好,并且在使用批处理时比 JPA 有一些改进。

我很想了解当您已经拥有Spring Data JDBC 时为什么要使用 Spring Data JDBC

我很想了解当您已经拥有Spring JDBC时为什么要使用R2DBC

spring spring-jdbc spring-data-jdbc r2dbc

7
推荐指数
2
解决办法
8117
查看次数