怎么用java实现驼峰命名法与数据库命名法的相互转换

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么用java实现驼峰命名法与数据库命名法的相互转换相关的知识,希望对你有一定的参考价值。

手敲的,给个辛苦分吧。。。




package test;

import java.util.ArrayList;
import java.util.List;

public class Test 

public static void main(String[] args) 
//testing for data base column-key to java field
String[] dbKeys = "id", "user_age", "user_addr_";
Test t = new Test();
t.convertToJava(dbKeys);
System.out.println("-----------------------------------");
//testing for Java field to data base column-key
String javaFieldNames[] = "id","userAge","userHomeAddr";
t.getDBKey(javaFieldNames);



/*
 * Java field to data base column-key
 */

private void getDBKey(String... javaFieldNames)
if(javaFieldNames != null && javaFieldNames.length > 0)
for(String name : javaFieldNames)
StringBuffer buffer = new StringBuffer();
char[] array = name.toCharArray();
List<Integer> insertIndexes = new ArrayList<>();
for(int i=0;i<array.length;i++)
Character c = array[i];
if(i != 0 && Character.isUpperCase(c))
insertIndexes.add(i);


if(insertIndexes.size() > 0)
int flag = 0;
for(int j=0;j<insertIndexes.size();j++)
String word = toLowercase4FirstLetter(name.substring(flag, insertIndexes.get(j)));
buffer.append(word).append("_");
flag = insertIndexes.get(j);

String last = toLowercase4FirstLetter(name.substring(flag));
buffer.append(last);
System.out.println(buffer.toString());
 else 
System.out.println(name);





private String toLowercase4FirstLetter(String word)
if(word != null && word.length() > 0)
String firstLetter = word.substring(0,1);
String others = word.substring(1);
return firstLetter.toLowerCase() + others;
else
return "";



/*
 * data base column-key to java field
 */
public void convertToJava(String... dbKeys) 
if(dbKeys != null && dbKeys.length > 0)
for(String key : dbKeys)
String[] words = key.split("_");
String result = toUppercase4FirstLetter(words);
System.out.println(result);




private String toUppercase4FirstLetter(String... words)
StringBuffer buffer = new StringBuffer();
if(words != null && words.length > 0)
for(int i=0;i<words.length;i++)
String word = words[i];
String firstLetter = word.substring(0, 1);
String others = word.substring(1);
String upperLetter = null;
if(i != 0)
upperLetter = firstLetter.toUpperCase();
 else 
upperLetter = firstLetter;

buffer.append(upperLetter).append(others);

return buffer.toString();

return "";


参考技术A 驼峰命名就是除首单词外后面单词第一个字符大写,根据数据库命名法规则,获取到一个名字时先判断是表名还是什么,然后根据对应的规则剪切拼接字符就可以了。 参考技术B 如果用mybatis可以直接转换的。 参考技术C 请教一下,数据库命名法是怎么命名的

Java 驼峰命名转下划线命名(能正确处理连续HTTP等大写)

文章目录

【1】功能(驼峰转下划线)

  1. 只遍历输入字符串一遍
  2. 能够处理处理连续的大写字母如 HTTP
  3. 首字母可大写可小写
/**
     * 双指针法
     * l之前的表示已经转换过的字符
     * l-r之间的表示需要被转换的单词
     * r之后表示还没有循环到的字符
     *
     * @param s 传入的字符串
     * @return
     */
    public static StringBuilder trans(String s) 
        StringBuilder stringBuilder = new StringBuilder();
        int l = 0;
        int r = 0;
        while (r < s.length()) 
            //如果下一个字符是小写
            if (r + 1 < s.length() && !isUpper(s.charAt(r + 1))) 
                while (true) 
                    r++;
                    if (r == s.length()) 
                        stringBuilder.append(s.substring(l).toLowerCase());
                        return stringBuilder;
                    
                    if (isUpper(s.charAt(r))) 
                        stringBuilder.append(s.substring(l, r).toLowerCase() + "_");
                        l = r;
                        break;
                    
                
             else if (r + 1 < s.length()) //如果下个字符是连着的大写 如HTTP
                //判断是不是第一个字符,如果不判断则会出现aA 变为aa的情况 而不是a_a
                if (r == 0 && isUpper(s.charAt(r + 1))) 
                    r++;
                    stringBuilder.append(s.substring(l, r).toLowerCase() + "_");
                    l = r;
                 else 
                    while (true) 
                        r++;
                        if (r == s.length()) 
                            stringBuilder.append(s.substring(l).toLowerCase());
                            return stringBuilder;
                        
                        if (!isUpper(s.charAt(r))) 
                            r--;
                            stringBuilder.append(s.substring(l, r).toLowerCase() + "_");
                            l = r;
                            break;
                        
                    
                
             else //如果是到达最后了
                stringBuilder.append(s.substring(l).toLowerCase());
                r++;
            
        
        return stringBuilder;
    

    public static boolean isUpper(char c) 
        return c >= 'A' && c <= 'Z';
    

【2】测试用例

		System.out.println(trans(""));
        System.out.println(trans(" "));
        System.out.println(trans("isTrue"));
        System.out.println(trans("myFirstName"));
        System.out.println(trans("OnlineUsers"));
        System.out.println(trans("Address"));
        System.out.println(trans("validHTTPRequest"));
        System.out.println(trans("ValidHTTPSRequestCall"));
        System.out.println(trans("UsingHTTPS"));

输出:


 
is_true
my_first_name
online_users
address
valid_http_request
valid_https_request_call
using_https

【3】如果使用有Bug,欢迎评论区留言

以上是关于怎么用java实现驼峰命名法与数据库命名法的相互转换的主要内容,如果未能解决你的问题,请参考以下文章

驼峰法和下划线命名法的互相转换

Java 驼峰命名转下划线命名(能正确处理连续HTTP等大写)

Java 驼峰命名转下划线命名(能正确处理连续HTTP等大写)

Java 驼峰命名转下划线命名(能正确处理连续HTTP等大写)

求助:word中将下划线的字符转成驼峰格式

java:蛇形命名法格式(snake-case)字符串变量名转驼峰命名法格式(camel-case)