初始化项目

This commit is contained in:
1445458000@qq.com 2025-03-13 21:19:48 +08:00
commit d3ebc8a6ef
14 changed files with 1679 additions and 0 deletions

View File

@ -0,0 +1,101 @@
package com.example.util;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.ResultSet;
public class DatabaseInitializer implements Processor {
private static final Logger LOG = LoggerFactory.getLogger(DatabaseInitializer.class);
private DataSource dataSource;
public DatabaseInitializer(){
}
public DatabaseInitializer(DataSource dataSource) {
this.dataSource = dataSource;
}
// setter方法用于属性注入
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
@Override
public void process(Exchange exchange) throws Exception {
LOG.info("初始化数据库...");
initializeDatabase();
insertInitialData();
LOG.info("数据库初始化完成");
}
private void initializeDatabase() {
try (Connection connection = dataSource.getConnection();
PreparedStatement statement = connection.prepareStatement(SqlQueries.CREATE_USERS_TABLE)) {
statement.execute();
LOG.info("用户表创建成功或已存在");
} catch (SQLException e) {
LOG.error("初始化数据库时出错", e);
throw new RuntimeException("初始化数据库时出错", e);
}
}
private void insertInitialData() {
try (Connection connection = dataSource.getConnection()) {
// 检查admin用户是否已存在
if (!userExists(connection, "admin")) {
insertUser(connection, "admin", "admin", "管理员", "admin@example.com", "13800000000", true);
LOG.info("已创建管理员用户: admin/admin");
}
// 检查普通用户是否已存在
if (!userExists(connection, "user")) {
insertUser(connection, "user", "user", "普通用户", "user@example.com", "13900000000", true);
LOG.info("已创建普通用户: user/user");
}
} catch (SQLException e) {
LOG.error("插入初始数据时出错", e);
throw new RuntimeException("插入初始数据时出错", e);
}
}
private boolean userExists(Connection connection, String username) throws SQLException {
String query = "SELECT COUNT(*) FROM users WHERE username = ?";
try (PreparedStatement ps = connection.prepareStatement(query)) {
ps.setString(1, username);
try (ResultSet rs = ps.executeQuery()) {
if (rs.next()) {
return rs.getInt(1) > 0;
}
}
}
return false;
}
private void insertUser(Connection connection, String username, String password,
String fullName, String email, String phone, boolean active) throws SQLException {
String query = "INSERT INTO users (username, password, full_name, email, phone, create_time, update_time, active) " +
"VALUES (?, ?, ?, ?, ?, ?, ?, ?)";
java.sql.Timestamp now = new java.sql.Timestamp(System.currentTimeMillis());
try (PreparedStatement ps = connection.prepareStatement(query)) {
ps.setString(1, username);
ps.setString(2, password); // 实际应用中应该对密码进行加密处理
ps.setString(3, fullName);
ps.setString(4, email);
ps.setString(5, phone);
ps.setTimestamp(6, now);
ps.setTimestamp(7, now);
ps.setBoolean(8, active);
ps.executeUpdate();
}
}
}

View File

@ -0,0 +1,78 @@
package com.example.util;
public class SqlQueries {
// 查询
public static final String GET_ALL_USERS =
"SELECT id, username, email, full_name, phone, create_time, update_time, active FROM users ORDER BY id";
public static final String GET_USER_BY_ID =
"SELECT id, username, email, full_name, phone, create_time, update_time, active FROM users WHERE id = :id";
public static final String GET_USER_BY_USERNAME =
"SELECT id, username, email, full_name, phone, create_time, update_time, active FROM users WHERE username = :username";
// 分页查询
public static final String GET_USERS_PAGED =
"SELECT id, username, email, full_name, phone, create_time, update_time, active FROM users ORDER BY id LIMIT :limit OFFSET :offset";
// 高级分页查询支持排序和条件筛选
public static final String GET_USERS_ADVANCED =
"SELECT id, username, email, full_name, phone, create_time, update_time, active FROM users " +
"WHERE 1=1 " +
"#{if}(:username != '') AND username LIKE '%' || :username || '%'#{end} " +
"#{if}(:email != '') AND email LIKE '%' || :email || '%'#{end} " +
"#{if}(:phone != '') AND phone LIKE '%' || :phone || '%'#{end} " +
"#{if}(:active != null) AND active = :active#{end} " +
"#{if}(:fromDate != '') AND create_time >= TO_TIMESTAMP(:fromDate, 'YYYY-MM-DD')#{end} " +
"#{if}(:toDate != '') AND create_time <= TO_TIMESTAMP(:toDate, 'YYYY-MM-DD') + INTERVAL '1 day'#{end} " +
"ORDER BY " +
"#{if}(:sortField = 'username') username#{end} " +
"#{if}(:sortField = 'email') email#{end} " +
"#{if}(:sortField = 'createTime') create_time#{end} " +
"#{if}(:sortField = '') id#{end} " +
"#{if}(:sortOrder = 'ASC') ASC#{else} DESC#{end} " +
"LIMIT :limit OFFSET :offset";
public static final String COUNT_USERS_ADVANCED =
"SELECT COUNT(*) as total FROM users " +
"WHERE 1=1 " +
"#{if}(:username != '') AND username LIKE '%' || :username || '%'#{end} " +
"#{if}(:email != '') AND email LIKE '%' || :email || '%'#{end} " +
"#{if}(:phone != '') AND phone LIKE '%' || :phone || '%'#{end} " +
"#{if}(:active != null) AND active = :active#{end} " +
"#{if}(:fromDate != '') AND create_time >= TO_TIMESTAMP(:fromDate, 'YYYY-MM-DD')#{end} " +
"#{if}(:toDate != '') AND create_time <= TO_TIMESTAMP(:toDate, 'YYYY-MM-DD') + INTERVAL '1 day'#{end}";
public static final String COUNT_USERS =
"SELECT COUNT(*) as total FROM users";
// 插入
public static final String CREATE_USER =
"INSERT INTO users (username, email, password, full_name, phone, active, create_time, update_time) " +
"VALUES (:username, :email, :password, :fullName, :phone, :active, NOW(), NOW()) RETURNING id";
// 更新
public static final String UPDATE_USER =
"UPDATE users SET username = :username, email = :email, " +
"password = CASE WHEN :password = '' THEN password ELSE :password END, " +
"full_name = :fullName, phone = :phone, active = :active, update_time = NOW() " +
"WHERE id = :id";
// 删除
public static final String DELETE_USER =
"DELETE FROM users WHERE id = :id";
// 创建用户表 - 用于初始化数据库
public static final String CREATE_USERS_TABLE =
"CREATE TABLE IF NOT EXISTS users (" +
"id SERIAL PRIMARY KEY, " +
"username VARCHAR(50) NOT NULL UNIQUE, " +
"email VARCHAR(100) NOT NULL UNIQUE, " +
"password VARCHAR(255) NOT NULL, " +
"full_name VARCHAR(100), " +
"phone VARCHAR(20), " +
"active BOOLEAN DEFAULT TRUE, " +
"create_time TIMESTAMP NOT NULL, " +
"update_time TIMESTAMP NOT NULL" +
")";
}

