此類根據JAVA實體BEAN生成MYBATIS的接口SQL(mapper)
package com.sicdt.sicsign.bill.service.hessian; import java.lang.reflect.Field; import com.sicdt.sicsign.bill.service.entity.InvoiceEntity; public class MyBatisSqlUtils { public static void main(String[] args) { String tableName = "T_INVOICE"; Class<?> clazz = InvoiceEntity.class; System.out.println("主鍵查詢SQL:======================================"); String idSql = MyBatisSqlUtils.selectSQLById(clazz, tableName); System.out.println("主鍵查詢SQL: " + idSql); String idSqlHump = MyBatisSqlUtils.selectSQLByIdForHump(clazz, tableName); System.out.println("主鍵查詢SQL: " + idSqlHump); System.out.println("主鍵集合查詢SQL:======================================"); String idsSql = MyBatisSqlUtils.selectSQLByIds(clazz, tableName); System.out.println("主鍵集合查詢SQL: " + idsSql); String idsSqlHump = MyBatisSqlUtils.selectSQLByIdsForHump(clazz, tableName); System.out.println("主鍵集合查詢SQL: " + idsSqlHump); System.out.println("查詢SQL:======================================"); String selectSql = MyBatisSqlUtils.selectSQL(clazz,tableName); System.out.println("查詢SQL: " + selectSql); String selectSqlHump = MyBatisSqlUtils.selectSQLForHump(clazz,tableName); System.out.println("查詢SQL: " + selectSqlHump); System.out.println("插入SQL:======================================"); String insertSql = MyBatisSqlUtils.insertSql(clazz, tableName); System.out.println("插入SQL: "+insertSql); String insertSqlHump = MyBatisSqlUtils.insertSqlForHump(clazz, tableName); System.out.println("插入SQL: "+insertSqlHump); System.out.println("刪除SQL:======================================"); String deleteSql = MyBatisSqlUtils.deleteSqlById(clazz, tableName); System.out.println("刪除SQL: "+deleteSql); String deleteSqlHump = MyBatisSqlUtils.deleteSqlByIdForHump(clazz, tableName); System.out.println("刪除SQL: "+deleteSqlHump); System.out.println("修改SQL:======================================"); String updateSql = MyBatisSqlUtils.updateSql(clazz, tableName); System.out.println("修改SQL: "+updateSql); String updateSqlHump = MyBatisSqlUtils.updateSqlForHump(clazz, tableName); System.out.println("修改SQL: "+updateSqlHump); System.out.println("批量插入SQL:======================================"); String batchInsertSql = MyBatisSqlUtils.batchInsertSql(clazz, tableName); System.out.println("批量插入SQL:"+batchInsertSql); String batchInsertSqlHump = MyBatisSqlUtils.batchInsertSqlForHump(clazz, tableName); System.out.println("批量插入SQL:"+batchInsertSqlHump); System.out.println("批量更新SQL:======================================"); String batchUpdateSql = MyBatisSqlUtils.batchUpdateSql(clazz, tableName); System.out.println("批量更新SQL:"+batchUpdateSql); String batchUpdateSqlHump = MyBatisSqlUtils.batchUpdateSqlForHump(clazz, tableName); System.out.println("批量更新SQL:"+batchUpdateSqlHump); System.out.println("批量刪除SQL(主鍵):======================================"); String batchDeleteSqlByIds = MyBatisSqlUtils.batchDeleteSqlByIds(clazz, tableName); System.out.println("批量刪除SQL(主鍵):"+batchDeleteSqlByIds); String batchDeleteSqlHumpByIds = MyBatisSqlUtils.batchDeleteSqlByIdsForHump(clazz, tableName); System.out.println("批量刪除SQL(主鍵):"+batchDeleteSqlHumpByIds); System.out.println("批量刪除SQL(實體):======================================"); String batchDeleteSql = MyBatisSqlUtils.batchDeleteSql(clazz, tableName); System.out.println("批量刪除SQL(實體):"+batchDeleteSql); String batchDeleteSqlHump = MyBatisSqlUtils.batchDeleteSqlForHump(clazz, tableName); System.out.println("批量刪除SQL(實體):"+batchDeleteSqlHump); } /** * <br>描 述: 生成查詢SQL(實體屬性與數據庫一致)主鍵查詢 * <br>作 者: shizhenwei * @param clazz Object.class * @param tableName 表名稱 * @return */ public static String selectSQLById(Class<?> clazz,String tableName){ return selectSQLById(clazz, tableName, false); } /** * <br>描 述: 生成查詢SQL(實體屬性為駝峰)主鍵查詢 * <br>作 者: shizhenwei * @param clazz Object.class * @param tableName 表名稱 * @return */ public static String selectSQLByIdForHump(Class<?> clazz,String tableName){ return selectSQLById(clazz, tableName, true); } /** * <br>描 述: 生成查詢SQL(實體屬性與數據庫一致)主鍵集合查詢 * <br>作 者: shizhenwei * @param clazz Object.class * @param tableName 表名稱 * @return */ public static String selectSQLByIds(Class<?> clazz,String tableName){ return selectSQLByIds(clazz, tableName, false); } /** * <br>描 述: 生成查詢SQL(實體屬性為駝峰)主鍵集合查詢 * <br>作 者: shizhenwei * @param clazz Object.class * @param tableName 表名稱 * @return */ public static String selectSQLByIdsForHump(Class<?> clazz,String tableName){ return selectSQLByIds(clazz, tableName, true); } /** * <br>描 述: 生成查詢SQL(實體屬性與數據庫一致)條件查詢 * <br>作 者: shizhenwei * @param clazz Object.class * @param tableName 表名稱 * @return */ public static String selectSQL(Class<?> clazz,String tableName){ return selectSQL(clazz, tableName, false); } /** * <br>描 述: 生成查詢SQL(實體屬性為駝峰)條件查詢 * <br>作 者: shizhenwei * @param clazz Object.class * @param tableName 表名稱 * @return */ public static String selectSQLForHump(Class<?> clazz,String tableName){ return selectSQL(clazz, tableName, true); } /** * <br>描 述: 生成插入SQL(實體屬性與數據庫一致) * <br>作 者: shizhenwei * @param clazz Object.class * @param tableName 表名稱 * @return */ public static String insertSql(Class<?> clazz,String tableName){ return insertSql(clazz, tableName, false); } /** * <br>描 述: 生成插入SQL(實體屬性為駝峰) * <br>作 者: shizhenwei * @param clazz Object.class * @param tableName 表名稱 * @return */ public static String insertSqlForHump(Class<?> clazz,String tableName){ return insertSql(clazz, tableName, true); } /** * <br>描 述: 生成更新Sql(實體屬性與數據庫一致) * <br>作 者: shizhenwei * @param clazz Object.class * @param tableName 表名稱 * @return */ public static String updateSql(Class<?> clazz,String tableName){ return updateSql(clazz, tableName, false); } /** * <br>描 述: 生成更新SQL(實體屬性為駝峰) * <br>作 者: shizhenwei * @param clazz Object.class * @param tableName 表名稱 * @return */ public static String updateSqlForHump(Class<?> clazz,String tableName){ return updateSql(clazz, tableName, true); } /** * <br>描 述: 生成刪除SQL(實體屬性與數據庫一致)主鍵刪除 * <br>作 者: shizhenwei * @param clazz Object.class * @param tableName 表名稱 * @return */ public static String deleteSqlById(Class<?> clazz,String tableName){ return deleteSqlById(clazz, tableName, false); } /** * <br>描 述: 生成刪除SQL(實體屬性為駝峰)主鍵刪除 * <br>作 者: shizhenwei * @param clazz Object.class * @param tableName 表名稱 * @return */ public static String deleteSqlByIdForHump(Class<?> clazz,String tableName){ return deleteSqlById(clazz, tableName, true); } /** * <br>描 述: 生成刪除SQL(實體屬性與數據庫一致)實體刪除 * <br>作 者: shizhenwei * @param clazz Object.class * @param tableName 表名稱 * @return */ public static String deleteSql(Class<?> clazz,String tableName){ return deleteSqlById(clazz, tableName, false); } /** * <br>描 述: 生成刪除SQL(實體屬性為駝峰)實體刪除 * <br>作 者: shizhenwei * @param clazz Object.class * @param tableName 表名稱 * @return */ public static String deleteSqlForHump(Class<?> clazz,String tableName){ return deleteSqlById(clazz, tableName, true); } /** * <br>描 述: 生成批量插入SQL(實體屬性與數據庫一致) * <br>作 者: shizhenwei * @param clazz Object.class * @param tableName 表名稱 * @return */ public static String batchInsertSql(Class<?> clazz,String tableName){ return batchInsertSql(clazz, tableName, false); } /** * <br>描 述: 生成批量插入SQL(實體屬性為駝峰) * <br>作 者: shizhenwei * @param clazz Object.class * @param tableName 表名稱 * @return */ public static String batchInsertSqlForHump(Class<?> clazz,String tableName){ return batchInsertSql(clazz, tableName, true); } /** * <br>描 述: 生成批量更新SQL(實體屬性與數據庫一致) * <br>作 者: shizhenwei * @param clazz Object.class * @param tableName 表名稱 * @return */ public static String batchUpdateSql(Class<?> clazz,String tableName){ return batchUpdateSql(clazz, tableName, false); } /** * <br>描 述: 生成批量更新SQL(實體屬性為駝峰) * <br>作 者: shizhenwei * @param clazz Object.class * @param tableName 表名稱 * @return */ public static String batchUpdateSqlForHump(Class<?> clazz,String tableName){ return batchUpdateSql(clazz, tableName, true); } /** * <br>描 述: 生成批量刪除SQL(實體屬性與數據庫一致)主鍵刪除 * <br>作 者: shizhenwei * @param clazz Object.class * @param tableName 表名稱 * @return */ public static String batchDeleteSqlByIds(Class<?> clazz,String tableName){ return batchDeleteSqlByIds(clazz, tableName, false); } /** * <br>描 述: 生成批量刪除SQL(實體屬性為駝峰)實體刪除 * <br>作 者: shizhenwei * @param clazz Object.class * @param tableName 表名稱 * @return */ public static String batchDeleteSqlByIdsForHump(Class<?> clazz,String tableName){ return batchDeleteSqlByIds(clazz, tableName, true); } /** * <br>描 述: 生成批量刪除SQL(實體屬性與數據庫一致)主鍵刪除 * <br>作 者: shizhenwei * @param clazz Object.class * @param tableName 表名稱 * @return */ public static String batchDeleteSql(Class<?> clazz,String tableName){ return batchDeleteSql(clazz, tableName, false); } /** * <br>描 述: 生成批量刪除SQL(實體屬性為駝峰)實體刪除 * <br>作 者: shizhenwei * @param clazz Object.class * @param tableName 表名稱 * @return */ public static String batchDeleteSqlForHump(Class<?> clazz,String tableName){ return batchDeleteSql(clazz, tableName, true); } /* * 生成查詢SQL 主鍵查詢 */ private static String selectSQLById(Class<?> clazz,String tableName,boolean isHump){ String select = "@Select(\"SELECT"; Field[] fields = clazz.getDeclaredFields(); select += getSelectColumns(fields,isHump) +" FROM "+tableName +" WHERE "+getSelectColumn(fields[0],isHump)+" = "+getValueColumn(fields[0])+"\")"; return select; } /* * 生成查詢SQL主鍵集合查詢 */ private static String selectSQLByIds(Class<?> clazz,String tableName,boolean isHump){ String select = "@Select(\"<script>\"" +"\r+\"SELECT"; Field[] fields = clazz.getDeclaredFields(); select += getSelectColumns(fields,isHump) +" FROM "+tableName +" WHERE "+getSelectColumn(fields[0],isHump)+" IN \"" +"\r+\"<foreach collection='primaryKeys' item='"+fields[0].getName()+"' index='index' open='(' close=')' separator=','>\"" +"\r+\""+getValueColumn(fields[0])+"\"" +"\r+\"</foreach>\"" +"\r+\"</script>\")"; return select; } /* * 生成查詢SQL 條件查詢 */ private static String selectSQL(Class<?> clazz,String tableName,boolean isHump){ //接口引用加\" 生成雙引號 String select = "@Select(\"<script>\"" +"\r+\"SELECT"; Field[] fields = clazz.getDeclaredFields(); select += getSelectColumns(fields,isHump) +" FROM "+tableName+"\"" +"\r+\"<trim prefix='WHERE' prefixOverrides='and|or'>\""; for(Field field : fields){ if(isHump){ select += "\r+\"<if test='"+field.getName()+" != null'> AND "+getSelectColumn(field,isHump)+" = "+getValueColumn(field)+"</if>\""; }else{ select += "\r+\"<if test='"+field.getName()+" != null'> AND "+field.getName()+" = "+getValueColumn(field)+"</if>\""; } } select += "\r+\"</trim>\"" +"\r+\"</script>\")"; return select; } /* * 生成插入SQL */ private static String insertSql(Class<?> clazz,String tableName,boolean isHump){ String insert = "@Insert(\"INSERT INTO "+tableName; Field[] fields = clazz.getDeclaredFields(); insert += " ("+getInsertColumns(fields,isHump)+")" +" VALUES ("+getValueColumns(fields,false)+")" +"\")"; return insert; } /* * 生成更新SQL */ private static String updateSql(Class<?> clazz,String tableName,boolean isHump){ Field[] fields = clazz.getDeclaredFields(); String idColumn; if(isHump){ idColumn = getSelectColumn(fields[0],isHump); }else{ idColumn = fields[0].getName(); } String idVal = getValueColumn(fields[0]); String update = "@Update(\"<script>\"" +"\r+\"UPDATE "+tableName+"\"" +"\r+\"<trim prefix='set' suffixOverrides=',' suffix='WHERE "+idColumn+"="+idVal+"'>\""; for(int i=1; i<fields.length; i++){ Field field = fields[i]; if(isHump){ update += "\r+\"<if test='"+field.getName()+"!=null'>"+getSelectColumn(field,isHump)+"="+getValueColumn(field)+",</if>\""; }else{ update += "\r+\"<if test='"+field.getName()+"!=null'>"+field.getName()+"="+getValueColumn(field)+",</if>\""; } } update += "\r+\"</trim>\"" +"\r+\"</script>\")"; return update; } /* * 生成刪除SQL */ private static String deleteSqlById(Class<?> clazz,String tableName,boolean isHump){ String delete = "@Delete(\"DELETE FROM "+tableName+" WHERE "; Field field = clazz.getDeclaredFields()[0]; String column = getSelectColumn(field,isHump); delete += column+" = "+getValueColumn(field)+"\")"; return delete; } /* * 生成批量插入SQL */ private static String batchInsertSql(Class<?> clazz,String tableName,boolean isHump){ String insert = "@Insert(\"<script>\"" +"\r+\"INSERT INTO "+tableName+"\""; Field[] fields = clazz.getDeclaredFields(); insert += "\r+\"("+getInsertColumns(fields,isHump)+")\"" +"\r+\"VALUES \"" +"\r+\"<foreach collection='list' item='item' index='index' separator=','>\"" +"\r+\"("+getValueColumns(fields,true)+")\"" +"\r+\"</foreach>\"" +"\r+\"</script>\")"; return insert; } /* * 生成批量更新SQL */ private static String batchUpdateSql(Class<?> clazz,String tableName,boolean isHump){ Field[] fields = clazz.getDeclaredFields(); String idColumn; if(isHump){ idColumn = getSelectColumn(fields[0],isHump); }else{ idColumn = fields[0].getName(); } String idVal = getValueColumn(fields[0],true); String update = "@Update(\"<script>\"" +"\r+\"<foreach collection='list' item='item' index='index' open='' close='' separator=';'>\"" +"\r+\"UPDATE "+tableName+"\"" +"\r+\"<trim prefix='set' suffixOverrides=',' suffix='WHERE "+idColumn+"="+idVal+"'>\""; for(int i=1; i<fields.length; i++){ Field field = fields[i]; if(isHump){ update += "\r+\"<if test='item."+field.getName()+"!=null'>"+getSelectColumn(field,isHump)+"="+getValueColumn(field,true)+",</if>\""; }else{ update += "\r+\"<if test='item."+field.getName()+"!=null'>"+field.getName()+"="+getValueColumn(field,true)+",</if>\""; } } update += "\r+\"</trim>\"" +"\r+\"</foreach>\"" +"\r+\"</script>\")"; return update; } /* * 生成批量刪除SQL 主鍵刪除 */ private static String batchDeleteSqlByIds(Class<?> clazz,String tableName,boolean isHump){ String delete = "@Delete(\"<script>\"" +"\r+\"DELETE FROM "+tableName+" WHERE "; Field field = clazz.getDeclaredFields()[0]; String column = getSelectColumn(field,isHump); delete += column+" IN \"" +"\r+\"<foreach collection='primaryKeys' item='"+field.getName()+"' index='index' open='(' close=')' separator=','>\"" +"\r+\""+getValueColumn(field)+"\"" +"\r+\"</foreach>\"" +"\r+\"</script>\")"; return delete; } /* * 生成批量刪除SQL 實體刪除 */ private static String batchDeleteSql(Class<?> clazz,String tableName,boolean isHump){ String delete = "@Delete(\"<script>\"" +"\r+\"DELETE FROM "+tableName+" WHERE "; Field field = clazz.getDeclaredFields()[0]; String column = getSelectColumn(field,isHump); delete += column+" in \"" +"\r+\"<foreach collection='list' item='item' index='index' open='(' close=')' separator=','>\"" +"\r+\""+getValueColumn(field,true)+"\"" +"\r+\"</foreach>\"" +"\r+\"</script>\")"; return delete; } /* * 獲SELECT取列 */ private static String getSelectColumns(Field[] fields,boolean isHump){ String columns = ""; if(isHump){ for(Field field : fields){ columns += " "+getSelectColumn(field, isHump) +" AS "+field.getName()+","; } }else{ for(Field field : fields){ columns+=" "+getSelectColumn(field, isHump)+" AS "+field.getName()+","; } } return columns.substring(0,columns.length()-1); } /* * 獲INSERT列 */ private static String getInsertColumns(Field[] fields,boolean isHump){ String columns = ""; if(isHump){ for(Field field : fields){ columns += " "+getSelectColumn(field, isHump)+","; } }else{ for(Field field : fields){ columns+=" "+getSelectColumn(field, isHump)+","; } } return columns.substring(0,columns.length()-1).toUpperCase(); } /* * 獲insert取列 */ private static String getValueColumns(Field[] fields,boolean isBatch){ String columns = ""; for(Field field : fields){ columns+=" "+getValueColumn(field,isBatch)+","; } return columns.substring(0, columns.length()-1); } /* * 獲取單列 */ private static String getSelectColumn(Field field,boolean isHump){ String fieldName = field.getName(); String column = ""; if(isHump){ for(int i=0; i<fieldName.length(); i++){ char ch = fieldName.charAt(i); if(Character.isUpperCase(ch)){ column += "_"+ch; }else{ column += ch; } } }else{ column = fieldName; } return column.toUpperCase(); } /* * 獲取單值列 */ private static String getValueColumn(Field field,boolean isBatch){ if(isBatch){ return "#{item."+field.getName()+"}"; }else{ return "#{"+field.getName()+"}"; } } /* * 獲取單值列 */ private static String getValueColumn(Field field){ return getValueColumn(field,false); } }