spring 您能提供一些关于将CASE_IGNORING配置到嵌入式H2数据库的提示吗?

mrzz3bfm  于 2023-06-21  发布在  Spring
关注(0)|答案(1)|浏览(109)

我正在使用spring,mybatis plus和带有@MybatisPlusTest注解的单元测试。
我相信@MybatisPlusTest将帮助我构建嵌入式数据库服务器。
下面是Spring容器启动时与数据库相关的日志。

2023-06-08 10:36:02.187  INFO 1911 --- [           main] beddedDataSourceBeanFactoryPostProcessor : Replacing 'dataSource' DataSource bean with embedded version
2023-06-08 10:36:02.749  INFO 1911 --- [           main] o.s.j.d.e.EmbeddedDatabaseFactory        : Starting embedded database: url='jdbc:h2:mem:e9cde56b-3395-44fb-8251-c79b0b36e653;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa'

下面是schema-h2.sql

create table if not exists person
(
    id   int auto_increment primary key,
    name varchar(50) not null,
    age  int         not null
);

这是PersonMapper

@Repository
public interface PersonMapper extends BaseMapper<Person> {
    @Select("select name, age from person")
    public List<Map<String, Object>> selectCertainColumns();
}

在我调用personMapper.selectCertainColumns()之后,我得到了一个List<Map<String, Object>> rows,我想得到列name的值:

预期值:

rows.get(0).get(“name”)

实际:

rows.get(0).get(“NAME”)
JDBC URL with ignorecase is not working for H2 database connection,我明白我应该改变h2数据源bean的url如下:

jdbc:h2:mem:xxxx;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false;CASE_INSENSITIVE_IDENTIFIERS=TRUE

问题是:

无法修改用于构建嵌入式H2数据库的配置或url。

你能提供一些关于设置嵌入式H2数据库的提示吗?
任何建议都很感激。

ccrfmcuu

ccrfmcuu1#

实现此目的的一种方法是为test创建一个自定义配置,以覆盖@MybatisPlusTest提供的默认配置。您可以创建一个新的配置并使用@TestConfiguration对其进行注解。然后,您可以为嵌入式H2数据库定义一个bean,并使用所需的参数设置其JDBCURL。
例如,我为嵌入式H2数据库定义了一个bean,并使用所需的参数设置了它的JDBC URL:CASE_INSENSITIVE_IDENTIFIERS=TRUE

@TestConfiguration
public class TestConfig {

    @Bean
    public DataSource dataSource() {
        return new EmbeddedDatabaseBuilder()
                .setType(EmbeddedDatabaseType.H2)
                .addScript("schema-h2.sql")
                .build();
    }

    @Bean
    public MybatisSqlSessionFactoryBean mybatisSqlSessionFactoryBean(DataSource dataSource) {
        MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);

        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
        configuration.setMapUnderscoreToCamelCase(true);

        sessionFactory.setConfiguration(configuration);

        Resource[] mapperLocations = new PathMatchingResourcePatternResolver()
                .getResources("classpath:mapper/*.xml");

        sessionFactory.setMapperLocations(mapperLocations);
        return sessionFactory;
    }

    @Primary
    @Bean
    public DataSourceInitializer dataSourceInitializer(DataSource dataSource) {
        ResourceDatabasePopulator resourceDatabasePopulator = new ResourceDatabasePopulator();
        resourceDatabasePopulator.addScript(new ClassPathResource("schema-h2.sql"));

        DataSourceInitializer dataSourceInitializer = new DataSourceInitializer();
        dataSourceInitializer.setDataSource(dataSource);
        dataSourceInitializer.setDatabasePopulator(resourceDatabasePopulator);

        return dataSourceInitializer;
    }

    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);

        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
        configuration.setMapUnderscoreToCamelCase(true);

        sessionFactory.setConfiguration(configuration);

        Resource[] mapperLocations = new PathMatchingResourcePatternResolver()
                .getResources("classpath:mapper/*.xml");

        sessionFactory.setMapperLocations(mapperLocations);
        return sessionFactory.getObject();
    }
}

之后,要在测试中使用自定义配置,请使用@ContextConfiguration(classes = TestConfig.class)注解测试类。
我希望它能解决问题

相关问题