Java反射获取及创建class的方法和mybatis-plus的逻辑删除配置

本文介绍了Java反射获取及创建class的方法,并详细阐述了mybatis-plus的逻辑删除配置,包括@TableField和@TableLogic注解的使用,以及如何通过注解简化对象创建。此外,还列举了获取方法的三种方式和类创建的两种方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java反射获取及创建class的方法和mybatis-plus的逻辑删除配置

mybatis-plus的逻辑删除配置

Customer类
@AllArgsConstructor 注解表示所有参数的构造函数
@NoArgsConstructor 注解表示无参构造函数
@Accessors(chain = true) 注解表示可以直接通过对象的变量名.属性的方式去设置或获取值。

 /**
     * 更新客户
     *
     * @return
     */
    private Boolean updateCustomer(Customer entity) {
        entity.setUpdateUser(ShiroUtil.getUserId()).setUpdateTime(LocalDateTime.now());
        return this.updateById(entity);
    }

如果使用了@Builder注解,则@Accessors(chain = true)注解可以删除
该注解用法如下,主要用于减少new对象,直接用对象.builder().属性.属性.build()去设置参数

 if (CheckUtil.notEmpty(beforeData) && CheckUtil.notEmpty(afterData)) {
            HandleLogDTO logDTO = HandleLogDTO.builder().type(handleType).device(dto.getDevice()).orderId(dto.getId()).
                    orderNumber(dto.getOrderNumber()).beforeData(beforeData).afterData(afterData).createUser(ShiroUtil.getUserId()).createTime(LocalDateTime.now()).build();
            HandleLog entity = mapperFacade.map(logDTO, HandleLog.class);
            integer = mapper.saveHandleLog(entity);
        }

@TableField 注解的value = "create_user"对应数据该字段名, fill = FieldFill.INSERT表示该字段何时自动填充,
主要有三种方式:FieldFill.INSERT,FieldFill.UPDATE,INSERT_UPDATE,分别表示新增,修改,新增和修改时自动填充值。

@TableLogic
@TableField(value = "del_flag",fill = FieldFill.INSERT)
private Integer delFlag;

这个delFlag字段上加的@TableLogic注解表示是逻辑删除,当调用service的removeById(T entity)或者调用mapper的deleteById(T entity)删除数据时,通过该配置和@TableField(value = “del_flag”,fill = FieldFill.INSERT)及yaml配置文件中指定的默认值,会自动更新该字段,不需要先设置再删除。这样在多次要调用删除方法时就可以少写一些重复的代码了。
在这里插入图片描述

@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@AllArgsConstructor
@NoArgsConstructor
@TableName("os_customer")
public class Customer extends Model<Customer> {

    private static final long serialVersionUID = 1L;

    /**
     * 主键ID
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    /**
     * 客户公司名
     */
    @TableField(value = "name")
    private String name;

    /**
     * 租户id
  
### MyBatis-Plus 与 JSqlParser 的集成方法 MyBatis-Plus 是一个基于 MyBatis 的增强工具,简化了开发流程并提供了丰富的功能[^1]。而 JSqlParser 是一个用于解析 SQL 语句的 Java 库,可以将复杂的 SQL 转换为对象模型或对其进行修改[^2]。两者结合使用时,可以通过以下方式实现: #### 1. 使用 MyBatis-Plus 的拦截器机制 MyBatis 提供了插件接口 `Interceptor`,允许开发者对 SQL 执行过程进行拦截修改。通过实现该接口,并结合 JSqlParser 的解析能力,可以在 SQL 执行前动态修改 SQL 语句。 以下是实现步骤及代码示例: ```java import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.github.jsqlparser.parser.CCJSqlParserUtil; import com.github.jsqlparser.statement.Statement; import com.github.jsqlparser.statement.select.Select; import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.expression.operators.relational.EqualsTo; import org.apache.ibatis.executor.statement.StatementHandler; import org.apache.ibatis.plugin.*; import java.sql.Connection; @Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})}) public class JSqlParserInterceptor implements Interceptor { @Override public Object intercept(Invocation invocation) throws Throwable { // 获取原始 SQL String originalSql = (String) reflectionField(invocation.getTarget(), "delegate", "boundSql", "sql"); // 使用 JSqlParser 解析 SQL Statement statement = CCJSqlParserUtil.parse(originalSql); if (statement instanceof Select) { Select selectStatement = (Select) statement; Expression where = selectStatement.getSelectBody().getWhere(); // 修改 WHERE 条件 if (where != null) { EqualsTo equalsTo = new EqualsTo(); equalsTo.setLeftExpression(where); equalsTo.setRightExpression(CCJSqlParserUtil.parseCondExpression("1=1")); selectStatement.getSelectBody().setWhere(equalsTo); } } // 将修改后的 SQL 设置回 MyBatis String modifiedSql = statement.toString(); reflectionField(invocation.getTarget(), "delegate", "boundSql", "sql", modifiedSql); return invocation.proceed(); } private Object reflectionField(Object object, String... fieldNames) { // 反射获取字段值 try { for (String fieldName : fieldNames) { var field = object.getClass().getDeclaredField(fieldName); field.setAccessible(true); object = field.get(object); } return object; } catch (Exception e) { throw new RuntimeException("Reflection failed", e); } } private void reflectionField(Object object, String[] fieldNames, Object value) { // 反射设置字段值 try { var field = object.getClass().getDeclaredField(fieldNames[fieldNames.length - 1]); field.setAccessible(true); field.set(object, value); } catch (Exception e) { throw new RuntimeException("Reflection failed", e); } } @Override public Object plugin(Object target) { return Plugin.wrap(target, this); } @Override public void setProperties(Properties properties) { } } ``` 在上述代码中,通过拦截 `StatementHandler` 的 `prepare` 方法获取原始 SQL 并使用 JSqlParser 进行解析修改。最后,将修改后的 SQL 重新注入到 MyBatis 中执行[^3]。 #### 2. 配置拦截器 为了使拦截器生效,需要将其注册到 MyBatis-Plus配置中: ```java import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MyBatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new JSqlParserInterceptor()); return interceptor; } } ``` #### 3. 注意事项 -使用 JSqlParser 时,需要注意其版本兼容性问题。某些复杂 SQL 可能无法被正确解析,需根据具体需求调整[^4]。 - 拦截器中的逻辑应尽量保持轻量级,避免影响性能[^5]。 ```java // 示例:测试 SQL 修改效果 @Test public void testJSqlParserIntegration() throws Exception { String sql = "SELECT * FROM user WHERE id = 1"; Statement statement = CCJSqlParserUtil.parse(sql); System.out.println(statement.toString()); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值