示例#1
0
 /**
  * Saves the query passed
  *
  * @param savedQuery
  * @return insert id
  * @throws LensException
  */
 public long saveQuery(SavedQuery savedQuery) throws LensException {
   try {
     final ECMAEscapedSavedQuery ecmaEscaped = ECMAEscapedSavedQuery.getFor(savedQuery);
     runner.update(
         "insert into "
             + SAVED_QUERY_TABLE_NAME
             + " values ("
             + dialect.getAutoIncrementId(runner)
             + ", "
             + "'"
             + ecmaEscaped.getName()
             + "'"
             + ", "
             + "'"
             + ecmaEscaped.getDescription()
             + "'"
             + ","
             + "'"
             + ecmaEscaped.getQuery()
             + "'"
             + ","
             + "'"
             + ecmaEscaped.getParameters()
             + "'"
             + ","
             + "now()"
             + ","
             + "now()"
             + ")");
     return dialect.getLastInsertedID(runner);
   } catch (SQLException e) {
     throw new LensException("Save query failed !", e);
   }
 }
示例#2
0
  private void generate(Dialect dialect) {
    cfg.setProperty("hibernate.dialect", dialect.getDialectClass());

    SchemaExport export = new SchemaExport(cfg);
    export.setDelimiter(";");
    export.setOutputFile("ddl_" + dialect.name().toLowerCase() + ".sql");
    export.execute(true, false, false, false);
  }
 public DialectCompiletimeRegistry buildDialectRegistry(
     PackageBuilder packageBuilder, PackageRegistry pkgRegistry, Package pkg) {
   DialectCompiletimeRegistry registry = new DialectCompiletimeRegistry(pkg);
   for (Iterator it = this.dialectConfigurations.values().iterator(); it.hasNext(); ) {
     DialectConfiguration conf = (DialectConfiguration) it.next();
     Dialect dialect = conf.newDialect(packageBuilder, pkgRegistry, pkg);
     registry.addDialect(dialect.getId(), dialect);
   }
   return registry;
 }
示例#4
0
 /**
  * Creates the saved query table
  *
  * @throws LensException cannot create saved query table
  */
 public void createSavedQueryTableIfNotExists() throws LensException {
   try {
     runner.update(dialect.getCreateTableSyntax());
   } catch (SQLException e) {
     throw new LensException("Cannot create saved query table!", e);
   }
 }
示例#5
0
 /**
  * 构造方法
  *
  * @param strDialect
  */
 public SqlUtil(String strDialect) {
   if (strDialect == null || "".equals(strDialect)) {
     throw new IllegalArgumentException("Mybatis分页插件无法获取dialect参数!");
   }
   dialect = Dialect.of(strDialect);
   parser = AbstractParser.newParser(dialect);
 }
 public IdentitySchema(Configuration configuration) {
   this.configuration = configuration;
   this.properties = configuration.getProperties();
   this.dialect = Dialect.getDialect(properties);
   try {
     // get the mapping field via reflection :-(
     Field mappingField = Configuration.class.getDeclaredField("mapping");
     mappingField.setAccessible(true);
     this.mapping = (Mapping) mappingField.get(configuration);
   } catch (Exception e) {
     throw new RuntimeException("couldn't get the hibernate mapping", e);
   }
 }
示例#7
0
 private Dialect getDialect() {
   if (dialect == null) {
     // need to guess from the database type!
     Connection connection = null;
     try {
       connection = connectionFactory.getConnection();
       String dbProduct = connection.getMetaData().getDatabaseProductName();
       dialect = guessDialect(dbProduct);
     } catch (Exception e) {
       log.debug("Unable to guess dialect from JDBC metadata.", e);
     } finally {
       connectionFactory.releaseConnection(connection);
     }
     if (dialect == null) {
       log.debug(
           "Unable to detect database dialect using connection metadata.  Attempting to guess on driver name.");
       try {
         connection = connectionFactory.getConnection();
         String dbProduct = connectionFactory.getConnection().getMetaData().getDriverName();
         dialect = guessDialect(dbProduct);
       } catch (Exception e) {
         log.debug("Unable to guess database dialect from JDBC driver name.", e);
       } finally {
         connectionFactory.releaseConnection(connection);
       }
     }
     if (dialect == null) {
       throw new CacheConfigurationException(
           "Unable to detect database dialect from JDBC driver name or connection metadata.  Please provide this manually using the 'dialect' property in your configuration.  Supported database dialect strings are "
               + Arrays.toString(Dialect.values()));
     } else {
       log.debugf(
           "Guessing database dialect as '%s'.  If this is incorrect, please specify the correct dialect using the 'dialect' attribute in your configuration.  Supported database dialect strings are %s",
           dialect, Arrays.toString(Dialect.values()));
     }
   }
   return dialect;
 }