View File

@ -0,0 +1,166 @@
package com.example.processor;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.camel.Configuration;
import org.apache.camel.BindToRegistry;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@Configuration
@BindToRegistry("sqlTemplateProcessor")
public class SqlTemplateProcessor implements Processor {
private static final Logger LOG = LoggerFactory.getLogger(UserProcessor.class);
// private static final Pattern IF_PATTERN = Pattern.compile("#\\{if\\}\\((.+?)\\)(.+?)#\\{end\\}", Pattern.DOTALL);
// private static final Pattern IF_ELSE_PATTERN = Pattern.compile("#\\{if\\}\\((.+?)\\)(.+?)#\\{else\\}(.+?)#\\{end\\}", Pattern.DOTALL);
// 简化的正则表达式可能更容易匹配
private static final Pattern IF_PATTERN = Pattern.compile("#\\{if\\}\\(([^)]+)\\)([^#]+)#\\{end\\}", Pattern.DOTALL);
private static final Pattern IF_ELSE_PATTERN = Pattern.compile("#\\{if\\}\\(([^)]+)\\)([^#]+)#\\{else\\}([^#]+)#\\{end\\}", Pattern.DOTALL);
@Override
public void process(Exchange exchange) throws Exception {
// 获取原始SQL模板
String sqlTemplate = exchange.getIn().getHeader("currentSqlString",String.class);
LOG.info("IF_PATTERN: {}", IF_PATTERN);
LOG.info("IF_ELSE_PATTERN: {}", IF_ELSE_PATTERN);
LOG.info("处理前的sql: {}", sqlTemplate);
// 获取参数
Map<String, Object> params = exchange.getIn().getBody(Map.class);
LOG.info("获取到的body里的参数: {}", params);
if (params == null) {
params = exchange.getIn().getHeaders();
}
LOG.info("模板处理的参数: {}", params);
// 处理模板
String processedSql = processSqlTemplate(sqlTemplate, params);
LOG.info("处理后的sql: {}", processedSql);
// 设置处理后的SQL
exchange.getIn().setBody(processedSql);
}
/**
* 处理SQL模板替换条件部分
*/
private String processSqlTemplate(String template, Map<String, Object> params) {
// String result = template;
// // 处理if-else条件
// Matcher ifElseMatcher = IF_ELSE_PATTERN.matcher(result);
// while (ifElseMatcher.find()) {
// String condition = ifElseMatcher.group(1);
// String ifBlock = ifElseMatcher.group(2);
// String elseBlock = ifElseMatcher.group(3);
// boolean conditionResult = evaluateCondition(condition, params);
// String replacement = conditionResult ? ifBlock : elseBlock;
// LOG.info("ifElseMatcher.group(0): {}", ifElseMatcher.group(0));
// result = result.replace(ifElseMatcher.group(0), replacement);
// }
// LOG.info("ifelse处理结果: {}", result);
// // 处理if条件
// Matcher ifMatcher = IF_PATTERN.matcher(result);
// while (ifMatcher.find()) {
// String condition = ifMatcher.group(1);
// String ifBlock = ifMatcher.group(2);
// boolean conditionResult = evaluateCondition(condition, params);
// String replacement = conditionResult ? ifBlock : "";
// result = result.replace(ifMatcher.group(0), replacement);
// }
// LOG.info("if处理结果: {}", result);
// return result.trim().replaceAll("\\s+", " ");
String result = template;
// 处理if-else条件
Matcher ifElseMatcher = IF_ELSE_PATTERN.matcher(result);
StringBuffer sb = new StringBuffer();
while (ifElseMatcher.find()) {
String condition = ifElseMatcher.group(1);
String ifBlock = ifElseMatcher.group(2);
String elseBlock = ifElseMatcher.group(3);
boolean conditionResult = evaluateCondition(condition, params);
String replacement = conditionResult ? ifBlock : elseBlock;
// 使用quoteReplacement处理替换字符串中的特殊字符
ifElseMatcher.appendReplacement(sb, Matcher.quoteReplacement(replacement));
}
ifElseMatcher.appendTail(sb);
result = sb.toString();
// 处理if条件
Matcher ifMatcher = IF_PATTERN.matcher(result);
sb = new StringBuffer();
while (ifMatcher.find()) {
String condition = ifMatcher.group(1);
String ifBlock = ifMatcher.group(2);
boolean conditionResult = evaluateCondition(condition, params);
String replacement = conditionResult ? ifBlock : "";
// 使用quoteReplacement处理替换字符串中的特殊字符
ifMatcher.appendReplacement(sb, Matcher.quoteReplacement(replacement));
}
ifMatcher.appendTail(sb);
return sb.toString().trim().replaceAll("\\s+", " ");
}
/**
* 评估条件表达式
*/
private boolean evaluateCondition(String condition, Map<String, Object> params) {
// 简单解析条件表达式
// 这里只是一个示例实现可能需要更复杂的表达式解析逻辑
condition = condition.trim();
if (condition.contains("!=")) {
String[] parts = condition.split("!=");
String paramName = parts[0].trim().replace(":?", "");
String value = parts[1].trim().replace("'", "");
Object paramValue = params.get(paramName);
if (paramValue == null) return false;
if (value.equals("null")) {
return paramValue != null;
} else if (value.equals("''")) {
return paramValue != null && !paramValue.toString().isEmpty();
} else {
return !paramValue.toString().equals(value);
}
} else if (condition.contains("=")) {
String[] parts = condition.split("=");
String paramName = parts[0].trim().replace(":?", "");
String value = parts[1].trim().replace("'", "");
Object paramValue = params.get(paramName);
if (value.equals("null")) {
return paramValue == null;
} else if (value.equals("''")) {
return paramValue == null || paramValue.toString().isEmpty();
} else {
return paramValue != null && paramValue.toString().equals(value);
}
}
return false;
}
}

