mybatis-sqlite

来源:互联网 发布:网络语言粗鄙化的原因 编辑:程序博客网 时间:2024/06/03 03:42

最近需要和移动端配置配合,将后台的结果数据生成sqlite数据库传给移动端(因为需要离线查看),所以配置信息的话需要同步存入sqlite。
1 创建和后台一样的表结构
2 做一个拦截器,只需要拦截StatementHandle 就可以了,仅处理增、删、改操作,对于sqlite来说 ,批量插入时 ,需要去掉 from dual(我使用的是oracle),所以插入的时候 还要去掉from dual
3 在mybatis中,配置一个动态数据源,便于切换(可能特殊的需要处理了)及获取
4 这里遇到个问题,就是 我使用的是 sqlite-jdbc 驱动,但是使用最新的版本(3.19.3)及其它新版本时,出现 发布找不到该驱动jar包,但是单元测试又通过的,有点晕~~ 后来找了个低版本(3.7.2)的驱动就可以了 ,不知道高版本做了什么限制。。

好了 这样就可以实现oracle和sqlite同步了!!

    @Override    public Object intercept(Invocation invocation) throws Throwable {        Object[] args = invocation.getArgs();        MetaObject mb = SystemMetaObject.forObject(args[0]);        MetaObject mbTarget = SystemMetaObject.forObject(invocation.getTarget());        MappedStatement mappedStatement = (MappedStatement) mbTarget.getValue("delegate.mappedStatement");        MetaObject mbStatement = SystemMetaObject.forObject(invocation.getTarget());        BoundSql boundSql = (BoundSql) mbStatement.getValue("delegate.boundSql");        excutorSqlite(invocation, mappedStatement, boundSql);        return invocation.proceed();    }    private int excutorSqlite(Invocation invocation, MappedStatement mappedStatement, BoundSql boundSql)            throws SQLException {        int count = 0;        String defaultSql = "";        String sql = defaultSql = boundSql.getSql();        MetaObject boundsqlMb = null;        try {//获取sqlite数据源            DataSource sqliteDataSourcce = DynamicDataSource.getSqliteDataSource();            //获取链接            Connection conn = DataSourceUtils.getConnection(sqliteDataSourcce);            if (mappedStatement.getSqlCommandType().equals(SqlCommandType.INSERT)) {            //新增时去除from dual                sql = sql.replaceAll("from dual", "");                boundsqlMb = SystemMetaObject.forObject(boundSql);                boundsqlMb.setValue("sql", sql);            }            PreparedStatement ps = conn.prepareStatement(sql);            ParameterHandler parameterHandler = new DefaultParameterHandler(mappedStatement,                    boundSql.getParameterObject(), boundSql);            parameterHandler.setParameters(ps);            count = ps.executeUpdate();        } catch (Exception e) {            LogUtil.error("sqlite 执行报错:" + e + "|sql:" + sql);        }        if (boundsqlMb != null) {            boundsqlMb.setValue("sql", defaultSql);        }        return count;    }    @Override    public Object plugin(Object target) {        if (target instanceof StatementHandler) {            MetaObject mb = SystemMetaObject.forObject(target);            MappedStatement mappedStatement = (MappedStatement) mb.getValue("delegate.mappedStatement");            if (Arrays.asList(SQLITE_SQLCOMMANDTYPE).contains(mappedStatement.getSqlCommandType())) {                return Plugin.wrap(target, this);            }        }        return target;    }
原创粉丝点击