实现效果
运行工具类,直接将指定对象的所有驼峰风格的字段转换成下划线风格输出,方便写mybatis的mapper.xml文件
前情提要
如果使用mybatis的话,为了提高查询效率,我们经常会指定字段名,而有些字段在数据库是下划线分割,而在java实体类中则是小驼峰的方式,如图:
这时如果我们可以使用工具类直接提取下划线风格的字段,复制粘贴写代码就很舒服
封装字段提取工具类
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @Author: lzp
* @description: 自用对象工具类,不使用在业务中,方便开发中一些操作
* @Date: 2022/7/25
*/
public class FieldUtils {
public static Pattern PATTERN_HUMP_TO_CASE = Pattern.compile("[A-Z]");
public static Pattern PATTERN_CASE_TO_HUMP = Pattern.compile("[A-Z]");
/**
* 获取传入对象,下划线风格的所有私有字段
*
* @param clazz 对象的字节码
*/
public static List<String> getFieldsToCase(Class clazz) {
Field[] fields = clazz.getDeclaredFields();
List<String> list = new ArrayList<>();
for (Field field : fields) {
// 将字段名称转换为下划线风格
list.add(humpToCase(field.getName()));
}
return list;
}
/**
* @Description 将驼峰转为下划线 underline
*/
public static String humpToCase(String str) {
Matcher matcher = PATTERN_HUMP_TO_CASE.matcher(str);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(sb, "_" + matcher.group(0).toLowerCase());
}
matcher.appendTail(sb);
return sb.toString();
}
/**
* @Description 将下划线转为驼峰
*/
public static String caseToHump(String str) {
str = str.toLowerCase();
Matcher matcher = PATTERN_CASE_TO_HUMP.matcher(str);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(sb, matcher.group(0).toUpperCase().replace("_", ""));
}
matcher.appendTail(sb);
return sb.toString();
}
}
编写测试类
user类:
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.util.Date;
/**
* @author lzp
* @Description: groovy script auto generate
*/
@Data
@TableName("user")
public class User {
/**
* 自增id
*/
private Integer id;
/**
* nickName
*/
private String nickName;
/**
* 1男 2女 0未知
*/
private Integer sex;
/**
* 用户名 保证唯一
*/
private String userName;
/**
* 创建时间
*/
private Date createTime;
}
测试类
public class Demo {
public static void main(String[] args) {
System.out.println(FieldUtils.getFieldsToCase(User.class));
}
}