1。 pom 导入测试要用到的包
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-library</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.github.springtestdbunit</groupId> <artifactId>spring-test-dbunit</artifactId> <version>1.1.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.dbunit</groupId> <artifactId>dbunit</artifactId> <version>2.5.0</version> <scope>test</scope> <exclusions> <exclusion> <artifactId>junit</artifactId> <groupId>junit</groupId> </exclusion> </exclusions> </dependency>
2. spring data for JPA 数据库配置代码
@Configuration @EnableTransactionManagement @EnableJpaRepositories(basePackages = "com.eifesun.monitor.db.repository") @PropertySource("classpath:application.properties") @EnableJpaAuditing public class PersistenceContext { protected static final String PROPERTY_NAME_DATABASE_DRIVER = "db.driver"; protected static final String PROPERTY_NAME_DATABASE_PASSWORD = "db.password"; protected static final String PROPERTY_NAME_DATABASE_URL = "db.url"; protected static final String PROPERTY_NAME_DATABASE_USERNAME = "db.username"; private static final String PROPERTY_NAME_HIBERNATE_DIALECT = "hibernate.dialect"; private static final String PROPERTY_NAME_HIBERNATE_FORMAT_SQL = "hibernate.format_sql"; private static final String PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO = "hibernate.hbm2ddl.auto"; private static final String PROPERTY_NAME_HIBERNATE_NAMING_STRATEGY = "hibernate.ejb.naming_strategy"; private static final String PROPERTY_NAME_HIBERNATE_SHOW_SQL = "hibernate.show_sql"; private static final String PROPERTY_PACKAGES_TO_SCAN = "com.eifesun.monitor.db.jpa"; private static final String CONVERT_PACKAGES_TO_SCAN = "org.springframework.data.jpa.convert.threeten"; @Autowired private Environment environment; @Bean public DataSource dataSource() { HikariConfig dataSourceConfig = new HikariConfig(); dataSourceConfig.setDriverClassName(environment.getRequiredProperty(PROPERTY_NAME_DATABASE_DRIVER)); dataSourceConfig.setJdbcUrl(environment.getRequiredProperty(PROPERTY_NAME_DATABASE_URL)); dataSourceConfig.setUsername(environment.getRequiredProperty(PROPERTY_NAME_DATABASE_USERNAME)); dataSourceConfig.setPassword(environment.getRequiredProperty(PROPERTY_NAME_DATABASE_PASSWORD)); return new HikariDataSource(dataSourceConfig); } @Bean public JpaTransactionManager transactionManager() { JpaTransactionManager transactionManager = new JpaTransactionManager(); transactionManager.setEntityManagerFactory(entityManagerFactory().getObject()); return transactionManager; } @Bean public LocalContainerEntityManagerFactoryBean entityManagerFactory() { LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean(); entityManagerFactoryBean.setDataSource(dataSource()); entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); entityManagerFactoryBean.setPackagesToScan(PROPERTY_PACKAGES_TO_SCAN, CONVERT_PACKAGES_TO_SCAN); Properties jpaProperties = new Properties(); jpaProperties.put(PROPERTY_NAME_HIBERNATE_DIALECT, environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_DIALECT)); jpaProperties.put(PROPERTY_NAME_HIBERNATE_FORMAT_SQL, environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_FORMAT_SQL)); jpaProperties.put(PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO, environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO)); jpaProperties.put(PROPERTY_NAME_HIBERNATE_NAMING_STRATEGY, environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_NAMING_STRATEGY)); jpaProperties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL, environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_SHOW_SQL)); //jpaProperties.put("jadira.usertype.autoRegisterUserTypes", "true"); entityManagerFactoryBean.setJpaProperties(jpaProperties); entityManagerFactoryBean.setMappingResources("META-INF/orm.xml"); return entityManagerFactoryBean; }
注意:orm.xml
<?xml version="1.0" encoding="UTF-8"?> <entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_2_0.xsd" version="2.0"> <persistence-unit-metadata> <persistence-unit-defaults> <entity-listeners> <entity-listener class="org.springframework.data.jpa.domain.support.AuditingEntityListener" /> </entity-listeners> </persistence-unit-defaults> </persistence-unit-metadata> </entity-mappings>
作用是为了使@createddate @version等spring annoation生效
3. 数据库的配置文件可以这样写,不同数据库有所不同
application.properties
#Database Configuration db.driver=org.h2.Driver db.url=jdbc:h2:mem:datajpa db.username=sa db.password= #Hibernate Configuration hibernate.dialect=org.hibernate.dialect.H2Dialect hibernate.hbm2ddl.auto=create-drop hibernate.ejb.naming_strategy=org.hibernate.cfg.ImprovedNamingStrategy hibernate.show_sql=false hibernate.format_sql=true
4. entity的写法很普通
@Entity @Table(name = "inverter") public class Inverter { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @Column(name = "client_id", nullable = false, length = 20) private String clientId; @Column(name = "record_time") @Temporal(TemporalType.TIMESTAMP) private Date recordTime; @Column(name = "output_power") private int outputPower; @Column(name = "output_energy") private int outputEnergy; @Column(name = "energy_total") private long energyTotal; @CreatedDate @Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime") private DateTime creationTime; }
5.repository 的写法也很普通
public interface InverterRepository extends Repository<Inverter, Long>{ List<Inverter> findByClientIdAndRecordTimeBetween(String inverterId, Date startTime, Date endTime); Inverter save(Inverter entity); }
6. 测试代码:
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = {PersistenceContext.class}) @TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class, TransactionalTestExecutionListener.class, DbUnitTestExecutionListener.class }) @DatabaseSetup("inverterData.xml") public class InverterRepositoryTest { @Autowired private InverterRepository repository; @Test public void when_find_by_clientid_and_record_times_should_return_one() throws Exception { // when Date start = DateTime.now().withDate(2015, 5, 14).withTimeAtStartOfDay().toDate(); Date end = DateTime.now().withDate(2015, 5, 15).withTimeAtStartOfDay().toDate(); List<Inverter> inverters = repository.findByClientIdAndRecordTimeBetween("inverter1", start, end); // then assertThat(inverters.size(), is(1)); } @Test public void when_save_and_created_time_should_not_null() throws Exception { // given Inverter inverter = new Inverter(); inverter.setClientId("inverter2"); inverter.setEnergyTotal(1000); inverter.setOutputEnergy(200); inverter.setOutputPower(3000); inverter.setRecordTime(new Date()); // when Inverter inverter2 = repository.save(inverter); // then assertThat(inverter2.getCreationTime(), notNullValue()); } }
只要这样配置一下就可以使用操作数据库了,是不是很方便?
注意inverterData.xml里是表字段的信息
<dataset> <inverter id="1" client_id="inverter1" record_time="2015-05-14 15:55:32" output_power="100" output_energy="250" energy_total="345000"/> </dataset>
以上