DataSource dataSource=new MysqlDataSource();为什么前面的类和后面的不一致?
时间: 2023-03-25 10:03:55 浏览: 71
这是因为MysqlDataSource是DataSource的一个实现类,它继承了DataSource接口并实现了其中的方法,所以可以使用MysqlDataSource来创建一个DataSource对象。
相关问题
改写为连接SQl server数据库:package lemon.util; import com.mysql.cj.jdbc.MysqlDataSource; import lemon.exception.SystemException; import javax.sql.DataSource; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class DBUtil { private static final String URL = "jdbc:sqlserver://localhost:1433;DatabaseName=book"; private static final String USERNAME = "sa"; private static final String PASSWORD = "123456"; private static volatile DataSource DATA_SOURCE; private DBUtil(){} private static DataSource getDataSource(){ if(DATA_SOURCE == null){ synchronized (DBUtil.class){ if(DATA_SOURCE == null){ DATA_SOURCE = new MysqlDataSource(); ((MysqlDataSource) DATA_SOURCE).setURL(URL); ((MysqlDataSource) DATA_SOURCE).setUser(USERNAME); ((MysqlDataSource) DATA_SOURCE).setPassword(PASSWORD); } } } return DATA_SOURCE; } public static Connection getConnection(){ try { return getDataSource().getConnection(); } catch (SQLException e) { throw new SystemException("000001", "获取数据库连接失败", e); } } public static void close(Connection c, Statement s){ close(c, s, null); } public static void close(Connection c, Statement s, ResultSet r){ try { if(r != null) r.close(); if(s != null) s.close(); if(c != null) c.close(); } catch (SQLException e) { throw new SystemException("000002", "释放数据库资源出错", e); } } }
package lemon.util;
import com.microsoft.sqlserver.jdbc.SQLServerDataSource;
import lemon.exception.SystemException;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DBUtil {
private static final String URL = "jdbc:sqlserver://localhost:1433;databaseName=book";
private static final String USERNAME = "sa";
private static final String PASSWORD = "123456";
private static volatile DataSource DATA_SOURCE;
private DBUtil(){}
private static DataSource getDataSource(){
if(DATA_SOURCE == null){
synchronized (DBUtil.class){
if(DATA_SOURCE == null){
DATA_SOURCE = new SQLServerDataSource();
((SQLServerDataSource) DATA_SOURCE).setURL(URL);
((SQLServerDataSource) DATA_SOURCE).setUser(USERNAME);
((SQLServerDataSource) DATA_SOURCE).setPassword(PASSWORD);
}
}
}
return DATA_SOURCE;
}
public static Connection getConnection(){
try {
return getDataSource().getConnection();
} catch (SQLException e) {
throw new SystemException("000001", "获取数据库连接失败", e);
}
}
public static void close(Connection c, Statement s){
close(c, s, null);
}
public static void close(Connection c, Statement s, ResultSet r){
try {
if(r != null)
r.close();
if(s != null)
s.close();
if(c != null)
c.close();
} catch (SQLException e) {
throw new SystemException("000002", "释放数据库资源出错", e);
}
}
}
hibernate mysql datasource_springboot2.0.3使用jpa和hibernate的方式配置多数据源(sqlite和mysql)...
首先需要在pom.xml文件中添加以下依赖:
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.30.1</version>
</dependency>
```
然后配置application.yml文件,如下所示:
```yaml
spring:
datasource:
mysql:
url: jdbc:mysql://localhost:3306/mysql_db?useUnicode=true&characterEncoding=utf-8&useSSL=false
driver-class-name: com.mysql.jdbc.Driver
username: root
password: root
sqlite:
url: jdbc:sqlite:/data/sqlite_db.db
driver-class-name: org.sqlite.JDBC
username: root
password: root
jpa:
show-sql: true
hibernate:
ddl-auto: update
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL5Dialect
```
接下来需要创建两个数据源的配置类,分别为MysqlConfig和SqliteConfig,代码如下所示:
```java
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "mysqlEntityManagerFactory",
transactionManagerRef = "mysqlTransactionManager",
basePackages = {"com.example.mysql.repository"})
public class MysqlConfig {
@Primary
@Bean(name = "mysqlDataSource")
@ConfigurationProperties(prefix = "spring.datasource.mysql")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Primary
@Bean(name = "mysqlEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder,
@Qualifier("mysqlDataSource") DataSource dataSource) {
return builder.dataSource(dataSource).packages("com.example.mysql.entity").persistenceUnit("mysql")
.build();
}
@Primary
@Bean(name = "mysqlTransactionManager")
public PlatformTransactionManager transactionManager(
@Qualifier("mysqlEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
}
```
```java
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "sqliteEntityManagerFactory",
transactionManagerRef = "sqliteTransactionManager",
basePackages = {"com.example.sqlite.repository"})
public class SqliteConfig {
@Bean(name = "sqliteDataSource")
@ConfigurationProperties(prefix = "spring.datasource.sqlite")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "sqliteEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder,
@Qualifier("sqliteDataSource") DataSource dataSource) {
return builder.dataSource(dataSource).packages("com.example.sqlite.entity").persistenceUnit("sqlite")
.build();
}
@Bean(name = "sqliteTransactionManager")
public PlatformTransactionManager transactionManager(
@Qualifier("sqliteEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
}
```
注意事项:
1. 在MysqlConfig和SqliteConfig中需要使用`@EnableJpaRepositories`注解来指定数据源的repository所在包。
2. 在MysqlConfig和SqliteConfig中创建的EntityManagerFactory和TransactionManager需要使用`@Primary`注解来标识默认数据源。
3. application.yml中的`hibernate.dialect`需要根据不同的数据库进行修改。
4. 在repository中需要使用`@Qualifier`注解来指定使用的数据源。
使用多数据源时,需要在service或controller中使用`@Transactional("mysqlTransactionManager")`或`@Transactional("sqliteTransactionManager")`注解来指定使用的数据源。
至此,一个使用JPA和Hibernate配置多数据源的示例就完成了。