原文: http://zetcode.com/spring/beanpropertyrowmapper/

Spring BeanPropertyRowMapper教程展示了如何使用BeanPropertyRowMapper将表行转换为指定 Bean 类的新实例。

Spring 是用于创建企业应用的流行 Java 应用框架。

Spring BeanPropertyRowMapper

BeanPropertyRowMapperRowMapper执行该表的行转换成指定的映射的目标类的一个新实例。 映射的目标类必须是顶级类,并且必须具有默认或无参数构造器。

Spring BeanPropertyRowMapper示例

以下应用使用BeanPropertyRowMappercoutries表中读取所有行。 在示例中,我们使用 MySQL 数据库。

countries.sql

  1. CREATE TABLE countries(id INT PRIMARY KEY AUTO_INCREMENT,
  2. name VARCHAR(255), population INT);
  3. INSERT INTO countries(name, population) VALUES('China', 1382050000);
  4. INSERT INTO countries(name, population) VALUES('India', 1313210000);
  5. INSERT INTO countries(name, population) VALUES('USA', 324666000);
  6. INSERT INTO countries(name, population) VALUES('Indonesia', 260581000);
  7. INSERT INTO countries(name, population) VALUES('Brazil', 207221000);
  8. INSERT INTO countries(name, population) VALUES('Pakistan', 196626000);
  9. INSERT INTO countries(name, population) VALUES('Nigeria', 186988000);
  10. INSERT INTO countries(name, population) VALUES('Bangladesh', 162099000);
  11. INSERT INTO countries(name, population) VALUES('Nigeria', 186988000);
  12. INSERT INTO countries(name, population) VALUES('Russia', 146838000);
  13. INSERT INTO countries(name, population) VALUES('Japan', 126830000);
  14. INSERT INTO countries(name, population) VALUES('Mexico', 122273000);
  15. INSERT INTO countries(name, population) VALUES('Philippines', 103738000);

这是我们示例的一些测试数据。

  1. pom.xml
  2. src
  3. ├───main
  4. ├───java
  5. └───com
  6. └───zetcode
  7. Application.java
  8. ├───config
  9. DBConfig.java
  10. └───model
  11. Country.java
  12. └───resources
  13. db.properties
  14. logback.xml
  15. └───test
  16. └───java

这是项目结构。

pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
  5. http://maven.apache.org/xsd/maven-4.0.0.xsd">
  6. <modelVersion>4.0.0</modelVersion>
  7. <groupId>com.zetcode</groupId>
  8. <artifactId>springbeanpropertyrowmapperex</artifactId>
  9. <version>1.0-SNAPSHOT</version>
  10. <properties>
  11. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  12. <maven.compiler.source>11</maven.compiler.source>
  13. <maven.compiler.target>11</maven.compiler.target>
  14. <spring-version>5.1.3.RELEASE</spring-version>
  15. </properties>
  16. <dependencies>
  17. <dependency>
  18. <groupId>ch.qos.logback</groupId>
  19. <artifactId>logback-classic</artifactId>
  20. <version>1.2.3</version>
  21. </dependency>
  22. <dependency>
  23. <groupId>mysql</groupId>
  24. <artifactId>mysql-connector-java</artifactId>
  25. <version>5.1.47</version>
  26. </dependency>
  27. <dependency>
  28. <groupId>org.springframework</groupId>
  29. <artifactId>spring-context</artifactId>
  30. <version>${spring-version}</version>
  31. </dependency>
  32. <dependency>
  33. <groupId>org.springframework</groupId>
  34. <artifactId>spring-jdbc</artifactId>
  35. <version>${spring-version}</version>
  36. </dependency>
  37. <dependency>
  38. <groupId>org.springframework</groupId>
  39. <artifactId>spring-core</artifactId>
  40. <version>${spring-version}</version>
  41. </dependency>
  42. </dependencies>
  43. <build>
  44. <plugins>
  45. <plugin>
  46. <groupId>org.codehaus.mojo</groupId>
  47. <artifactId>exec-maven-plugin</artifactId>
  48. <version>1.6.0</version>
  49. <configuration>
  50. <mainClass>com.zetcode.Application</mainClass>
  51. </configuration>
  52. </plugin>
  53. </plugins>
  54. </build>
  55. </project>

pom.xml文件中,我们声明了基本的 Spring 依赖关系。 BeanPropertyRowMapperspring-jdbc的一部分。

resources/db.properties

  1. jdbc.driver=com.mysql.jdbc.Driver
  2. jdbc.url=jdbc:mysql://localhost:3306/mydb
  3. jdbc.username=user7
  4. jdbc.password=s$cret

我们在外部文件中具有基本的数据库属性。

resources/logback.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <configuration>
  3. <logger name="org.springframework" level="ERROR"/>
  4. <logger name="com.zetcode" level="INFO"/>
  5. <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
  6. <encoder>
  7. <Pattern>%d{HH:mm:ss.SSS} [%thread] %blue(%-5level) %magenta(%logger{36}) - %msg %n
  8. </Pattern>
  9. </encoder>
  10. </appender>
  11. <root>
  12. <level value="INFO" />
  13. <appender-ref ref="consoleAppender" />
  14. </root>
  15. </configuration>

logback.xml是 Logback 日志库的配置文件。

