使用Spring与Maven构建基于JPA的Java应用
采用Maven构建项目的核心优势在于依赖管理的自动化。通过在 pom.xml 中声明所需库,可避免手动复制JAR包并配置构建路径的繁琐操作。
结合Spring框架进行开发,则能充分利用其基于Java配置的容器管理机制。只需创建一个带有 @Configuration 注解的类,即可完成整个应用上下文的定义,无需XML配置文件。
数据库连接与JPA配置流程
1. 创建Maven项目
选择maven-archetype-quickstart 作为项目模板,快速搭建基础结构。
2. 配置数据源(DataSource)
Oracle 数据库配置:
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver");
dataSource.setUrl("jdbc:oracle:thin:@172.1.0.0:1521:orcl");
dataSource.setUsername("admin");
dataSource.setPassword("123");
return dataSource;
}
MySQL 数据库配置:
注意:url 中必须包含具体的数据库名称,否则将抛出 java.sql.SQLException: No database selected 错误。
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/databasename");
dataSource.setUsername("root");
dataSource.setPassword("123456");
return dataSource;
}
3. 设置JPA厂商适配器(JpaVendorAdapter)
若使用 Hibernate 作为JPA实现,需配置HibernateJpaVendorAdapter,并根据目标数据库设置对应的方言。
Oracle 方言配置:
@Bean
public JpaVendorAdapter jpaVendorAdapter() {
HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
adapter.setDatabase(Database.ORACLE);
adapter.setShowSql(true);
adapter.setGenerateDdl(false);
adapter.setDatabasePlatform("org.hibernate.dialect.Oracle10gDialect");
return adapter;
}
MySQL 方言配置:
错误地使用 Oracle 方言会导致表不存在异常,例如:Table 'portal.hibernate_sequence' doesn't exist。
@Bean
public JpaVendorAdapter jpaVendorAdapter() {
HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
adapter.setDatabase(Database.MYSQL);
adapter.setShowSql(true);
adapter.setGenerateDdl(false);
adapter.setDatabasePlatform("org.hibernate.dialect.MySQL57InnoDBDialect");
return adapter;
}
4. 初始化实体管理工厂(EntityManagerFactory)
该组件依赖于数据源和JPA适配器,并指定需要扫描的实体包路径。@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(
DataSource dataSource,
JpaVendorAdapter jpaVendorAdapter) {
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setDataSource(dataSource);
factory.setJpaVendorAdapter(jpaVendorAdapter);
factory.setPackagesToScan("com.example.entity"); // 替换为实际实体所在包路径
return factory;
}
重要提示: setPackagesToScan 必须指向包含 @Entity 和 @Table 注解的类所在的包。若路径配置错误,执行 em.persist() 时会抛出 IllegalArgumentException: Unknown entity 异常。此功能与 Spring 的 @ComponentScan 无关,后者用于发现组件并注册为 Bean。
5. 编写测试用例实现CRUD操作
完成上述配置后,可在测试类中通过 @PersistenceContext 注入 EntityManager,进而执行数据库操作。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = JpaConfig.class)
public class EntityTest {
@PersistenceContext
private EntityManager em;
@Test
public void testQueryStudent() {
String sql = "SELECT * FROM t_student WHERE id = 22";
Query query = em.createNativeQuery(sql, Student.class);
List<Student> results = query.getResultList();
// 处理查询结果
}
}