java - 如何使用 Mybatis 和 SQLite 创建表?
问题描述
我正在尝试使用 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>
解决方案
推荐阅读
- javascript - 嵌入在 JS 中的 Google Calendar API 密钥?
- selenium-webdriver - selenium testng xml类并行运行
- debugging - VS Code 调试可以使用 sourceMapPathOverrides 和 serverReadyAction / debugWithChrome 吗?
- flutter - Flutter 网页上传文件
- npm - 如何使用 $npm_package 变量在 npm package.json 中设置包版本标记?
- react-native - 如何更改条形图中的 x 轴和 y 轴位置(React Native)
- asp.net-core - 会员服务提供者 SignInManager SignInAsync 成功,但 IsSignedIn 始终为 false
- django - 使用 nginx 在多个端口上重定向 Django 站点请求
- amazon-web-services - 如何使用 CloudFormation 创建一个带有 DocumentType 包的“AWS::SSM::Document”
- angular - 如何将外部边框应用于有角材料的表格?