本文共 9156 字,大约阅读时间需要 30 分钟。
首先分析集成sqlite,然后需要完成的需求
- 动态创建sqlite数据
- 动态连接sqlite数据库
- 操作sqlite数据库
相比较传统的数据,使用mybaits集成,需要变更是数据库驱动driver,这个需要引入sqlite的依赖
org.mybatis.spring.boot mybatis-spring-boot-starter 2.1.4 org.xerial sqlite-jdbc 3.27.2.1
# database configurationblog.sqlite.url: jdbc:sqlite:E:/git_space/BlogSqlite/sqlite/pro.db
这里配置的是初始的数据库,文件不用创建,项目启动时会自动创建并初始化数据的表
@MapperScan(basePackages = { "club.dlblog.sqlite.mapper"}, sqlSessionFactoryRef = "sqlSessionFactory")@Configurationpublic class SqliteConfig { //数据源url @Value("${blog.sqlite.url}") private String dataSourceUrl; /** * 配置sqlite数据源 * @return */ @Bean(name = "sqliteDataSource") public DataSource sqliteDataSource(){ //尝试创建sqlite文件-不存在时创建 SqliteUtils.initSqliteFile(SqliteUtils.getFilePath(dataSourceUrl)); //创建数据源 DataSource dataSource = SqliteBuilder.create().url(dataSourceUrl).build(); try { //尝试初始化数据库-表不存在时创建 SqliteUtils.initProDb(dataSource.getConnection()); } catch (SQLException e) { e.printStackTrace(); } return dataSource; } /** * session工厂 */ @Bean(name = "sqlSessionFactory") public SqlSessionFactory sqlSessionFactory( @Qualifier("dynamicDataSource") DynamicDataSource dataSource) throws Exception { SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean(); sessionFactoryBean.setDataSource(dataSource); sessionFactoryBean.setMapperLocations( new PathMatchingResourcePatternResolver(). getResources("classpath:mapper/**/*.xml")); return sessionFactoryBean.getObject(); } /** * session模板 * @param sqlSessionFactory * @return */ @Bean(name = "sqlSessionTemplate") public SqlSessionTemplate ComSqlSessionTemplate( @Qualifier("sqlSessionFactory") SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory); } /** * 动态数据源 * @param dataSource * @return */ @Bean(name = "dynamicDataSource") public DynamicDataSource dynamicDataSource(@Qualifier("sqliteDataSource") DataSource dataSource){ return new DynamicDataSource(dataSource); }}
在这里需要做两步操作,尝试创建文件,文件不存在时,则去创建文件
//创建sqlite文件 public static void initSqliteFile(String filePath){ File file = new File(filePath); File dir = file.getParentFile(); if(!dir.exists()){ dir.mkdirs(); } if(!file.exists()){ try { file.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } }
尝试初始化数据库,当表不存在时初始化数据
/** * 初始化项目db * @param connection */ public static void initProDb(Connection connection){ //判断数据表是否存在 boolean hasPro = false; try { hasPro = true; //测试数据表是否存在 connection.prepareStatement("select * from pro").execute(); }catch (SQLException e){ //不存在 logger.debug("table pro is not exist"); hasPro = false; } //不存在时创建db if(!hasPro) { logger.debug(">>>start init pro db"); File file = null; try { //读取初始化数据sql file = ResourceUtils.getFile("classpath:sql/init.sql"); } catch (FileNotFoundException e) { e.printStackTrace(); } //获取sql String sql = ""; FileInputStream fis = null; InputStreamReader isr = null; try { fis = new FileInputStream(file); isr = new InputStreamReader(fis, "UTF-8"); BufferedReader bf = new BufferedReader(isr); String content = ""; StringBuilder sb = new StringBuilder(); while (content != null) { content = bf.readLine(); if (content == null) { break; } sb.append(content.trim()); } sql = sb.toString(); } catch (FileNotFoundException | UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { isr.close(); fis.close(); } catch (IOException e) { e.printStackTrace(); } } //分割sql String[] sqls = sql.split(";"); try { for (String str : sqls) { //开始初始化数据库 connection.setAutoCommit(false); connection.prepareStatement(str).execute(); } //提交sql connection.commit(); } catch (SQLException e) { e.printStackTrace(); } finally { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } logger.debug("finish init pro db>>>"); }else { logger.debug("pro db is exist"); } }
构建sqlite数据源其实只需要url和驱动类
下面时创建sqlite数据源的方式
public DataSource build(){ //url不为空 if (url!=null&&url!=""){ return DataSourceBuilder.create(). url(url).driverClassName(JDBC.class.getName()).build(); } //文件路径不为空 if(filePath!=null&&filePath!=""){ StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("jdbc:sqlite:").append(filePath); return DataSourceBuilder.create(). url(stringBuilder.toString()).driverClassName(JDBC.class.getName()).build(); } return DataSourceBuilder.create().build(); }
参照我的上一篇的动态数据源的集成方式
/** * 动态数据源配置 * @author machenike */public class DynamicDataSource extends AbstractRoutingDataSource { private volatile static DynamicDataSource dynamicDataSource; /** * 数据源存储用map */ private final Map
整个流程
后续创建数据源的步骤
全部源码的链接
转载地址:http://ahugn.baihongyu.com/