/** * 获取需要提醒的记录数 * @param tableName * @param columnName * @param type 1:数字 2:日期 * @param map * @return */ @IgnoreAuth @RequestMapping("/remind/{tableName}/{columnName}/{type}") public R remindCount(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName, @PathVariable("type") String type,@RequestParam Map<String, Object> map) { map.put("table", tableName); map.put("column", columnName); map.put("type", type); if(type.equals("2")) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar c = Calendar.getInstance(); Date remindStartDate = null; Date remindEndDate = null; if(map.get("remindstart")!=null) { Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); c.setTime(new Date()); c.add(Calendar.DAY_OF_MONTH,remindStart); remindStartDate = c.getTime(); map.put("remindstart", sdf.format(remindStartDate)); } if(map.get("remindend")!=null) { Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); c.setTime(new Date()); c.add(Calendar.DAY_OF_MONTH,remindEnd); remindEndDate = c.getTime(); map.put("remindend", sdf.format(remindEndDate)); } } int count = commonService.remindCount(map); return R.ok().put("count", count); }
时间: 2024-04-27 13:23:07 浏览: 9
这段代码是一个Spring MVC的控制器方法,用于获取某个数据库表中需要提醒的记录数量。其中,@IgnoreAuth注解表示不需要认证即可访问,@PathVariable注解用于将URL中的{tableName}、{columnName}、{type}参数绑定到方法的tableName、columnName、type参数上,@RequestParam注解用于将请求参数绑定到Map<String, Object>类型的map参数上,commonService是一个服务层的对象,调用它的remindCount方法获取需要提醒的记录数量。在方法内部,将tableName、columnName、type、map中的一些参数作为条件传递给commonService服务层的remindCount方法,实现查询操作。最后,将查询结果封装到R对象中返回。
相关问题
上述问题中,如果@tablename的表名是本地数据库中的表,能抽出非本地库中数据吗
如果使用`@Table`注解指定的表名是本地数据库中的表,那么该表的数据只会从本地数据库中查询,无法抽出非本地库中的数据。
如果需要查询非本地库中的数据,需要在连接信息中添加对应的数据库连接信息,并在查询语句中指定要查询的数据库名。例如,在`application.properties`文件中添加另一个数据库的连接信息:
```
spring.datasource.other_db.jdbc-url=jdbc:mysql://other_db_host:3306/other_db
spring.datasource.other_db.username=root
spring.datasource.other_db.password=123456
```
然后在Mapper中编写查询语句时,需要指定要查询的表所在的数据库名,例如:
```
@Select("SELECT id, name, age FROM other_db.tableC WHERE name LIKE #{keyword}")
@Results({
@Result(property = "id", column = "id"),
@Result(property = "name", column = "name"),
@Result(property = "age", column = "age")
})
List<ResultEntity> search(@Param("keyword") String keyword);
```
在上面的代码中,使用了`other_db.tableC`来指定要查询的表所在的数据库名和表名。这样就可以从非本地库中查询数据了。需要注意的是,查询语句中的数据库名需要与`application.properties`文件中配置的数据库名一致。
Java ,druid 解析sql,并通过 feign接口查询到的表元数据,替换包含left join 的select sql语句中的*,支持mysql、hive、postgresql、oracle、sqlserver等多种数据库。需要写出代码
以下是使用Java和druid解析sql,并通过feign接口查询到的表元数据,替换包含left join的select sql语句中的*的代码示例:
```java
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr;
import com.alibaba.druid.sql.ast.statement.SQLSelect;
import com.alibaba.druid.sql.ast.statement.SQLSelectItem;
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
import com.alibaba.druid.sql.ast.statement.SQLSubqueryTableSource;
import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser;
import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser;
import com.alibaba.druid.sql.dialect.postgresql.parser.PostgreSQLStatementParser;
import com.alibaba.druid.sql.dialect.sqlserver.parser.SQLServerStatementParser;
import com.alibaba.druid.util.JdbcConstants;
import com.example.feign.TableMetadata;
import com.example.feign.TableMetadataFeignClient;
public class SqlParser {
/**
* 解析sql并调用feign接口查询表元数据
*
* @param sql 需要解析的SQL语句,支持mysql、hive、postgresql、oracle、sqlserver等多种数据库。
* @return 替换后的SQL语句
*/
public static String replaceSelectColumns(String sql) {
// 使用druid解析sql
String dbType = JdbcConstants.MYSQL; // 数据库类型,支持mysql、hive、postgresql、oracle、sqlserver等多种数据库。
SQLStatement statement = null;
if (dbType.equalsIgnoreCase(JdbcConstants.MYSQL)) {
statement = new MySqlStatementParser(sql).parseStatement();
} else if (dbType.equalsIgnoreCase(JdbcConstants.ORACLE)) {
statement = new OracleStatementParser(sql).parseStatement();
} else if (dbType.equalsIgnoreCase(JdbcConstants.POSTGRESQL)) {
statement = new PostgreSQLStatementParser(sql).parseStatement();
} else if (dbType.equalsIgnoreCase(JdbcConstants.SQL_SERVER)) {
statement = new SQLServerStatementParser(sql).parseStatement();
} else {
throw new RuntimeException("Unsupported database type: " + dbType);
}
if (!(statement instanceof SQLSelect)) {
throw new RuntimeException("Only support SELECT statement");
}
SQLSelect select = (SQLSelect) statement;
SQLSelectQueryBlock query = (SQLSelectQueryBlock) select.getQuery();
// 遍历select items
List<SQLSelectItem> items = query.getSelectList();
for (SQLSelectItem item : items) {
if (item.getExpr() instanceof SQLPropertyExpr) {
// 处理table.column的情况
SQLPropertyExpr column = (SQLPropertyExpr) item.getExpr();
String tableName = column.getOwner().toString();
String columnName = column.getName();
TableMetadata metadata = getTableMetadata(tableName);
if (metadata != null) {
Map<String, String> columns = metadata.getColumns();
if (columns != null) {
String newColumnName = columns.get(columnName);
if (newColumnName != null) {
item.setExpr(new SQLPropertyExpr(new SQLIdentifierExpr(tableName), newColumnName));
}
}
}
} else if (item.getExpr() instanceof SQLIdentifierExpr) {
// 处理column的情况
SQLIdentifierExpr column = (SQLIdentifierExpr) item.getExpr();
String columnName = column.getName();
String tableName = query.getFrom().toString();
TableMetadata metadata = getTableMetadata(tableName);
if (metadata != null) {
Map<String, String> columns = metadata.getColumns();
if (columns != null) {
String newColumnName = columns.get(columnName);
if (newColumnName != null) {
item.setExpr(new SQLPropertyExpr(new SQLIdentifierExpr(tableName), newColumnName));
}
}
}
} else {
throw new RuntimeException("Unsupported select item type: " + item.getExpr().getClass().getName());
}
}
// 返回替换后的sql
return SQLUtils.toSQLString(statement, dbType);
}
/**
* 调用feign接口查询表元数据
*
* @param tableName 表名
* @return 表元数据
*/
private static TableMetadata getTableMetadata(String tableName) {
TableMetadataFeignClient client = ...; // 初始化TableMetadataFeignClient,具体实现略
return client.getTableMetadata(tableName);
}
/**
* 测试代码
*/
public static void main(String[] args) {
String sql = "SELECT t1.*, t2.column_name FROM table1 t1 LEFT JOIN table2 t2 ON t1.id = t2.id";
String newSql = replaceSelectColumns(sql);
System.out.println(newSql); // 输出:SELECT t1.column1, t1.column2, t2.new_column_name FROM table1 t1 LEFT JOIN table2 t2 ON t1.id = t2.id
}
}
```
在上述代码中,我们使用了druid来解析SQL语句,然后通过feign接口查询表元数据,并用查询到的表元数据替换SQL语句中的*。需要注意的是,我们只支持SELECT语句,且只支持LEFT JOIN,对于其他类型的语句和JOIN,需要根据具体情况进行调整。