java - BeanPropertyRowMapper 在 spring 内部是如何工作的?

标签 java database spring spring-mvc jakarta-ee

我知道 BeanPropertyRowmapper 在我触发 select 查询时使用 setter 方法但是它是否使用 getter 方法 ?

我面临以下问题:

database 中,defaultPriority 在 string 中,但我想在我的 SMSAction pojo 类中设置 int 值.

class SMSAction implements Serializable {

private int defaultPriority;

public int getDefaultPriority() {
    System.out.println("Inside getDefaultPriority()");
    return defaultPriority;
}

public void setDefaultPriority(String defaultPriority) {
    System.out.println("Inside setDefaultPriority(String defaultPriority)"+defaultPriority);

    if(defaultPriority.equalsIgnoreCase("L")){
        System.out.println("Condition");
        this.defaultPriority = 1;
    }
  }
}    

这是我遇到的错误:

Exception in thread "main" org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL [select SMSACTIONID,SMSACTIONCODE,ACTIONDESC,CASID,DEFAULTPRIORITY from tblsmsaction]; SQL state [99999]; error code [17059]; Fail to convert to internal representation; nested exception is java.sql.SQLException: Fail to convert to internal representation
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:84)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:660)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:695)

当数据库和我的 pojo 中的数据类型不同时,如何解决上述问题? 当我将 return type of getDefaultPriority() 更改为 String 时,它的工作正常但我无法理解这就是为什么 BeanPropertyRowMapper 使用 getDefaultPrioriy() 以及我的 log 打印在 getDefaultPriority() 中的原因显示

注意:我不想制作我的自定义行映射器或 hibernate 或 JPA。 请帮助我。

最佳答案

在我看来,您做错了(不是很)错。您有一些规则设置模板中的内容(阅读class)。 Setters/Getters 应该非常整洁;事实上,你需要存储一个 int 但你正在应用一些规则来弄清楚 int 值与你设置/获取的方式无关bean 中的特定值。

每当您从数据库中获取 String 值时,应用规则并调用 setter:

// [db layer] here you already got the real value(s) through a database call
SMSAction action = new SMSAction();

// priority is some arbitrary name I used to simulate the variable that holds the String coming from the database
if (priority.equalsIgnoreCase("L")) {
  action.setDefaultPriority(1);
}
// ...

现在,有些人更喜欢另一层的那种业务规则,但那是另一回事了;正如您所看到的,在 DTO/包装器对象或类似对象中将值从一层传输到另一层很容易。

祝你好运!

关于java - BeanPropertyRowMapper 在 spring 内部是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28060240/

相关文章:

java - 如何使用Spring Batch连接服务器?

java - 使用 GObject 方法时从 Hashtable 获取 NullPointerException

database - 甲骨文假直方图

spring - 在 Websphere 上使用 Aspectj

Java ServiceImpl 方法不断返回 null

java - Spring Boot 自动配置无法与 spring-data-jpa 一起正常工作

java - 服务定位器与依赖注入(inject)

java - 我可以在不切换到显式迭代器的情况下处理 for-each 循环中的异常吗?

mysql - LOAD DATA INFILE - 以字符终止的字段,该字符也出现在字段中

php - 我如何搜索(在数据库行中)