初始化项目
This commit is contained in:
commit
d3ebc8a6ef
101
camel-jdbc-yml/DatabaseInitializer.java
Normal file
101
camel-jdbc-yml/DatabaseInitializer.java
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
78
camel-jdbc-yml/SqlQueries.java
Normal file
78
camel-jdbc-yml/SqlQueries.java
Normal 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" +
|
||||
")";
|
||||
}
|
166
camel-jdbc-yml/SqlTemplateProcessor.java
Normal file
166
camel-jdbc-yml/SqlTemplateProcessor.java
Normal 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
120
camel-jdbc-yml/User.java
Normal 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 +
|
||||
'}';
|
||||
}
|
||||
}
|
309
camel-jdbc-yml/UserProcessor.java
Normal file
309
camel-jdbc-yml/UserProcessor.java
Normal 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;
|
||||
}
|
||||
}
|
38
camel-jdbc-yml/application.properties
Normal file
38
camel-jdbc-yml/application.properties
Normal 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
|
44
camel-jdbc-yml/database.camel.yaml
Normal file
44
camel-jdbc-yml/database.camel.yaml
Normal 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"
|
8
camel-jdbc-yml/docker-compose.yaml
Normal file
8
camel-jdbc-yml/docker-compose.yaml
Normal file
@ -0,0 +1,8 @@
|
||||
services:
|
||||
camel-jdbc-yml:
|
||||
image: camel-jdbc-yml
|
||||
restart: always
|
||||
ports:
|
||||
- "8083:8080"
|
||||
networks:
|
||||
- karavan
|
2
camel-jdbc-yml/jbang.properties
Normal file
2
camel-jdbc-yml/jbang.properties
Normal file
@ -0,0 +1,2 @@
|
||||
deps=\
|
||||
org.projectlombok:lombok:1.18.30
|
480
camel-jdbc-yml/user-manage.camel.yaml
Normal file
480
camel-jdbc-yml/user-manage.camel.yaml
Normal 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
20
camel-jdbc/User.java
Normal 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;
|
||||
}
|
24
camel-jdbc/application.properties
Normal file
24
camel-jdbc/application.properties
Normal 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
|
281
camel-jdbc/camel-jdbc.camel.yaml
Normal file
281
camel-jdbc/camel-jdbc.camel.yaml
Normal 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
|
8
camel-jdbc/docker-compose.yaml
Normal file
8
camel-jdbc/docker-compose.yaml
Normal file
@ -0,0 +1,8 @@
|
||||
services:
|
||||
camel-jdbc:
|
||||
image: camel-jdbc
|
||||
restart: always
|
||||
ports:
|
||||
- "8081:8080"
|
||||
networks:
|
||||
- karavan
|
Loading…
x
Reference in New Issue
Block a user