对象名称和表名的转换,例如 ForumPost -> forum_posts,对象forumpost,该类执行两个转换过程:1
分享于 点击 29915 次 点评:114
对象名称和表名的转换,例如 ForumPost -> forum_posts,对象forumpost,该类执行两个转换过程:1
该类执行两个转换过程:1. 小写和大写之间用下划线隔开,例如 ForumPost -> forum_post2. 转成复数形式 forum_post ->forum_posts主要目的是用来生成类名和表名之间的映射关系,此类扩展自Hibernate中的类。
用法
String tbl_name = Inflector.getInstance().tableize(ForumPost.class);
Inflector.java
package my.util;import java.util.*;import java.util.regex.*;/** * Transforms words (from singular to plural, from camelCase to under_score, etc.). * I got bored of doing Real Work... * @author chuyeow * @modified Winter Lau (http://www.oschina.net) */public class Inflector { // Pfft, can't think of a better name, // but this is needed to avoid the price of initializing the pattern on each call. private static final Pattern UNDERSCORE_PATTERN_1 = Pattern.compile("([A-Z]+)([A-Z][a-z])"); private static final Pattern UNDERSCORE_PATTERN_2 = Pattern.compile("([a-z\\d])([A-Z])"); private static List<RuleAndReplacement> plurals = new ArrayList<RuleAndReplacement>(); private static List<RuleAndReplacement> singulars = new ArrayList<RuleAndReplacement>(); private static List<String> uncountables = new ArrayList<String>(); private static Inflector instance = new Inflector(); // (Pseudo-)Singleton instance. private Inflector() { // Woo, you can't touch me. initialize(); } private void initialize() { plural("$", "s"); plural("s$", "s"); plural("(ax|test)is$", "$1es"); plural("(octop|vir)us$", "$1i"); plural("(alias|status)$", "$1es"); plural("(bu)s$", "$1es"); plural("(buffal|tomat)o$", "$1oes"); plural("([ti])um$", "$1a"); plural("sis$", "ses"); plural("(?:([^f])fe|([lr])f)$", "$1$2ves"); plural("(hive)$", "$1s"); plural("([^aeiouy]|qu)y$", "$1ies"); plural("([^aeiouy]|qu)ies$", "$1y"); plural("(x|ch|ss|sh)$", "$1es"); plural("(matr|vert|ind)ix|ex$", "$1ices"); plural("([m|l])ouse$", "$1ice"); plural("(ox)$", "$1en"); plural("(quiz)$", "$1zes"); singular("s$", ""); singular("(n)ews$", "$1ews"); singular("([ti])a$", "$1um"); singular("((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$", "$1$2sis"); singular("(^analy)ses$", "$1sis"); singular("([^f])ves$", "$1fe"); singular("(hive)s$", "$1"); singular("(tive)s$", "$1"); singular("([lr])ves$", "$1f"); singular("([^aeiouy]|qu)ies$", "$1y"); singular("(s)eries$", "$1eries"); singular("(m)ovies$", "$1ovie"); singular("(x|ch|ss|sh)es$", "$1"); singular("([m|l])ice$", "$1ouse"); singular("(bus)es$", "$1"); singular("(o)es$", "$1"); singular("(shoe)s$", "$1"); singular("(cris|ax|test)es$", "$1is"); singular("([octop|vir])i$", "$1us"); singular("(alias|status)es$", "$1"); singular("^(ox)en", "$1"); singular("(vert|ind)ices$", "$1ex"); singular("(matr)ices$", "$1ix"); singular("(quiz)zes$", "$1"); irregular("person", "people"); irregular("man", "men"); irregular("child", "children"); irregular("sex", "sexes"); irregular("move", "moves"); uncountable(new String[] {"equipment", "information", "rice", "money", "species", "series", "fish", "sheep"}); } public static Inflector getInstance() { return instance; } public String underscore(String camelCasedWord) { // Regexes in Java are fucking stupid... String underscoredWord = UNDERSCORE_PATTERN_1.matcher(camelCasedWord).replaceAll("$1_$2"); underscoredWord = UNDERSCORE_PATTERN_2.matcher(underscoredWord).replaceAll("$1_$2"); underscoredWord = underscoredWord.replace('-', '_').toLowerCase(); return underscoredWord; } public String pluralize(String word) { if (uncountables.contains(word.toLowerCase())) { return word; } return replaceWithFirstRule(word, plurals); } public String singularize(String word) { if (uncountables.contains(word.toLowerCase())) { return word; } return replaceWithFirstRule(word, singulars); } private String replaceWithFirstRule(String word, List<RuleAndReplacement> ruleAndReplacements) { for (RuleAndReplacement rar : ruleAndReplacements) { String rule = rar.getRule(); String replacement = rar.getReplacement(); // Return if we find a match. Matcher matcher = Pattern.compile(rule, Pattern.CASE_INSENSITIVE).matcher(word); if (matcher.find()) { return matcher.replaceAll(replacement); } } return word; } public String tableize(String className) { return pluralize(underscore(className)); } public String tableize(Class<?> klass) { // Strip away package name - we only want the 'base' class name. String className = klass.getName().replace(klass.getPackage().getName()+".", ""); return tableize(className); } public static void plural(String rule, String replacement) { plurals.add(0, new RuleAndReplacement(rule, replacement)); } public static void singular(String rule, String replacement) { singulars.add(0, new RuleAndReplacement(rule, replacement)); } public static void irregular(String singular, String plural) { plural(singular, plural); singular(plural, singular); } public static void uncountable(String... words) { for (String word : words) { uncountables.add(word); } }}// Ugh, no open structs in Java (not-natively at least).class RuleAndReplacement { private String rule; private String replacement; public RuleAndReplacement(String rule, String replacement) { this.rule = rule; this.replacement = replacement; } public String getReplacement() { return replacement; } public void setReplacement(String replacement) { this.replacement = replacement; } public String getRule() { return rule; } public void setRule(String rule) { this.rule = rule; }}
用户点评