120
camel-jdbc-yml/User.java Normal file
View File

@ -0,0 +1,120 @@
package com.example.model;
import java.util.Date;
public class User {
private Long id;
private String username;
private String email;
private String password;
private String fullName;
private String phone;
private Date createTime;
private Date updateTime;
private boolean active;
// 默认构造函数
public User() {
}
// 带参数的构造函数
public User(Long id, String username, String email, String password, String fullName,
String phone, Date createTime, Date updateTime, boolean active) {
this.id = id;
this.username = username;
this.email = email;
this.password = password;
this.fullName = fullName;
this.phone = phone;
this.createTime = createTime;
this.updateTime = updateTime;
this.active = active;
}
// Getter和Setter方法
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getFullName() {
return fullName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
public boolean isActive() {
return active;
}
public void setActive(boolean active) {
this.active = active;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", email='" + email + '\'' +
", fullName='" + fullName + '\'' +
", phone='" + phone + '\'' +
", createTime=" + createTime +
", updateTime=" + updateTime +
", active=" + active +
'}';
}
}

View File

@ -0,0 +1,309 @@
package com.example.processor;
import com.example.model.User;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.camel.Exchange;
import org.apache.camel.Configuration;
import org.apache.camel.BindToRegistry;
import org.apache.camel.Processor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Configuration
@BindToRegistry("userProcessor")
public class UserProcessor implements Processor {
private static final Logger LOG = LoggerFactory.getLogger(UserProcessor.class);
private static final ObjectMapper objectMapper = new ObjectMapper();
@Override
public void process(Exchange exchange) throws Exception {
String operation = exchange.getIn().getHeader("operation", String.class);
LOG.info("处理用户操作: {}", operation);
switch (operation) {
case "transformUserInput":
transformUserInput(exchange);
break;
case "prepareUserResponse":
prepareUserResponse(exchange);
break;
case "prepareUsersResponse":
prepareUsersResponse(exchange);
break;
case "preparePagedUsersResponse":
preparePagedUsersResponse(exchange);
break;
case "preparePageParams":
preparePageParams(exchange);
break;
case "prepareAdvancedSearchParams":
prepareAdvancedSearchParams(exchange);
break;
case "prepareErrorResponse":
prepareErrorResponse(exchange);
break;
case "prepareCreateUserParams":
prepareCreateUserParams(exchange);
break;
case "prepareUpdateUserParams":
prepareUpdateUserParams(exchange);
break;
default:
LOG.warn("未知操作: {}", operation);
exchange.getIn().setBody("未知操作");
exchange.getIn().setHeader(Exchange.HTTP_RESPONSE_CODE, 400);
}
}
private void transformUserInput(Exchange exchange) throws Exception {
String body = exchange.getIn().getBody(String.class);
User user = objectMapper.readValue(body, User.class);
exchange.getIn().setBody(user);
}
private void prepareUserResponse(Exchange exchange) throws Exception {
List<Map<String, Object>> resultList = exchange.getIn().getBody(List.class);
if (resultList == null || resultList.isEmpty()) {
exchange.getIn().setBody("{\"message\": \"用户不存在\"}");
exchange.getIn().setHeader(Exchange.HTTP_RESPONSE_CODE, 404);
return;
}
Map<String, Object> result = resultList.get(0);
User user = mapToUser(result);
exchange.getIn().setBody(user);
}
private void prepareUsersResponse(Exchange exchange) throws Exception {
List<Map<String, Object>> resultList = exchange.getIn().getBody(List.class);
if (resultList == null) {
resultList = new ArrayList<>();
}
List<User> users = new ArrayList<>();
for (Map<String, Object> result : resultList) {
users.add(mapToUser(result));
}
LOG.info("进入处理数据过程方法获取到的list: {}", users);
exchange.getIn().setBody(users);
}
private void preparePagedUsersResponse(Exchange exchange) throws Exception {
// 获取用户数据
List<Map<String, Object>> resultList = exchange.getIn().getBody(List.class);
if (resultList == null) {
resultList = new ArrayList<>();
}
// 转换用户对象
List<User> users = new ArrayList<>();
for (Map<String, Object> result : resultList) {
users.add(mapToUser(result));
}
// 获取总记录数
Long total = exchange.getProperty("totalCount", Long.class);
if (total == null) {
total = 0L;
}
// 获取分页参数
int page = exchange.getIn().getHeader("page", Integer.class);
int size = exchange.getIn().getHeader("size", Integer.class);
// 构建分页响应对象
Map<String, Object> response = new HashMap<>();
response.put("content", users);
response.put("totalElements", total);
response.put("totalPages", (int) Math.ceil((double) total / size));
response.put("page", page);
response.put("size", size);
response.put("numberOfElements", users.size());
exchange.getIn().setBody(response);
}
private void preparePageParams(Exchange exchange) {
// 获取页码和每页大小参数默认值为第1页每页10条记录
String pageParam = exchange.getIn().getHeader("page", "1", String.class);
String sizeParam = exchange.getIn().getHeader("size", "10", String.class);
int page = Integer.parseInt(pageParam);
int size = Integer.parseInt(sizeParam);
// 确保页码和每页大小有效
page = Math.max(1, page);
size = Math.max(1, Math.min(100, size)); // 限制每页最多100条记录
// 计算偏移量
int offset = (page - 1) * size;
// 将参数设置到消息头中
exchange.getIn().setHeader("page", page);
exchange.getIn().setHeader("size", size);
exchange.getIn().setHeader("offset", offset);
exchange.getIn().setHeader("limit", size);
// 创建参数Map用于SQL查询
Map<String, Object> params = new HashMap<>();
params.put("limit", size);
params.put("offset", offset);
exchange.getIn().setBody(params);
LOG.info("分页参数: page={}, size={}, offset={}", page, size, offset);
}
private void prepareAdvancedSearchParams(Exchange exchange) {
// 获取分页参数
String pageParam = exchange.getIn().getHeader("page", "1", String.class);
String sizeParam = exchange.getIn().getHeader("size", "10", String.class);
int page = Integer.parseInt(pageParam);
int size = Integer.parseInt(sizeParam);
// 确保页码和每页大小有效
page = Math.max(1, page);
size = Math.max(1, Math.min(100, size)); // 限制每页最多100条记录
// 计算偏移量
int offset = (page - 1) * size;
// 获取查询参数
String username = exchange.getIn().getHeader("username", "", String.class);
String email = exchange.getIn().getHeader("email", "", String.class);
String phone = exchange.getIn().getHeader("phone", "", String.class);
String activeStr = exchange.getIn().getHeader("active", "", String.class);
String fromDate = exchange.getIn().getHeader("fromDate", "", String.class);
String toDate = exchange.getIn().getHeader("toDate", "", String.class);
// 获取排序参数
String sortField = exchange.getIn().getHeader("sortField", "", String.class);
String sortOrder = exchange.getIn().getHeader("sortOrder", "DESC", String.class);
// 验证排序字段
if (!sortField.isEmpty() && !isValidSortField(sortField)) {
sortField = ""; // 无效的排序字段使用默认排序字段(id)
}
// 验证排序顺序
if (!sortOrder.equals("ASC") && !sortOrder.equals("DESC")) {
sortOrder = "DESC"; // 无效的排序顺序使用默认排序顺序
}
// 解析布尔值
Boolean active = null;
if (!activeStr.isEmpty()) {
active = Boolean.parseBoolean(activeStr);
}
// 将参数设置到消息头中
exchange.getIn().setHeader("page", page);
exchange.getIn().setHeader("size", size);
exchange.getIn().setHeader("offset", offset);
exchange.getIn().setHeader("limit", size);
exchange.getIn().setHeader("active", active);
exchange.getIn().setHeader("sortField", sortField);
exchange.getIn().setHeader("sortOrder", sortOrder);
// 创建参数Map用于SQL查询
Map<String, Object> params = new HashMap<>();
params.put("username", username);
params.put("email", email);
params.put("phone", phone);
params.put("active", active);
params.put("fromDate", fromDate);
params.put("toDate", toDate);
params.put("sortField", sortField);
params.put("sortOrder", sortOrder);
params.put("limit", size);
params.put("offset", offset);
exchange.getIn().setBody(params);
LOG.info("高级查询参数: page={}, size={}, username={}, email={}, active={}, sortField={}, sortOrder={}",
page, size, username, email, active, sortField, sortOrder);
}
private boolean isValidSortField(String field) {
return field.equals("username") || field.equals("email") || field.equals("createTime");
}
private void prepareErrorResponse(Exchange exchange) {
Exception exception = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Exception.class);
String errorMessage = exception != null ? exception.getMessage() : "未知错误";
Map<String, Object> errorResponse = new HashMap<>();
errorResponse.put("error", true);
errorResponse.put("message", errorMessage);
exchange.getIn().setBody(errorResponse);
exchange.getIn().setHeader(Exchange.HTTP_RESPONSE_CODE, 500);
}
private void prepareCreateUserParams(Exchange exchange) {
User user = exchange.getIn().getBody(User.class);
Map<String, Object> params = new HashMap<>();
params.put("username", user.getUsername());
params.put("email", user.getEmail());
params.put("password", user.getPassword());
params.put("fullName", user.getFullName());
params.put("phone", user.getPhone());
params.put("active", user.isActive());
exchange.getIn().setHeader("username", user.getUsername());
exchange.getIn().setHeader("email", user.getEmail());
exchange.getIn().setHeader("password", user.getPassword());
exchange.getIn().setHeader("fullName", user.getFullName());
exchange.getIn().setHeader("phone", user.getPhone());
exchange.getIn().setHeader("active", user.isActive());
exchange.getIn().setBody(params);
}
private void prepareUpdateUserParams(Exchange exchange) {
User user = exchange.getIn().getBody(User.class);
String userId = exchange.getIn().getHeader("userId", String.class);
Map<String, Object> params = new HashMap<>();
params.put("id", Long.parseLong(userId));
params.put("username", user.getUsername());
params.put("email", user.getEmail());
params.put("password", user.getPassword());
params.put("fullName", user.getFullName());
params.put("phone", user.getPhone());
params.put("active", user.isActive());
exchange.getIn().setHeader("id", Long.parseLong(userId));
exchange.getIn().setHeader("username", user.getUsername());
exchange.getIn().setHeader("email", user.getEmail());
exchange.getIn().setHeader("password", user.getPassword());
exchange.getIn().setHeader("fullName", user.getFullName());
exchange.getIn().setHeader("phone", user.getPhone());
exchange.getIn().setHeader("active", user.isActive());
exchange.getIn().setBody(params);
}
private User mapToUser(Map<String, Object> result) {
User user = new User();
user.setId(((Number) result.get("id")).longValue());
user.setUsername((String) result.get("username"));
user.setEmail((String) result.get("email"));
user.setPassword(null); // 出于安全考虑不返回密码
user.setFullName((String) result.get("full_name"));
user.setPhone((String) result.get("phone"));
user.setCreateTime((java.sql.Timestamp) result.get("create_time"));
user.setUpdateTime((java.sql.Timestamp) result.get("update_time"));
user.setActive((Boolean) result.get("active"));
return user;
}
}

