mirror of
https://gitee.com/mybatis-flex/mybatis-flex.git
synced 2025-12-08 17:48:25 +08:00
commit
98c555d451
@ -8,7 +8,7 @@ public class Account{
|
|||||||
|
|
||||||
@Id(keyType = KeyType.Auto)
|
@Id(keyType = KeyType.Auto)
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
private TypeEnum typeEnum;
|
private TypeEnum typeEnum;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@ -30,26 +30,56 @@ public enum TypeEnum {
|
|||||||
|
|
||||||
@EnumValue
|
@EnumValue
|
||||||
private int code;
|
private int code;
|
||||||
|
|
||||||
private String desc;
|
private String desc;
|
||||||
|
|
||||||
TypeEnum(int code, String desc) {
|
TypeEnum(int code, String desc) {
|
||||||
this.code = code;
|
this.code = code;
|
||||||
this.desc = desc;
|
this.desc = desc;
|
||||||
}
|
}
|
||||||
|
|
||||||
//getter
|
//getter
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```java
|
||||||
|
|
||||||
|
@AllArgsConstructor
|
||||||
|
public enum EnableEnum {
|
||||||
|
/**
|
||||||
|
* 启用
|
||||||
|
*/
|
||||||
|
ENABLE(1, "启用"),
|
||||||
|
/**
|
||||||
|
* 禁用
|
||||||
|
*/
|
||||||
|
DISABLE(0, "禁用"),
|
||||||
|
;
|
||||||
|
private final int code;
|
||||||
|
private final String desc;
|
||||||
|
|
||||||
|
@EnumValue
|
||||||
|
public int getCode() {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDesc() {
|
||||||
|
return desc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
通过注解 `@EnumValue` 为 `code` 属性标注后,当我们保存 Account 内容到数据库时,MyBatis-Flex 会自动使用 `code` 属性值进行保存,同时在读取数据库内容的时候,MyBatis-Flex 自动把数据库的值转换为
|
通过注解 `@EnumValue` 为 `code` 属性标注后,当我们保存 Account 内容到数据库时,MyBatis-Flex 会自动使用 `code` 属性值进行保存,同时在读取数据库内容的时候,MyBatis-Flex 自动把数据库的值转换为
|
||||||
`TypeEnum` 枚举。
|
`TypeEnum` 枚举。
|
||||||
|
|
||||||
**注意事项**
|
**注意事项**
|
||||||
|
|
||||||
- 1、@EnumValue 注解标识的属性,要求必须是 public 修饰,或者有 get 方法。
|
- 1、@EnumValue 注解标识的属性,要求必须是 public 修饰,或者有 get 方法。
|
||||||
|
- 2、@EnumValue 注解标识支持在 get 方法使用注解。
|
||||||
|
- 3、枚举注解优先级。 优先取字段上的注解。如果字段没有注解,则会找方法上的注解,如果枚举类当前方法没有注解,则会去找父类的方法寻找存在注解的方法。
|
||||||
|
|
||||||
- 2、当配置了 @EnumValue 时,QueryWrapper 构建时,传入枚举,自动使用该值进行 SQL 参数拼接。例如:
|
- 4、当配置了 @EnumValue 时,QueryWrapper 构建时,传入枚举,自动使用该值进行 SQL 参数拼接。例如:
|
||||||
|
|
||||||
```java
|
```java
|
||||||
QueryWrapper query = QueryWrapper.create();
|
QueryWrapper query = QueryWrapper.create();
|
||||||
@ -63,4 +93,5 @@ query.select().from(ACCOUNT)
|
|||||||
select * from tb_account
|
select * from tb_account
|
||||||
where type_enum = 1
|
where type_enum = 1
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -22,7 +22,7 @@ import java.lang.annotation.*;
|
|||||||
*/
|
*/
|
||||||
@Documented
|
@Documented
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
@Target({ElementType.FIELD})
|
@Target({ElementType.FIELD, ElementType.METHOD})
|
||||||
public @interface EnumValue {
|
public @interface EnumValue {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -18,12 +18,18 @@ package com.mybatisflex.core.audit;
|
|||||||
|
|
||||||
public class ConsoleMessageCollector implements MessageCollector {
|
public class ConsoleMessageCollector implements MessageCollector {
|
||||||
|
|
||||||
private SqlDebugPrinter printer = (sql, dsName, tookTimeMillis) -> {
|
private SqlDebugPrinter printer = (sql, tookTimeMillis) -> {
|
||||||
|
if (tookTimeMillis != null) {
|
||||||
|
System.out.println("Flex exec sql took " + tookTimeMillis + " ms >>> " + sql);
|
||||||
|
} else {
|
||||||
|
System.out.println("Flex exec sql >>> " + sql);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private SqlDebugExtPrinter extPrinter = (sql, dsName, tookTimeMillis) -> {
|
||||||
StringBuilder buffer = new StringBuilder();
|
StringBuilder buffer = new StringBuilder();
|
||||||
buffer.append("Flex exec");
|
buffer.append("Flex exec");
|
||||||
if (dsName != null) {
|
buffer.append("dsName >>> ").append(dsName);
|
||||||
buffer.append("dsName >>> ").append(dsName);
|
|
||||||
}
|
|
||||||
if (tookTimeMillis != null) {
|
if (tookTimeMillis != null) {
|
||||||
buffer.append(" sql took ").append(tookTimeMillis).append(" ms >>> ").append(sql);
|
buffer.append(" sql took ").append(tookTimeMillis).append(" ms >>> ").append(sql);
|
||||||
} else {
|
} else {
|
||||||
@ -39,13 +45,29 @@ public class ConsoleMessageCollector implements MessageCollector {
|
|||||||
this.printer = printer;
|
this.printer = printer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public ConsoleMessageCollector(SqlDebugExtPrinter printer) {
|
||||||
|
this.extPrinter = printer;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void collect(AuditMessage message) {
|
public void collect(AuditMessage message) {
|
||||||
printer.print(message.getFullSql(), message.getDsName(), message.getElapsedTime());
|
if (message.getDsName() == null) {
|
||||||
|
printer.print(message.getFullSql(), message.getElapsedTime());
|
||||||
|
} else {
|
||||||
|
extPrinter.print(message.getFullSql(), message.getDsName(), message.getElapsedTime());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface SqlDebugPrinter {
|
public interface SqlDebugPrinter {
|
||||||
|
|
||||||
|
void print(String sql, Long tookTimeMillis);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public interface SqlDebugExtPrinter {
|
||||||
|
|
||||||
void print(String sql, String dsName, Long tookTimeMillis);
|
void print(String sql, String dsName, Long tookTimeMillis);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -22,19 +22,29 @@ import org.apache.ibatis.type.JdbcType;
|
|||||||
import org.apache.ibatis.type.TypeHandler;
|
import org.apache.ibatis.type.TypeHandler;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
import java.sql.CallableStatement;
|
import java.sql.CallableStatement;
|
||||||
import java.sql.PreparedStatement;
|
import java.sql.PreparedStatement;
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public class CompositeEnumTypeHandler<E extends Enum<E>> implements TypeHandler<E> {
|
public class CompositeEnumTypeHandler<E extends Enum<E>> implements TypeHandler<E> {
|
||||||
|
|
||||||
private final TypeHandler<E> delegate;
|
private final TypeHandler<E> delegate;
|
||||||
|
|
||||||
public CompositeEnumTypeHandler(Class<E> enumClass) {
|
public CompositeEnumTypeHandler(Class<E> enumClass) {
|
||||||
|
boolean isNotFound = false;
|
||||||
List<Field> enumDbValueFields = ClassUtil.getAllFields(enumClass, f -> f.getAnnotation(EnumValue.class) != null);
|
List<Field> enumDbValueFields = ClassUtil.getAllFields(enumClass, f -> f.getAnnotation(EnumValue.class) != null);
|
||||||
if (enumDbValueFields.isEmpty()) {
|
if (enumDbValueFields.isEmpty()) {
|
||||||
|
List<Method> enumDbValueMethods = ClassUtil.getAllMethods(enumClass, m -> m.getAnnotation(EnumValue.class) != null);
|
||||||
|
if (enumDbValueMethods.isEmpty()) {
|
||||||
|
isNotFound = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (isNotFound) {
|
||||||
delegate = new EnumTypeHandler<>(enumClass);
|
delegate = new EnumTypeHandler<>(enumClass);
|
||||||
} else {
|
} else {
|
||||||
delegate = new FlexEnumTypeHandler<>(enumClass);
|
delegate = new FlexEnumTypeHandler<>(enumClass);
|
||||||
|
|||||||
@ -70,6 +70,17 @@ public class EnumWrapper<E extends Enum<E>> {
|
|||||||
this.getterMethod = getter;
|
this.getterMethod = getter;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!hasEnumValueAnnotation) {
|
||||||
|
Method enumValueMethod = ClassUtil.getFirstMethod(enumClass, method -> method.getAnnotation(EnumValue.class) != null);
|
||||||
|
if (enumValueMethod != null) {
|
||||||
|
String methodName = enumValueMethod.getName();
|
||||||
|
if (!(methodName.startsWith("get") && methodName.length() > 3)) {
|
||||||
|
throw new IllegalStateException("Can not find get method \"" + methodName + "()\" in enum: " + enumClass.getName());
|
||||||
|
}
|
||||||
|
this.getterMethod = enumValueMethod;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user