我正在尝试使用 Mybatis 和 SQLite 创建一个新数据库和新表。我从之前的答案(1、2、3)中发现 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>