View File

@ -0,0 +1,38 @@
camel.karavan.projectId=camel-jdbc-yml
camel.karavan.projectName=camel-jdbc-yml
camel.jbang.gav=org.camel.karavan.demo:cameljdbcyml:1
camel.jbang.runtime=camel-main
camel.jbang.version=4.10.0
camel.jbang.dependencies=camel-console,camel-platform-http-main
camel.jbang.jib-maven-plugin-version=3.4.4
camel.server.enabled=true
camel.server.healthCheckEnabled=true
camel.server.devConsoleEnabled=true
camel.main.name=camel-jdbc-yml
camel.main.tracingStandby=true
camel.trace.enabled=true
camel.main.autoConfigurationFailFast=false
camel.routecontroller.superviseEnabled=true
camel.routecontroller.backoffDelay=5000
camel.routecontroller.backoffMaxAttempts=100
camel.routecontroller.initialDelay=1000
camel.routecontroller.threadPoolSize=3
camel.context.dev-console=true
camel.health.enabled=true
camel.health.exposure-level=full
jkube.version=1.18.0
jib.from.image=gcr.io/distroless/java17@sha256:68e2373f7bef9486c08356bd9ffd3b40b56e6b9316c5f6885eb58b1d9093b43d
# SQL查询配置
sqlQueries.getAllUsers=SELECT id, username, email, full_name, phone, create_time, update_time, active FROM users ORDER BY id
sqlQueries.getUserById=SELECT id, username, email, full_name, phone, create_time, update_time, active FROM users WHERE id = :?id
sqlQueries.getUserByUsername=SELECT id, username, email, full_name, phone, create_time, update_time, active FROM users WHERE username = :?username
sqlQueries.getUsersPaged=SELECT id, username, email, full_name, phone, create_time, update_time, active FROM users ORDER BY id LIMIT :?limit OFFSET :?offset
sqlQueries.countUsers=SELECT COUNT(*) as total FROM users
# 高级分页查询SQL
sqlQueries.getUsersAdvanced=SELECT id, username, email, full_name, phone, create_time, update_time, active FROM users WHERE 1=1 #{if}(:?username != '') AND username LIKE '%' || :?username || '%'#{end} #{if}(:?email != '') AND email LIKE '%' || :?email || '%'#{end} #{if}(:?phone != '') AND phone LIKE '%' || :?phone || '%'#{end} #{if}(:?active != null) AND active = :?active#{end} #{if}(:?fromDate != '') AND create_time >= TO_TIMESTAMP(:?fromDate, 'YYYY-MM-DD')#{end} #{if}(:?toDate != '') AND create_time <= TO_TIMESTAMP(:?toDate, 'YYYY-MM-DD') + INTERVAL '1 day'#{end} ORDER BY #{if}(:?sortField = 'username') username#{end} #{if}(:?sortField = 'email') email#{end} #{if}(:?sortField = 'createTime') create_time#{end} #{if}(:?sortField = '') id#{end} #{if}(:?sortOrder = 'ASC') ASC #{else} DESC#{end} LIMIT :?limit OFFSET :?offset
sqlQueries.countUsersAdvanced=SELECT COUNT(*) as total FROM users WHERE 1=1 #{if}(:?username != '') AND username LIKE '%' || :?username || '%'#{end} #{if}(:?email != '') AND email LIKE '%' || :?email || '%'#{end} #{if}(:?phone != '') AND phone LIKE '%' || :?phone || '%'#{end} #{if}(:?active != null) AND active = :?active#{end} #{if}(:?fromDate != '') AND create_time >= TO_TIMESTAMP(:?fromDate, 'YYYY-MM-DD')#{end} #{if}(:?toDate != '') AND create_time <= TO_TIMESTAMP(:?toDate, 'YYYY-MM-DD') + INTERVAL '1 day'#{end}
sqlQueries.createUser=INSERT INTO users (username, email, password, full_name, phone, active, create_time, update_time) VALUES (:?username, :?email, :?password, :?fullName, :?phone, :?active, NOW(), NOW()) RETURNING id
sqlQueries.updateUser=UPDATE users SET username = :?username, email = :?email, password = CASE WHEN :?password = '' THEN password ELSE :?password END, full_name = :?fullName, phone = :?phone, active = :?active, update_time = NOW() WHERE id = :?id
sqlQueries.deleteUser=DELETE FROM users WHERE id = :?id

