Spring Boot从入门到进阶教程系列 -- MyBatis配置,数据库选择器和分页方言实现

上一个教程我们讲解如何配置数据源示例,本次我们将接着上个教程的成果来整合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实例化,以及数据库类型,方言选择

如果喜欢我的教程文章,请点下赞或收藏,如有疑惑可随时私信或评论区@我,感激不尽

猜你喜欢

转载自blog.csdn.net/shadowsick/article/details/80745315