mybaits,请大家彻底告别xml,对象操作

此方法无侵入性,项目如果没有使用mybaits plus, 请配合配合上一篇文章,两者一起使用,快速敏捷开发(懒人能创造世界)。看效果直接操作对象

  @Override
    public int update(Long id) {
        File bean=new File();
        Timestamp lastModifyTime = new Timestamp(new Date().getTime());
        bean.setLastModifyTime(lastModifyTime);
        bean.setId(id);
        return fileDAO.update(bean);
    }

生成的sql

 

上代码:

1.新建两个自定义注解PrimaryKey标注主键,ExcludeField过滤字段

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @author zhanqi
 * @since 2021/4/17 9:21
 * 声明字段为注解
 */
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface PrimaryKey {
    String value() default "";

}
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @author zhanqi
 * @since 2021/4/17 9:21
 * 过滤实体类字段
 */

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcludeField {
}

2.创建bean,sql字段转换类ToolByBeanSql

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author zhanqi
 * @since 2021/4/17 9:18
 * 驼峰名称和下划线名称的相互转换
 */
public class ToolByBeanSql {
    private static Pattern linePattern = Pattern.compile("_(\\w)");
    private static Pattern humpPattern = Pattern.compile("[A-Z]");

    /**
     * 下划线转驼峰
     */

    public static String lineToHump(String str) {
        str = str.toLowerCase();
        Matcher matcher = linePattern.matcher(str);
        StringBuffer sb = new StringBuffer();
        while (matcher.find()) {
            matcher.appendReplacement(sb, matcher.group(1).toUpperCase());
        }
        matcher.appendTail(sb);
        return sb.toString();

    }



    /**
     * 驼峰转下划线
     */
    public static String humpToLine(String str) {
        Matcher matcher = humpPattern.matcher(str);
        StringBuffer sb = new StringBuffer();
        while (matcher.find()) {
            matcher.appendReplacement(sb, "_" + matcher.group(0).toLowerCase());
        }
        matcher.appendTail(sb);
        return sb.toString();

    }

}

3.创建BaseSqlProvider

/**
 * @author zhanqi
 * @since 2021/4/17 9:22
 * sql生成类
 */

@Component
public class BaseSqlProvider<T> {

    /**
     * 新增
     * @param bean
     * @return
     */
    //@Options自增主键
    public String add(T bean) {
        SQL sql = new SQL();
        Class clazz = bean.getClass();
        String tableName = clazz.getSimpleName();
        String realTableName = ToolByBeanSql.humpToLine(tableName).replaceAll("_entity", "").substring(1);
        sql.INSERT_INTO(realTableName);
        List<Field> fields = getFields(bean,clazz);
        for (Field field : fields) {
            field.setAccessible(true);
            String column = field.getName();
            //System.out.println("column:" + Tool.humpToLine(column));
            sql.VALUES(ToolByBeanSql.humpToLine(column), String.format("#{" + column + "}"));
        }
        return sql.toString();
    }

    /**
     * 删除
     * @param bean
     * @return
     */
    public String delete(T bean) {
        SQL sql = new SQL();
        Class clazz = bean.getClass();
        String tableName = clazz.getSimpleName();
        String realTableName = ToolByBeanSql.humpToLine(tableName).replaceAll("_entity", "").substring(1);
        sql.DELETE_FROM(realTableName);
        findPrimaryKey(sql,bean, clazz);
        return sql.toString();
    }

    /**
     * 查找主键生成where id=?
     * @param sql
     * @param bean
     * @param clazz
     */
    private void findPrimaryKey(SQL sql, T bean,Class clazz) {
        List<Field> primaryKeyField = getPrimaryKeyFields(bean,clazz);
        if (!primaryKeyField.isEmpty()) {
            for (Field pkField : primaryKeyField) {
                pkField.setAccessible(true);
                sql.WHERE(pkField.getName() + "=" + String.format("#{" + pkField.getName() + "}"));
            }

        } else {
            sql.WHERE(" 1= 2");
            throw new RuntimeException("未包含PrimaryKey属性");

        }
    }

    /**
     * 查询主键
     * @param bean
     * @param clazz
     * @return
     */
    private List<Field> getPrimaryKeyFields(T bean, Class clazz) {
        List<Field> primaryKeyField = new ArrayList<>();
        List<Field> fields = getFields(bean,clazz);
        try {
            clazz.newInstance();
            for (Field field : fields) {
                field.setAccessible(true);
                PrimaryKey key = field.getAnnotation(PrimaryKey.class);
                if (key != null) {
                    primaryKeyField.add(field);
                }

            }
        } catch (IllegalAccessException | InstantiationException e) {
            e.printStackTrace();
        }

        return primaryKeyField;

    }


