首页 > 解决方案 > 如何使用 Mybatis 和 SQLite 创建表?

问题描述

我正在尝试使用 Mybatis 和 SQLite 创建一个新数据库和新表。我从之前的答案(123)中发现 Mybatis 确实支持使用 CREATE 和 ALTER 语句,方法是在 Mybatis 映射器语法中将它们标记为“UPDATE”。但是,这些问题/答案使用的是 Mapper XML,而我使用的是注释,也没有使用 SQLite。

一旦你打开一个新的连接,SQLite 就会创建一个新的数据库,所以数据库之前是否存在并不重要。创建一个大小为零字节的新数据库,这很好(SQLite 将 0 字节文件视为空数据库)。但是在创建表之后,我希望数据库大小不为零,因为它存储了该表的表结构。在运行我认为应该创建表的代码后(我正在根据这个答案检查我的语法),数据库大小仍然读取为 0 字节,这对我说实际上并没有创建表。我究竟做错了什么?

我的 Java 代码来测试这个场景:

public class Example {

    public static void main(String[] args) {
        String userHomePath = System.getProperty("user.home");
        File exampleDb = new File(userHomePath, "example.sqlite3");
        String jdbcConnectionString = "jdbc:sqlite:" + exampleDb.getAbsolutePath();
        DataSource dataSource = new PooledDataSource("org.sqlite.JDBC", jdbcConnectionString, null, null);
        Environment environment = new Environment("Main", new JdbcTransactionFactory(), dataSource);
        Configuration configuration = new Configuration(environment);
        configuration.addMapper(GenericMapper.class);
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sessionFactory = builder.build(configuration);
        try (SqlSession session = sessionFactory.openSession()) {
            GenericMapper genericMapper = session.getMapper(GenericMapper.class);
            genericMapper.createExampleTableIfMissing();
        }
    }

}

我的映射器:

public interface GenericMapper {
    @Update("CREATE TABLE IF NOT EXISTS extbl (id INTEGER PRIMARY KEY AUTOINCREMENT)")
    void createExampleTableIfMissing();
}

运行此代码后检查文件:

C:\Users\me>dir example.sqlite3
 Volume in drive C is Windows
 Volume Serial Number is D4DE-B46A

 Directory of C:\Users\me

12/04/2021  18:14                 0 example.sqlite3
               1 File(s)              0 bytes
               0 Dir(s)  27,326,779,392 bytes free

C:\Users\me>

标签: javasqlitemybatissqlitejdbc

解决方案


推荐阅读