示例#8
0
 /**
  * 测试[控制台输出]count和分页sql
  *
  * @param dialect 数据库类型
  * @param originalSql 原sql
  */
 public static void testSql(String dialect, String originalSql) {
   testSql(Dialect.of(dialect), originalSql);
 }
示例#9
0
  public Object intercept(Invocation ivk) throws Throwable {
    if (ivk.getTarget() instanceof RoutingStatementHandler) {
      RoutingStatementHandler statementHandler = (RoutingStatementHandler) ivk.getTarget();
      BaseStatementHandler delegate =
          (BaseStatementHandler) Reflections.getFieldValue(statementHandler, "delegate");
      MappedStatement mappedStatement =
          (MappedStatement) Reflections.getFieldValue(delegate, "mappedStatement");

      if (mappedStatement.getId().matches(pageSqlId)) { // 拦截需要分页的SQL
        BoundSql boundSql = delegate.getBoundSql();
        Object parameterObject =
            boundSql
                .getParameterObject(); // 分页SQL<select>中parameterType属性对应的实体参数,即Mapper接口中执行分页方法的参数,该参数不得为空
        if (parameterObject == null) {
          throw new NullPointerException("parameterObject尚未实例化!");
        } else {
          // 生成查询总数语句,并获取总数
          Connection connection = (Connection) ivk.getArgs()[0];
          String sql = boundSql.getSql();
          StringBuilder countSql = new StringBuilder();
          countSql.append("select count(1) from (").append(sql).append(") tmp_count");
          PreparedStatement countStmt = connection.prepareStatement(countSql.toString());
          // BoundSql countBS = new
          // BoundSql(mappedStatement.getConfiguration(),countSql.toString(),boundSql.getParameterMappings(),parameterObject);

          // 使用DefaultParameterHandler来对语句进行预处理
          DefaultParameterHandler defaultParameterHandler =
              new DefaultParameterHandler(mappedStatement, parameterObject, boundSql);
          defaultParameterHandler.setParameters(countStmt);
          ResultSet rs = countStmt.executeQuery();
          long count = 0;
          if (rs.next()) {
            count = rs.getLong(1);
          }
          rs.close();
          countStmt.close();
          // System.out.println(count);
          RequestBean requestBean = null;
          if (parameterObject instanceof RequestBean) { // 参数就是Page实体
            requestBean = (RequestBean) parameterObject;
            requestBean.setCount(count);
          } else if (parameterObject instanceof Map) {
            requestBean = (RequestBean) ((Map) parameterObject).get("requestBean");
            requestBean.setCount(count);
          } else { // 参数为某个实体,该实体拥有Page属性
            Field pageField = Reflections.getAccessibleField(parameterObject, "requestBean");
            if (pageField != null) {
              requestBean = (RequestBean) Reflections.getFieldValue(parameterObject, "requestBean");
              if (requestBean == null) requestBean = new RequestBean();

              requestBean.setCount(count);
              Reflections.setFieldValue(
                  parameterObject, "requestBean", requestBean); // 通过反射,对实体对象设置分页对象
            } else {
              throw new NoSuchFieldException(
                  parameterObject.getClass().getName() + "不存在 requestBean 属性!");
            }
          }
          String pageSql =
              dialectObj.getLimitString(sql, requestBean.getOffset(), requestBean.getPageSize());
          Reflections.setFieldValue(boundSql, "sql", pageSql); // 将分页sql语句反射回BoundSql.
          if (logger.isDebugEnabled()) {
            logger.debug("生成分页SQL : " + boundSql.getSql());
          }
        }
      }
    }

    return ivk.proceed();
  }