View File

@ -0,0 +1,44 @@
- rest:
id: rest-8fb6
path: /api/db
consumes: application/json
produces: application/json
post:
- id: post-77e8
description: 初始化数据库
path: /init
to: direct:initDatabase
- route:
id: route-85b8
nodePrefixId: route-b60
from:
id: from-5e76
uri: direct
parameters:
name: initDatabase
steps:
- log:
id: log-5310
message: 初始化数据库...
loggingLevel: INFO
logName: com.example.route.init
- process:
id: process-0abf
ref: databaseInitializer
- log:
id: log-5124
message: 数据库初始化完成
loggingLevel: INFO
logName: com.example.route.init
- beans:
- name: postgresDatabase
type: "#class:org.apache.commons.dbcp2.BasicDataSource"
properties:
username: postgres
password: 1qaz123$
url: jdbc:postgresql://192.168.56.12:5432/user_db2
driverClassName: org.postgresql.Driver
- name: databaseInitializer
type: com.example.util.DatabaseInitializer
properties:
dataSource: "#postgresDatabase"

View File

@ -0,0 +1,8 @@
services:
camel-jdbc-yml:
image: camel-jdbc-yml
restart: always
ports:
- "8083:8080"
networks:
- karavan

View File

@ -0,0 +1,2 @@
deps=\
org.projectlombok:lombok:1.18.30

