上一个教程我们讲解如何配置数据源示例,本次我们将接着上个教程的成果来整合MyBatis配置,如需看上篇教程的同学可点击链接
【Spring Boot从入门到进阶教程系列 -- Druid数据源初始化配置】
下面我们直接开启代码之旅
步骤1. 编写数据库枚举,列举我们常用的数据库类型
public enum DBType {
DB2("DB2"), Derby("Derby"), HSQL("HSQL"), MySQL("MySQL"), Oracel("Oracel"), PostgreSQL("PostgreSQL"), SQLServer2005("SQLServer2005"), SQLServer(
"SQLServer"), Sybase(" Sybase");
private DBType(String value) {
this.value = value;
}
private String value;
public String toString() {
return value.toUpperCase();
}
}
步骤2. 编写我们的数据库方言接口
public interface Dialect {
public boolean supportsLimit();
public boolean supportsLimitOffset();
public String getLimitString(String sql, int offset, int limit);
public String getLimitString(String sql, int offset, String offsetPlaceholder, int limit, String limitPlaceholder);
}
步骤3. 编写我们常用的MySQL方言实现,如需要其他的可继承该接口照葫芦画瓢即可
public class MySQLDialect implements Dialect {
public MySQLDialect() {
}
public boolean supportsLimitOffset() {
return true;
}
public boolean supportsLimit() {
return true;
}
public String getLimitString(String sql, int offset, int limit) {
return getLimitString(sql, offset, Integer.toString(offset), limit, Integer.toString(limit));
}
public String getLimitString(String sql, int offset, String offsetPlaceholder, int limit, String limitPlaceholder) {
return (new StringBuilder()).append(sql).append(" limit ").append((offset - 1) * limit).append(",").append(limit).toString();
}
}
步骤4. 编写数据库选择器接口和实现类(包含数据库类型所对应的数据库方言)
public interface DBSelector {
public String getDbType();
public void setDbType(String dbType);
public Dialect getDialect();
public void setDialect(Dialect dialect);
}
public class SimpleDBSelector implements DBSelector {
private String dbType;
private Dialect dialect;
public SimpleDBSelector() {
}
public SimpleDBSelector(String dbType) {
this.dbType = dbType;
}
public String getDbType() {
return dbType;
}
public void setDbType(String dbType) {
this.dbType = dbType;
}
public Dialect getDialect() {
if (dialect == null) {
if (dbType == null || "".equals(dbType)) {
dialect = new MySQLDialect();
} else {
dbType = dbType.trim().toUpperCase();
if (dbType.equals(DBType.DB2.toString())) {
dialect = new DB2Dialect();
} else if (dbType.equals(DBType.Derby.toString())) {
dialect = new DerbyDialect();
} else if (dbType.equals(DBType.HSQL.toString())) {
dialect = new HSQLDialect();
} else if (dbType.equals(DBType.MySQL.toString())) {
dialect = new MySQLDialect();
} else if (dbType.equals(DBType.Oracel.toString())) {
dialect = new OracleDialect();
} else if (dbType.equals(DBType.PostgreSQL.toString())) {
dialect = new PostgreSQLDialect();
} else if (dbType.equals(DBType.SQLServer2005.toString())) {
dialect = new SQLServer2005Dialect();
} else if (dbType.equals(DBType.SQLServer.toString())) {
dialect = new SQLServerDialect();
} else if (dbType.equals(DBType.Sybase.toString())) {
dialect = new SybaseDialect();
} else {
dialect = new MySQLDialect();
}
}
}
return dialect;
}
public void setDialect(Dialect dialect) {
this.dialect = dialect;
}
}
步骤5. 在上个教程实现的DruidConfiguration.java上增加MyBatis实例化方法,其中DbConfig对象可查看上两个教程有讲解如何初始化得来,该对象的mgbXmlLocation即是你的Mapper XML所在目录(关键)
@Configuration
public class DruidConfiguration {
@Autowired(required = false)
private DbConfig dbConfig;
@Bean
public ServletRegistrationBean druidServlet() {
ServletRegistrationBean reg = new ServletRegistrationBean();
reg.setServlet(new StatViewServlet());
reg.addUrlMappings("/druid/*");
reg.addInitParameter("loginUsername", dbConfig.getUsername());
reg.addInitParameter("loginPassword", dbConfig.getPassword());
reg.addInitParameter("logSlowSql", dbConfig.getLogSlowSql());
return reg;
}
@Bean
public FilterRegistrationBean filterRegistrationBean() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
filterRegistrationBean.setFilter(new WebStatFilter());
filterRegistrationBean.addUrlPatterns("/*");
filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
filterRegistrationBean.addInitParameter("profileEnable", "true");
return filterRegistrationBean;
}
@Primary
@Bean(name = "dataSource")
public DataSource druidDataSource() {
DruidDataSource datasource = new DruidDataSource();
datasource.setUrl(dbConfig.getUrl());
datasource.setUsername(dbConfig.getUsername());
datasource.setPassword(dbConfig.getPassword());
datasource.setDriverClassName(dbConfig.getDriverClassName());
datasource.setInitialSize(dbConfig.getInitialSize());
datasource.setMinIdle(dbConfig.getMinIdle());
datasource.setMaxActive(dbConfig.getMaxActive());
datasource.setMaxWait(dbConfig.getMaxWait());
datasource.setTimeBetweenEvictionRunsMillis(dbConfig.getTimeBetweenEvictionRunsMillis());
datasource.setMinEvictableIdleTimeMillis(dbConfig.getMinEvictableIdleTimeMillis());
datasource.setValidationQuery(dbConfig.getValidationQuery());
datasource.setTestWhileIdle(dbConfig.isTestWhileIdle());
datasource.setTestOnBorrow(dbConfig.isTestOnBorrow());
datasource.setTestOnReturn(dbConfig.isTestOnReturn());
try {
datasource.setFilters(dbConfig.getFilters());
} catch (SQLException e) {
e.printStackTrace();
}
return datasource;
}
@Bean(name = "sqlSessionFactory")
@Primary
public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSource") DataSource dataSource, @Qualifier("dbSelector") DBSelector dbSelector) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
Resource[] mappers = new PathMatchingResourcePatternResolver().getResources(dbConfig.getMgbXmlLocation());
bean.setMapperLocations(mappers);
return bean.getObject();
}
@Bean(name = "dbSelector")
@Primary
public DBSelector dbSelector() throws Exception {
return new SimpleDBSelector(dbConfig.getDatabase());
}
@Bean(name = "transactionManager")
@Primary
public DataSourceTransactionManager transactionManager(@Qualifier("dataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "sqlSessionTemplate")
@Primary
public SqlSessionTemplate sqlSessionTemplate(@Qualifier("sqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
以上代码完成后启动项目即可完成MyBatis实例化,以及数据库类型,方言选择
如果喜欢我的教程文章,请点下赞或收藏,如有疑惑可随时私信或评论区@我,感激不尽