    /**
     * 获取字段
     * @param bean
     * @param clazz
     * @return
     */
    private List<Field> getFields(T bean,Class clazz) {
        List<Field> fieldList = new ArrayList<>();
        Field[] fields = clazz.getDeclaredFields();
        try {
            for (Field field : fields) {
                field.setAccessible(true);
                ExcludeField key = field.getAnnotation(ExcludeField.class);
                if (key == null) {
                    //System.out.println("属性值:  " + field.get(bean));
                    if (field.get(bean) != null) {
                        fieldList.add(field);
                    }
                }
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return fieldList;
    }

    /**
     * 查询
     * @param bean
     * @return
     */
    public String get(T bean) {
        SQL sql = new SQL();
        Class clazz = bean.getClass();
        String tableName = clazz.getSimpleName();
        String realTableName = ToolByBeanSql.humpToLine(tableName).replaceAll("_entity", "").substring(1);
        sql.SELECT("*").FROM(realTableName);
        findPrimaryKey(sql, bean,clazz);
        System.out.println("getSql:" + sql.toString());
        return sql.toString();
    }


    /**
     * 新增
     * @param bean
     * @return
     */
    public String update(T bean) {
        SQL sql = new SQL();
        Class clazz = bean.getClass();
        String tableName = clazz.getSimpleName();
        String realTableName = ToolByBeanSql.humpToLine(tableName).replaceAll("_entity", "").substring(1);
        sql.UPDATE(realTableName);
        List<Field> fields = getFields(bean,clazz);
        for (Field field : fields) {
            field.setAccessible(true);
            String column = field.getName();
            if (column.equals("id")) {
                continue;
            }
            System.out.println(ToolByBeanSql.humpToLine(column));
           // sql.SET(Tool.humpToLine(column) + "=" + String.format("#{" + column + ,jdbcType=VARCHAR"}"));
            sql.SET(ToolByBeanSql.humpToLine(column) + "=" + String.format("#{" + column + "}"));

        }

        findPrimaryKey(sql,bean,clazz);
        System.out.println("updateSql:" + sql.toString());
        return sql.toString();

    }
}

 

4.FileDAO update方法

import java.util.List;

/**
 * @author zhanqi
 * @since 2021/03/19
 */
@Repository
public interface FileDAO {

    //修改一条数据
    @UpdateProvider(method = "update", type = BaseSqlProvider.class)
    int update(File bean);

    /**
     * 通过编号获取文件
     *
     * @param id 编号
     * @return {@link File}
     */
    @Select("select * from file where id=#{id}")
    File getById(long id);

    /**
     * 获取所有文件
     *
     * @param userId     用户编号
     * @param offset     偏移
     * @param categoryId 分类编号
     * @param orderBy    排序方式
     * @param search     搜索
     * @return {@link List}
     */
    @SelectProvider(type = FileSqlProvider.class, method = "getAll")
    List<FileRecord> listAll(@Param("userId") int userId, @Param("offset") int offset, @Param("categoryId") int
            categoryId, @Param("orderBy") String orderBy, @Param("search") String search);


}

5.IFileService



/**
 * @author zhanqi
 * @since 2021/03/29
 */
public interface IFileService {

    /**
     * 修改数据
     * @param id
     * @return
     */
    int update(Long id);
}

6.FileServiceImpl

/**
 * @author zhanqi
 * @since 2021/03/29
 */
@Service
public class FileServiceImpl implements IFileService {

    @Override
    public int update(Long id) {
        File bean=new File();
        Timestamp lastModifyTime = new Timestamp(new Date().getTime());
        bean.setLastModifyTime(lastModifyTime);
        bean.setId(id);
        return fileDAO.update(bean);
    }
}

7.File 实体类

/**
 * 文件表
 *
 * @author zhanqi
 * @since 2021/04/11
 */
public class File {

    @PrimaryKey
    private Long id;

    private String name;

    private Timestamp lastModifyTime;



    public Timestamp getLastModifyTime() {
        return lastModifyTime;
    }

    public void setLastModifyTime(Timestamp lastModifyTime) {
        this.lastModifyTime = lastModifyTime;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

 
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值