View File

@ -0,0 +1,480 @@
- rest:
id: rest-07ff
description: 用户管理服务
path: /api/user
consumes: application/json
produces: application/json
enableCORS: true
delete:
- id: delete-f299
description: 删除用户
path: /users/{id}
to: direct:deleteUser
get:
- id: get-9c5f
description: 获取所有用户列表
path: /users
to: direct:getAllUsers
- id: get-8b43
description: 分页获取用户列
path: /users/page
to: direct:getPagedUsers
- id: get-d3ba
description: 高级条件分页查询用户列表
path: /users/search
to: direct:searchUsers
- id: get-d3be
description: 根据ID获取用户
path: /users/{id}
to: direct:getUserById
post:
- id: post-1d53
description: 创建新用户
path: /users
to: direct:createUser
put:
- id: put-db0e
description: 更新用户信息
path: /users/{id}
to: direct:updateUser
- route:
id: route-105a
nodePrefixId: route-a43
from:
id: from-16fb
uri: direct
parameters:
name: getAllUsers
steps:
- log:
id: log-6e8e
message: 获取所有用户
loggingLevel: INFO
logName: com.example.route.user
- setBody:
id: setBody-77bf
expression:
simple:
id: simple-2c02
expression: "{{sqlQueries.getAllUsers}}"
- to:
id: to-c4fc
uri: jdbc
parameters:
dataSourceName: postgresDatabase
useHeadersAsParameters: true
- setHeader:
id: setHeader-d25f
name: operation
expression:
constant:
id: constant-2e75
expression: prepareUsersResponse
- process:
id: process-f54d
disabled: false
ref: userProcessor
- marshal:
id: marshal-e9a1
json:
id: json-0f7d
- route:
id: getPagedUsers
from:
id: from-5c0c
uri: direct
parameters:
name: getPagedUsers
steps:
- log:
id: log-31eb
message: "分页获取用户, 页码: ${header.page:1}, 每页大小: ${header.size:10}"
loggingLevel: INFO
logName: com.example.route.user
- setHeader:
id: setHeader-d9ec
name: operation
expression:
constant:
id: constant-1c9c
expression: preparePageParams
- process:
id: process-4371
ref: userProcessor
- setBody:
id: setBody-5589
expression:
simple:
id: simple-a8ff
expression: "{{sqlQueries.countUsers}}"
- to:
id: to-4340
uri: jdbc
parameters:
dataSourceName: postgresDatabase
useHeadersAsParameters: true
- setProperty:
id: setProperty-f6b8
name: totalCount
expression:
simple:
id: simple-1f8a
expression: ${body[0][total]}
- setBody:
id: setBody-c884
expression:
simple:
id: simple-9c4f
expression: "{{sqlQueries.getUsersPaged}}"
- log:
id: log-90e9
message: ${header.limit}
- to:
id: to-0f55
uri: jdbc
parameters:
dataSourceName: postgresDatabase
useHeadersAsParameters: true
- setHeader:
id: setHeader-1efb
name: operation
expression:
constant:
id: constant-2ee8
expression: preparePagedUsersResponse
- process:
id: process-554a
ref: userProcessor
- marshal:
id: marshal-a1c8
json:
id: json-5e5d
prettyPrint: true
library: Jackson
- route:
id: searchUsers
from:
id: from-47c2
uri: direct
parameters:
name: searchUsers
steps:
- log:
id: log-6ff5
message: "高级条件分页查询用户, 页码: ${header.page:1}, 每页大小: ${header.size:10}"
loggingLevel: INFO
logName: com.example.route.user
- setHeader:
id: setHeader-f797
name: operation
expression:
constant:
id: constant-f72a
expression: prepareAdvancedSearchParams
- process:
id: process-da37
ref: userProcessor
- log:
id: log-246f
message: ${body}
- setHeader:
id: setHeader-6296
name: currentSqlString
expression:
simple:
id: simple-914d
expression: "{{sqlQueries.countUsersAdvanced}}"
- process:
id: process-4968
ref: sqlTemplateProcessor
- to:
id: to-f0bc
uri: jdbc
parameters:
useHeadersAsParameters: true
dataSourceName: postgresDatabase
- log:
id: log-82f8
message: ${body}
- setProperty:
id: setProperty-906d
name: totalCount
expression:
simple:
id: simple-e305
expression: ${body[0][total]}
- log:
id: log-7a44
message: ${body}
- setHeader:
id: setHeader-68e3
name: currentSqlString
expression:
simple:
id: simple-89c5
expression: "{{sqlQueries.getUsersAdvanced}}"
- process:
id: process-f123
ref: sqlTemplateProcessor
- to:
id: to-6e07
uri: jdbc
parameters:
useHeadersAsParameters: true
dataSourceName: postgresDatabase
- setHeader:
id: setHeader-8430
name: operation
expression:
constant:
id: constant-c99d
expression: preparePagedUsersResponse
- process:
id: process-0298
ref: userProcessor
- marshal:
id: marshal-c907
json:
id: json-7acc
prettyPrint: true
library: Jackson
- route:
id: getUserById
from:
id: from-23ea
uri: direct
parameters:
name: getUserById
exchangePattern: InOut
bridgeErrorHandler: false
steps:
- setHeader:
id: setHeader-e275
name: id
expression:
simple:
id: simple-1c32
expression: ${header.id}
resultType: java.lang.Integer
- log:
id: log-c926
message: "获取用户, ID: ${header.id}"
loggingLevel: INFO
logName: com.example.route.user
- setBody:
id: setBody-7134
expression:
simple:
id: simple-f675
expression: "{{sqlQueries.getUserById}}"
- to:
id: to-8cfb
uri: jdbc
parameters:
dataSourceName: postgresDatabase
useHeadersAsParameters: true
- setHeader:
id: setHeader-0daf
name: operation
expression:
constant:
id: constant-983d
expression: prepareUserResponse
- process:
id: process-17cb
ref: userProcessor
- marshal:
id: marshal-b95e
json:
id: json-a5d8
prettyPrint: true
library: Jackson
- route:
id: createUser
from:
id: from-1ec8
uri: direct
parameters:
name: createUser
steps:
- log:
id: log-35e9
message: 创建新用户
loggingLevel: INFO
logName: com.example.route.user
- setHeader:
id: setHeader-4c3c
name: operation
expression:
constant:
id: constant-8d18
expression: transformUserInput
- process:
id: process-245c
ref: userProcessor
- log:
id: log-240e
message: ${body}
- setHeader:
id: setHeader-9207
name: operation
expression:
constant:
id: constant-faa6
expression: prepareCreateUserParams
- process:
id: process-e775
ref: userProcessor
- setBody:
id: setBody-c7e8
expression:
simple:
id: simple-b71c
expression: "{{sqlQueries.createUser}}"
- to:
id: to-4bb8
uri: jdbc
parameters:
dataSourceName: postgresDatabase
useHeadersAsParameters: true
- setHeader:
id: setHeader-0faa
name: id
expression:
simple:
id: simple-01ff
expression: ${body[0][id]}
resultType: java.lang.Long
- log:
id: log-15e9
message: ${body}
- to:
id: to-2c98
uri: direct
parameters:
name: getUserById
- route:
id: updateUser
from:
id: from-128b
uri: direct
parameters:
name: updateUser
steps:
- log:
id: log-14db
message: "更新用户, ID: ${header.id}"
loggingLevel: INFO
logName: com.example.route.user
- setHeader:
id: setHeader-4af3
name: userId
expression:
simple:
id: simple-12f9
expression: ${header.id}
- setHeader:
id: setHeader-a5ac
name: operation
expression:
constant:
id: constant-3706
expression: transformUserInput
- process:
id: process-12c8
ref: userProcessor
- setHeader:
id: setHeader-61a6
name: operation
expression:
constant:
id: constant-93f8
expression: prepareUpdateUserParams
- process:
id: process-e394
ref: userProcessor
- setBody:
id: setBody-4800
expression:
simple:
id: simple-0e51
expression: "{{sqlQueries.updateUser}}"
- to:
id: to-3638
uri: jdbc
parameters:
dataSourceName: postgresDatabase
useHeadersAsParameters: true
- to:
id: to-b2b2
uri: direct
parameters:
name: getUserById
- route:
id: deleteUser
from:
id: from-41af
uri: direct
parameters:
name: deleteUser
steps:
- log:
id: log-11fe
message: "删除用户, ID: ${header.id}"
loggingLevel: INFO
logName: com.example.route.user
- setHeader:
id: setHeader-b17d
name: id
expression:
simple:
id: simple-2279
expression: ${header.id}
resultType: java.lang.Integer
- setBody:
id: setBody-8640
expression:
simple:
id: simple-70e3
expression: "{{sqlQueries.deleteUser}}"
- to:
id: to-0b43
uri: jdbc
parameters:
dataSourceName: postgresDatabase
useHeadersAsParameters: true
- setBody:
id: setBody-568f
expression:
constant:
id: constant-531e
expression: "{\"message\": \"用户已成功删除\"}"
- route:
id: errorHandler
from:
id: from-e7fa
uri: direct
parameters:
name: errorHandler
steps:
- log:
id: log-1da4
message: "处理错误: ${exception.message}"
loggingLevel: ERROR
logName: com.example.route.error
- setHeader:
id: setHeader-4be1
name: operation
expression:
constant:
id: constant-59c3
expression: prepareErrorResponse
- process:
id: process-17a9
ref: userProcessor
- marshal:
id: marshal-5aec
json:
id: json-1ef9
prettyPrint: true
library: Jackson

