在sqlmap文件中会定义一些DO并从DO去除对应的属性值替换sql的变量名
<insert id="MS-BRANDOFFER-INSERT" parameterClass="TA-brandOffer"> insert into industry_brand_offer (gmt_create, gmt_modified, offer_id,brand_member_id, status, operator,audit_reason) values (now(), now(), #offerId#, #brandMemberId#, #status#, #operator#, #auditReason#) <selectKey resultClass="java.lang.Long" keyProperty="id"> SELECT LAST_INSERT_ID() AS ID </selectKey> </insert>
ibatis-sqlmap是通过get方法名称,只要方法以get开头,则从get方法名称后面部分取出,并将后面部分第一个字段转为小写。
ClassInfo这个类的实现
private ClassInfo(Class clazz) { className = clazz.getName(); addMethods(clazz); readablePropertyNames = (String[]) getMethods.keySet().toArray(new String[getMethods.keySet().size()]); writeablePropertyNames = (String[]) setMethods.keySet().toArray(new String[setMethods.keySet().size()]); } private void addMethods(Class cls) { Method[] methods = getAllMethodsForClass(cls); for (int i = 0; i < methods.length; i++) { String name = methods[i].getName(); if (name.startsWith("set") && name.length() > 3) { if (methods[i].getParameterTypes().length == 1) { name = dropCase(name); if (setMethods.containsKey(name)) { // TODO(JGB) - this should probably be a RuntimeException at some point??? log.error("Illegal overloaded setter method for property " + name + " in class " + cls.getName() + ". This breaks the JavaBeans specification and can cause unpredicatble results."); } setMethods.put(name, methods[i]); setTypes.put(name, methods[i].getParameterTypes()[0]); } } else if (name.startsWith("get") && name.length() > 3) { if (methods[i].getParameterTypes().length == 0) { name = dropCase(name); getMethods.put(name, methods[i]); getTypes.put(name, methods[i].getReturnType()); } } else if (name.startsWith("is") && name.length() > 2) { if (methods[i].getParameterTypes().length == 0) { name = dropCase(name); getMethods.put(name, methods[i]); getTypes.put(name, methods[i].getReturnType()); } } name = null; } } private static String dropCase(String name) { if (name.startsWith("is")) { name = name.substring(2); } else if (name.startsWith("get") || name.startsWith("set")) { name = name.substring(3); } else { throw new ProbeException("Error parsing property name '" + name + "'. Didn't start with 'is', 'get' or 'set'."); } if (name.length() == 1 || (name.length() > 1 && !Character.isUpperCase(name.charAt(1)))) { name = name.substring(0, 1).toLowerCase(Locale.US) + name.substring(1); } return name; }
private ClassInfo(Class clazz) { className = clazz.getName(); addDefaultConstructor(clazz); addGetMethods(clazz); addSetMethods(clazz); addFields(clazz); readablePropertyNames = (String[]) getMethods.keySet().toArray(new String[getMethods.keySet().size()]); writeablePropertyNames = (String[]) setMethods.keySet().toArray(new String[setMethods.keySet().size()]); } private void addGetMethods(Class cls) { Method[] methods = getClassMethods(cls); for (int i = 0; i < methods.length; i++) { Method method = methods[i]; String name = method.getName(); if (name.startsWith("get") && name.length() > 3) { if (method.getParameterTypes().length == 0) { name = dropCase(name); addGetMethod(name, method); } } else if (name.startsWith("is") && name.length() > 2) { if (method.getParameterTypes().length == 0) { name = dropCase(name); addGetMethod(name, method); } } } } private void addGetMethod(String name, Method method) { getMethods.put(name, new MethodInvoker(method)); getTypes.put(name, method.getReturnType()); } private void addFields(Class clazz) { Field[] fields = clazz.getDeclaredFields(); for (int i = 0; i < fields.length; i++) { Field field = fields[i]; if (canAccessPrivateMethods()) { try { field.setAccessible(true); } catch (Exception e) { // Ignored. This is only a final precaution, nothing we can do. } } if (field.isAccessible()) { if (!setMethods.containsKey(field.getName())) { addSetField(field); } if (!getMethods.containsKey(field.getName())) { addGetField(field); } } } if (clazz.getSuperclass() != null) { addFields(clazz.getSuperclass()); } } private void addSetField(Field field) { setMethods.put(field.getName(), new SetFieldInvoker(field)); setTypes.put(field.getName(), field.getType()); } private void addGetField(Field field) { getMethods.put(field.getName(), new GetFieldInvoker(field)); getTypes.put(field.getName(), field.getType()); }
修改方法最好是改get方法了,保证get方法的属性名跟field字段名一样。