Java使用RowMapper将jdbc结果集Map到java对象

x33g5p2x  于2022-10-14 转载在 Java  
字(4.8k)|赞(0)|评价(0)|浏览(1347)

对象关系Map器允许您将较低级别的sql查询Map到java对象。虽然spring的JdbcTemplate不被视为ORM,但让我们看看如何将sql结果集Map到域对象。

介绍

JdbcTemplate是spring-jdbc中的一个核心类,它简化了处理资源管理(如关闭和创建连接)的数据访问调用。它是mybatis or ibatishibernate的轻量级替代品,特别是如果您已经在spring环境中工作的话。由于与较低级别的结果集相比,管理业务对象列表更容易,让我们了解如何将jdbc行Map到域对象。

入门

根据spring引导教程,我们将从spring initializr website设置并下载一个spring项目。选择数据将添加spring-boot-starter-jdbc工件。接下来,我们将在pom.xml中添加HyperSQL DataBase依赖项。正如在如何在spring教程中测试数据库中提到的那样,spring boot将识别类路径上的HSQLDB类,并自动配置嵌入式数据库。

  1. <dependency>
  2. <groupId>org.hsqldb</groupId>
  3. <artifactId>hsqldb</artifactId>
  4. <scope>runtime</scope>
  5. </dependency>

正在创建数据库设置

使用spring @Sql@SqlGroup注解,我们将调用一个脚本来创建STATE表,并预加载数据库表,插入三条记录。

  1. @RunWith(SpringJUnit4ClassRunner.class)
  2. @SpringApplicationConfiguration(classes = Application.class)
  3. @SqlGroup({
  4. @Sql(executionPhase = ExecutionPhase.BEFORE_TEST_METHOD,
  5. scripts = "classpath:beforeScripts.sql"),
  6. @Sql(executionPhase = ExecutionPhase.AFTER_TEST_METHOD,
  7. scripts = "classpath:afterScripts.sql") })
  8. public class ApplicationTests {
  9. private final static Logger LOGGER = Logger
  10. .getLogger(ApplicationTests.class);
  11. @Autowired JdbcTemplate jdbcTemplate;
  12. }
  1. CREATE TABLE STATE (STATEID INT PRIMARY KEY, ABBREVIATION VARCHAR(10) NOT NULL, POSTALCODE VARCHAR(2) NOT NULL, STATE VARCHAR(20) NOT NULL);
  2. INSERT INTO STATE VALUES(1, 'Ala', 'AL', 'Alabama');
  3. INSERT INTO STATE VALUES(2, 'Wis', 'WI', 'Wisconsin');
  4. INSERT INTO STATE VALUES(4, 'Hawaii', 'HI', 'Hawaii');
  5. DROP TABLE STATE;

正在创建域

为了Mapjdbc resultset,我们需要创建一个State对象,其中stateId属性是主键,abbreviation是状态,m1n是o1p,而state本身是一个字段。覆盖对象toString将在控制台中提供很好的输出。

  1. public class State {
  2. private int stateId;
  3. private String abbreviation;
  4. private String postalCode;
  5. private String state;
  6. //getters and setters omitted
  7. }

创建StateRowMapper

执行繁重工作的类是StateRowMapper,它实现了spring的RowMapper。它的主要职责是将结果集对象的每一行Map到State POJO对象。因为我们知道将在几个示例中重用它,所以我们创建了一个内部类,但在调用jdbcTemplate时可以用匿名内部类替换。

  1. public class StateRowMapper implements RowMapper<State> {
  2. @Override
  3. public State mapRow(ResultSet rs, int rowNum) throws SQLException {
  4. State state = new State();
  5. state.setStateId(rs.getInt("STATEID"));
  6. state.setAbbreviation(rs.getString("ABBREVIATION"));
  7. state.setPostalCode(rs.getString("POSTALCODE"));
  8. state.setState(rs.getString("STATE"));
  9. return state;
  10. }
  11. }

Map单个对象

要将单个结果行Map到java对象State,我们将调用传入sql以执行的jdbcTemplate.queryForObjectStateRowMapper。运行junit测试,输出显示sql已执行,State已记录。

  1. @Test
  2. public void query_for_one_state() {
  3. String sql = "SELECT * from STATE WHERE STATEID = " + 1;
  4. State state = jdbcTemplate.queryForObject(sql, new StateRowMapper());
  5. LOGGER.info(state);
  6. assertEquals("AL", state.getPostalCode());
  7. }

输出

  1. Executing SQL query [SELECT * from STATE WHERE STATEID = 1]
  2. 2015-02-08 07:11:01.510 DEBUG 44056 --- [ main] o.s.jdbc.datasource.DataSourceUtils : Fetching JDBC Connection from DataSource
  3. 2015-02-08 07:11:01.517 DEBUG 44056 --- [ main] o.s.jdbc.datasource.DataSourceUtils : Returning JDBC Connection to DataSource
  4. 2015-02-08 07:11:01.518 INFO 44056 --- [ main] com.levelup.ApplicationTests : State [stateId=1, abbreviation=Ala, postalCode=AL, state=Alabama]

Map对象列表

Map记录列表非常类似。不是使用jdbcTemplate.query调用jdbcTemplate.queryForObject,而是执行一个状态查询,该查询将返回表中的所有状态,然后它将通过StateRowMapper将每一行Map到State java对象。同样,运行单元测试将显示状态列表的大小为三。

  1. @Test
  2. public void query_for_list_states () {
  3. String sql = "SELECT * from STATE";
  4. List<State> states = jdbcTemplate.query(sql, new StateRowMapper());
  5. LOGGER.info(states);
  6. assertEquals(3, states.size());
  7. }

输出

  1. 2015-02-08 07:20:53.521 DEBUG 44303 --- [ main] o.s.jdbc.core.JdbcTemplate : Executing SQL query [SELECT * from STATE]
  2. 2015-02-08 07:20:53.522 DEBUG 44303 --- [ main] o.s.jdbc.datasource.DataSourceUtils : Fetching JDBC Connection from DataSource
  3. 2015-02-08 07:20:53.528 DEBUG 44303 --- [ main] o.s.jdbc.datasource.DataSourceUtils : Returning JDBC Connection to DataSource
  4. 2015-02-08 07:20:53.528 INFO 44303 --- [ main] com.levelup.ApplicationTests : [State [stateId=1, abbreviation=Ala, postalCode=AL, state=Alabama], State [stateId=2, abbreviation=Wis, postalCode=WI, state=Wisconsin], State [stateId=4, abbreviation=Hawaii, postalCode=HI, state=Hawaii]]
  5. 2015-02-08 07:20:53.528 DEBUG 44303 --- [ main] .s.t.c.j.SqlScriptsTestExecutionListener : Processing [[email protected] dataSource = '', transactionManager = '', transactionMode = INFERRED, encoding = '', separator = ';', commentPrefix = '--', blockCommentStartDelimiter = '/*', blockCommentEndDelimiter = '*/', errorMode = FAIL_ON_ERROR] for execution phase [AFTER_TEST_METHOD] and test context [[email protected] testClass = ApplicationTests, testInstance = [email protected], testMethod = [email protected], testException = [null], mergedContextConfiguration = [[email protected] testClass = ApplicationTests, locations = '{}', classes = '{class com.levelup.Application}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{}', contextLoader = 'org.springframework.boot.test.SpringApplicationContextLoader', parent = [null]]].

虽然本教程介绍了将ResultSet的行Map到java对象的基本知识,但还有很多很多。
感谢您加入今天的升级,祝您度过美好的一天!

github:View the source上提供了此页面上的所有代码

相关文章

最新文章

更多