20
camel-jdbc/User.java Normal file
View File

@ -0,0 +1,20 @@
//DEPS org.projectlombok:lombok:1.18.30
package com.example.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private Long id;
private String username;
private String email;
private String fullName;
private String phone;
private String createTime;
private String updateTime;
}

View File

@ -0,0 +1,24 @@
camel.karavan.projectId=camel-jdbc
camel.karavan.projectName=camel-jdbc
camel.jbang.gav=org.camel.karavan.demo:cameljdbc:1
camel.jbang.runtime=camel-main
camel.jbang.version=4.10.0
camel.jbang.dependencies=camel-console,camel-platform-http-main,
camel.jbang.jib-maven-plugin-version=3.4.4
camel.server.enabled=true
camel.server.healthCheckEnabled=true
camel.server.devConsoleEnabled=true
camel.main.name=camel-jdbc
camel.main.tracingStandby=true
camel.trace.enabled=true
camel.main.autoConfigurationFailFast=false
camel.routecontroller.superviseEnabled=true
camel.routecontroller.backoffDelay=5000
camel.routecontroller.backoffMaxAttempts=100
camel.routecontroller.initialDelay=1000
camel.routecontroller.threadPoolSize=3
camel.context.dev-console=true
camel.health.enabled=true
camel.health.exposure-level=full
jkube.version=1.18.0
jib.from.image=gcr.io/distroless/java17@sha256:68e2373f7bef9486c08356bd9ffd3b40b56e6b9316c5f6885eb58b1d9093b43d

View File

