java - 如何在 Java 类中使用 @Bean 配置数据源
问题描述
我正在按照 Spring book 中的示例创建一个小的网络商店应用程序。
该示例使用hsqldb嵌入式数据库,但我不想使用它。
我想连接到MySQL数据库,然后使用Hibernate sessionFractory。
我以这种方式编辑了示例代码:
@Configuration
@ComponentScan("com.packagename.webstore")
public class RootApplicationContextConfig {
@Bean
public DataSource dataSource() {
// this is the original code of the example
/*EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
EmbeddedDatabase db = builder
.setType(EmbeddedDatabaseType.HSQL)
.addScript("db/sql/create-table.sql")
.addScript("db/sql/insert-data.sql")
.build();
return db; */
//this is my code
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/dbName");
dataSource.setUsername( "user" );
dataSource.setPassword( "pass" );
return dataSource;
}
}
然后,在我的课程中,我以这种方式访问数据源:
@Autowired
private DataSource datasource;
...
Connection connection = datasource.getConnection();
...
我做的对吗?
如果以后我想使用 Hibernate sessionFactory,我应该如何编辑我的代码?
感谢你们
解决方案
如果你想用 spring 配置 SessionFactory 然后创建所需的 bean,如下所示
@Configuration
@EnableTransactionManagement
@PropertySource({ "classpath:persistence-mysql.properties" })
@ComponentScan({ "org.baeldung.spring.persistence" })
public class PersistenceConfig {
@Autowired
private Environment env;
@Bean
public LocalSessionFactoryBean sessionFactory() {
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
sessionFactory.setDataSource(restDataSource());
sessionFactory.setPackagesToScan(
new String[] { "entity class package name so it can scan them" });
sessionFactory.setHibernateProperties(hibernateProperties());
return sessionFactory;
}
@Bean
public DataSource restDataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));
dataSource.setUrl(env.getProperty("jdbc.url"));
dataSource.setUsername(env.getProperty("jdbc.user"));
dataSource.setPassword(env.getProperty("jdbc.pass"));
return dataSource;
}
@Bean
@Autowired
public HibernateTransactionManager transactionManager(
SessionFactory sessionFactory) {
HibernateTransactionManager txManager
= new HibernateTransactionManager();
txManager.setSessionFactory(sessionFactory);
return txManager;
}
@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
return new PersistenceExceptionTranslationPostProcessor();
}
Properties hibernateProperties() {
return new Properties() {
{
setProperty("hibernate.hbm2ddl.auto",
env.getProperty("hibernate.hbm2ddl.auto"));
setProperty("hibernate.dialect",
env.getProperty("hibernate.dialect"));
setProperty("hibernate.globally_quoted_identifiers",
"true");
}
};
}
}
属性文件
# jdbc confi
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring_hibernate_dev?createDatabaseIfNotExist=true
jdbc.user=tutorialuser
jdbc.pass=tutorialmy5ql
# hibernate config
hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
hibernate.show_sql=false
hibernate.hbm2ddl.auto=create-drop
那么你可以在你需要的类中使用 Datasource 或 SessionFactory
public class HibernateDAO{
@Autowired
SessionFactory sessionFactory;
@Autowired
DataSource datasource;
}
这是示例链接
推荐阅读
- google-cloud-platform - Google Stackdriver - 如何在一个视图中显示多个容器的日志?
- python - 如果文件不存在,带有 blob 存储绑定的 Azure 函数将返回 500 http 响应代码
- spring - spring-boot-starter-data-mongodb 将枚举映射到实体中的字符串
- rust - Ink :: 添加调试跟踪打印的正确方法是什么?ink_env::debug_println?
- phpword - 如何使用 phpword 从 html 代码生成 word 文件并保持源格式
- javascript - 如何使用 JavaScript 制作可拖动的轮播
- java - 信任 Apache HttpClient 中特定主机的单个证书
- python - 本地化时区名称
- python - 如何在 python 中打开一个 csv 文件,一次读取一行,而不将整个 csv 文件加载到内存中?
- spring - 如何在springboot azure(Springboot + Azure Cosmos)的控制台中显示sql查询