package com.luoboduner.moo.tool.util; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.CharsetUtil; import com.luoboduner.moo.tool.App; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.File; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; /** * <pre> * Mybatis工具 * </pre> * * @author <a href="https://github.com/rememberber">RememBerBer</a> * @since 2019/5/9. */ @Slf4j public class MybatisUtil { private static SqlSession sqlSession = null; /** * 是否需要初始化 */ private static boolean needInit = false; private static File dbFile = new File(SystemUtil.configHome + File.separator + "MooTool.db"); private MybatisUtil() { } public static SqlSession getSqlSession() { if (sqlSession == null) { try { if (!dbFile.exists()) { initDbFile(); } if (StringUtils.isNotBlank(App.config.getDbFilePath())) { dbFile = new File(App.config.getDbFilePath() + File.separator + "MooTool.db"); } String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); Properties properties = new Properties(); properties.setProperty("url", "jdbc:sqlite:" + dbFile.getAbsolutePath()); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, properties); sqlSession = sqlSessionFactory.openSession(true); inputStream.close(); initTables(); } catch (Exception e) { log.error("get sqlSession error!", e); } } return sqlSession; } public static void setSqlSession(SqlSession sqlSession) { MybatisUtil.sqlSession = sqlSession; } /** * 初始化数据库文件 */ public static void initDbFile() throws SQLException { File configHomeDir = new File(SystemUtil.configHome); if (!configHomeDir.exists()) { configHomeDir.mkdirs(); } // 不存在db文件时会自动创建一个 String sql = FileUtil.readString(MybatisUtil.class.getResource("/db_init.sql"), CharsetUtil.UTF_8); executeSql(sql); needInit = true; } /** * 初始化数据库表 */ private static void initTables() { if (needInit) { // doesn't work // InitMapper initMapper = sqlSession.getMapper(InitMapper.class); // initMapper.createAllTables(); } } /** * 执行sql * * @param sql */ public static void executeSql(String sql) throws SQLException { Connection connection = DriverManager.getConnection("jdbc:sqlite:" + dbFile.getAbsolutePath()); Statement stmt = connection.createStatement(); stmt.executeUpdate(sql); stmt.close(); connection.close(); } }