com/zetcode/model/Country.java

  1. package com.zetcode.model;
  2. import java.util.Objects;
  3. public class Country {
  4. private Long id;
  5. private String name;
  6. private int population;
  7. public Country() {
  8. }
  9. public Long getId() {
  10. return id;
  11. }
  12. public void setId(Long id) {
  13. this.id = id;
  14. }
  15. public String getName() {
  16. return name;
  17. }
  18. public void setName(String name) {
  19. this.name = name;
  20. }
  21. public int getPopulation() {
  22. return population;
  23. }
  24. public void setPopulation(int population) {
  25. this.population = population;
  26. }
  27. @Override
  28. public boolean equals(Object o) {
  29. if (this == o) return true;
  30. if (o == null || getClass() != o.getClass()) return false;
  31. Country country = (Country) o;
  32. return population == country.population &&
  33. Objects.equals(id, country.id) &&
  34. Objects.equals(name, country.name);
  35. }
  36. @Override
  37. public int hashCode() {
  38. return Objects.hash(id, name, population);
  39. }
  40. @Override
  41. public String toString() {
  42. final StringBuilder sb = new StringBuilder("Country{");
  43. sb.append("id=").append(id);
  44. sb.append(", name='").append(name).append('\'');
  45. sb.append(", population=").append(population);
  46. sb.append('}');
  47. return sb.toString();
  48. }
  49. }

这是Country bean。 它具有idnamepopulation属性。

com/zetcode/config/DBConfig.java

  1. package com.zetcode.config;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5. import org.springframework.context.annotation.PropertySource;
  6. import org.springframework.core.env.Environment;
  7. import org.springframework.jdbc.core.JdbcTemplate;
  8. import org.springframework.jdbc.datasource.DriverManagerDataSource;
  9. import javax.sql.DataSource;
  10. @Configuration
  11. @PropertySource(value="classpath:db.properties", ignoreResourceNotFound=true)
  12. public class DBConfig {
  13. @Autowired
  14. private Environment env;
  15. @Bean
  16. public DataSource dataSource() {
  17. var dataSource = new DriverManagerDataSource();
  18. dataSource.setDriverClassName(env.getProperty("jdbc.driver"));
  19. dataSource.setUrl(env.getProperty("jdbc.url"));
  20. dataSource.setUsername(env.getProperty("jdbc.username"));
  21. dataSource.setPassword(env.getProperty("jdbc.password"));
  22. return dataSource;
  23. }
  24. @Bean
  25. public JdbcTemplate jdbcTemplate() {
  26. var template = new JdbcTemplate();
  27. template.setDataSource(dataSource());
  28. return template;
  29. }
  30. }

DBConfig配置dataSourcejdbcTemplate bean。 它从db.properties文件读取配置数据。

com/zetcode/Application.java

  1. package com.zetcode;
  2. import com.zetcode.model.Country;
  3. import org.slf4j.Logger;
  4. import org.slf4j.LoggerFactory;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.context.annotation.AnnotationConfigApplicationContext;
  7. import org.springframework.context.annotation.ComponentScan;
  8. import org.springframework.jdbc.core.BeanPropertyRowMapper;
  9. import org.springframework.jdbc.core.JdbcTemplate;
  10. @ComponentScan("com.zetcode")
  11. public class Application {
  12. private static final Logger logger = LoggerFactory.getLogger(Application.class);
  13. public static void main(String[] args) {
  14. var ctx = new AnnotationConfigApplicationContext(Application.class);
  15. var app = ctx.getBean(Application.class);
  16. app.run();
  17. ctx.close();
  18. }
  19. @Autowired
  20. private JdbcTemplate jdbcTemplate;
  21. private void run() {
  22. var sql = "SELECT * FROM countries";
  23. var rowMapper = BeanPropertyRowMapper.newInstance(Country.class);
  24. var countries = jdbcTemplate.query(sql, rowMapper);
  25. countries.forEach(country -> logger.info("{}", country));
  26. }
  27. }

这是主要的应用类。

  1. var sql = "SELECT * FROM countries";

我们定义一个查询以从countries表中检索所有行。

  1. var rowMapper = BeanPropertyRowMapper.newInstance(Country.class);

我们为Country类创建BeanPropertyRowMapper的新实例。

  1. var countries = jdbcTemplate.query(sql, rowMapper);

JdbcTemplatequery()执行 SQL 查询。 由于BeanPropertyRowMapper,表列自动映射到 bean 属性。

  1. $ mvn -q exec:java
  2. 12:47:37.079 INFO com.zetcode.Application - Country{id=1, name='China', population=1382050000}
  3. 12:47:37.082 INFO com.zetcode.Application - Country{id=2, name='India', population=1313210000}
  4. 12:47:37.083 INFO com.zetcode.Application - Country{id=3, name='USA', population=324666000}
  5. 12:47:37.084 INFO com.zetcode.Application - Country{id=4, name='Indonesia', population=260581000}
  6. 12:47:37.084 INFO com.zetcode.Application - Country{id=5, name='Brazil', population=207221000}
  7. 12:47:37.085 INFO com.zetcode.Application - Country{id=6, name='Pakistan', population=196626000}
  8. 12:47:37.086 INFO com.zetcode.Application - Country{id=7, name='Nigeria', population=186988000}
  9. 12:47:37.087 INFO com.zetcode.Application - Country{id=8, name='Bangladesh', population=162099000}
  10. 12:47:37.088 INFO com.zetcode.Application - Country{id=9, name='Nigeria', population=186988000}
  11. 12:47:37.088 INFO com.zetcode.Application - Country{id=10, name='Russia', population=146838000}
  12. 12:47:37.089 INFO com.zetcode.Application - Country{id=11, name='Japan', population=126830000}
  13. 12:47:37.090 INFO com.zetcode.Application - Country{id=12, name='Mexico', population=122273000}
  14. 12:47:37.090 INFO com.zetcode.Application - Country{id=13, name='Philippines', population=103738000}

我们运行该应用。

在本教程中,我们使用BeanPropertyRowMapper将表行映射到 bean 属性。

您可能也对这些相关教程感兴趣:经典的 Spring 应用中的 JdbcTemplateSpring HikariCP 教程Java 教程,或列出了整个 Spring 教程