@ -0,0 +1,281 @@
- rest:
id: user-api
description: 用户服务
path: /api/users
consumes: application/json
produces: application/json
delete:
- id: delete-984c
description: 删除用户
path: /deleteUser/{id}
to: direct:deleteUser
outType: java.lang.String
get:
- id: get-8b80
description: 获取所有用户列表
path: /getAllUsers
to: direct:getAllUsers
outType: java.util.List
- id: get-95c8
description: 根据ID获取用户信息
path: /getUserById/{id}
to: direct:getUserById
post:
- id: post-c96c
description: 创建新用户
path: /createUser
to: direct:createUser
type: com.example.model.User
outType: com.example.model.User
bindingMode: json
put:
- id: put-fa43
description: 更新用户信息
path: /updateUser/{id}
to: direct:updateUser
type: com.example.model.User
outType: com.example.model.User
- route:
id: get-all-users-route
from:
id: from-0b1c
uri: direct
parameters:
name: getAllUsers
steps:
- setBody:
id: setBody-fd7e
expression:
constant:
id: constant-5729
expression: >-
SELECT id, username, email, full_name, phone, create_time,
update_time FROM users ORDER BY id
- to:
id: to-a097
uri: jdbc
parameters:
dataSourceName: PostgresDatabase
- marshal:
id: marshal-f876
json:
id: json-4aff
- route:
id: get-user-by-id-route
from:
id: from-c50a
uri: direct
parameters:
name: getUserById
steps:
- setBody:
id: setBody-ff17
expression:
simple:
id: simple-137e
expression: >-
SELECT id, username, email, full_name as fullName, phone,
create_time as createTime, update_time as updateTime FROM
users WHERE id = ${header.id}
- to:
id: to-5ad5
uri: jdbc
parameters:
dataSourceName: dataSource
- choice:
id: choice-4f8d
when:
- id: when-c8e8
expression:
simple:
id: simple-73fc
expression: ${body.size} > 0
steps:
- transform:
id: transform-5efd
expression:
simple:
id: simple-84b8
expression: ${body[0]}
- marshal:
id: marshal-6650
json:
id: json-7743
otherwise:
id: otherwise-b227
steps:
- setHeader:
id: setHeader-15a3
name: CamelHttpResponseCode
expression:
constant:
id: constant-37e1
expression: "404"
- setBody:
id: setBody-634d
expression:
constant:
id: constant-50fa
expression: "{\"error\": \"用户不存在\"}"
- marshal:
id: marshal-f5a3
json:
id: json-cf61
- route:
id: create-user-route
from:
id: from-b805
uri: direct
parameters:
name: createUser
steps:
- setBody:
id: setBody-2d9f
expression:
simple:
id: simple-9223
expression: >-
INSERT INTO users (username, email, full_name, phone) VALUES
('${body.username}', '${body.email}', '${body.fullName}',
'${body.phone}') RETURNING id, username, email, full_name as
fullName, phone, create_time as createTime, update_time as
updateTime
- to:
id: to-c2d7
uri: jdbc
parameters:
dataSourceName: dataSource
- transform:
id: transform-47bb
expression:
simple:
id: simple-f601
expression: ${body[0]}
- route:
id: update-user-route
from:
id: from-72c4
uri: direct
parameters:
name: updateUser
steps:
- setBody:
id: setBody-67d8
expression:
simple:
id: simple-a84e
expression: >-
UPDATE users SET username = '${body.username}',
email = '${body.email}',
full_name = '${body.fullName}',
phone = '${body.phone}',
update_time = CURRENT_TIMESTAMP
WHERE id = ${header.id} RETURNING id, username, email,
full_name as fullName, phone, create_time as createTime,
update_time as updateTime
- to:
id: to-183c
uri: jdbc
parameters:
dataSourceName: dataSource
- choice:
id: choice-56d3
when:
- id: when-ccfc
expression:
simple:
id: simple-5121
expression: ${body.size} > 0
steps:
- transform:
id: transform-9765
expression:
simple:
id: simple-f8e2
expression: ${body[0]}
otherwise:
id: otherwise-181a
steps:
- setHeader:
id: setHeader-5730
name: CamelHttpResponseCode
expression:
constant:
id: constant-82c6
expression: "404"
- setBody:
id: setBody-a681
expression:
constant:
id: constant-ced6
expression: "{\"error\": \"用户不存在\"}"
- marshal:
id: marshal-18ea
json:
id: json-c22b
- route:
id: delete-user-route
from:
id: from-59ba
uri: direct
parameters:
name: deleteUser
steps:
- setBody:
id: setBody-ccdd
expression:
simple:
id: simple-e35c
expression: DELETE FROM users WHERE id = ${header.id} RETURNING id
- to:
id: to-737a
uri: jdbc
parameters:
dataSourceName: dataSource
- choice:
id: choice-723e
when:
- id: when-ae6b
expression:
simple:
id: simple-5896
expression: ${body.size} > 0
steps:
- setBody:
id: setBody-1279
expression:
constant:
id: constant-67fc
expression: "{\"message\": \"用户已成功删除\"}"
- marshal:
id: marshal-5a7a
json:
id: json-6243
otherwise:
id: otherwise-2317
steps:
- setHeader:
id: setHeader-ff9f
name: CamelHttpResponseCode
expression:
constant:
id: constant-57b7
expression: "404"
- setBody:
id: setBody-1ee6
expression:
constant:
id: constant-de9d
expression: "{\"error\": \"用户不存在\"}"
- marshal:
id: marshal-7fca
json:
id: json-ff43
- beans:
- name: PostgresDatabase
type: "#class:org.apache.commons.dbcp2.BasicDataSource"
properties:
username: postgres
password: 1qaz123$
url: jdbc:postgresql://192.168.56.12:5432/user_db
driverClassName: org.postgresql.Driver

View File

@ -0,0 +1,8 @@
services:
camel-jdbc:
image: camel-jdbc
restart: always
ports:
- "8081:8080"
networks:
- karavan