类似hibernate实现sql增删改错
2017-06-13 15:10
387 查看
Util
pk
table
Noupdate
NoInsert
Filed
FiledInfo
Condition
ConditionDef
---
package utils; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; public class SQLUtils { /** * 2014-05修改 增加对查询语句的缓存 增加对jdbcTemplt查询出的Map转换成Bean的方法 */ private static Logger log = Logger.getLogger(SQLUtils.class); private static Map cacheMap = new HashMap(); private static Map insertSqlCache = new HashMap(); private static Map updateSqlCache = new HashMap(); private static Map deleteSqlCache = new HashMap(); private static Map selectSqlCache = new HashMap(); /** * 根据pojo类的class来构建select * from 的SQL语句 * * @param pojoClass * @return */ public static String buildSelectSql(Class pojoClass) { List<FieldInfo> fieldInfoList = loadPojoSqlInfo(pojoClass); String sql = buildSelectSql(pojoClass, fieldInfoList); if (log.isDebugEnabled()) { log.debug("select sql is:" + sql); } return sql; } /** * 根据pojo类的class来构建insert的SQL语句 * * @param pojoClass * @return */ public static String buildInsertSql(Class pojoClass) { List<FieldInfo> fieldInfoList = loadPojoSqlInfo(pojoClass); String sql = buildInsertSql(pojoClass, fieldInfoList); if (log.isDebugEnabled()) { log.debug("insert sql is:" + sql); } return sql; } /** * 根据pojo类的class构建根据pk来update的SQL语句 * * @param pojoObject * @return */ public static String buildUpdateSql(Class pojoClass) { List<FieldInfo> fieldInfoList = loadPojoSqlInfo(pojoClass); String sql = buildUpdateSqlByPK(pojoClass, fieldInfoList); if (log.isDebugEnabled()) { log.debug("update sql is:" + sql); } return sql; } /** * 根据pojo类的Class和更新的条件字段来生成upate的SQL语句 * * @param pojoClass * @param columns * @return * @throws Exception */ public static String buildUpdateSqlByColumns(Class pojoClass, String[] columns) throws Exception { if (null != columns && columns.length > 0) { List<FieldInfo> fieldInfoList = loadPojoSqlInfo(pojoClass); String sql = buildUpdateSqlByColumns(pojoClass, fieldInfoList, columns); if (log.isDebugEnabled()) { log.debug("update sql is:" + sql); } return sql; } else { if (log.isDebugEnabled()) { log.debug("生成update sql error! 参数columns必须有值"); } throw new Exception("参数columns必须有值!"); } } /** * 根据pojo类的Class生成根据pk来delete的SQL语句 * * @param pojoClass * @return */ public static String buildDeleteSql(Class pojoClass) { List<FieldInfo> fieldInfoList = loadPojoSqlInfo(pojoClass); String sql = buildDeleteSqlByPK(pojoClass, fieldInfoList); if (log.isDebugEnabled()) { log.debug("delete sql is:" + sql); } return sql; } /** * 根据pojo类的Class和更新的条件字段来生成delete的SQL语句 * * @param pojoClass * @param columns * @return * @throws Exception */ public static String buildDeleteSqlByColumns(Class pojoClass, String[] columns) throws Exception { if (null != columns && columns.length > 0) { List<FieldInfo> fieldInfoList = loadPojoSqlInfo(pojoClass); String sql = buildDeleteSqlByColumns(pojoClass, fieldInfoList, columns); if (log.isDebugEnabled()) { log.debug("delete sql is:" + sql); } return sql; } else { if (log.isDebugEnabled()) { log.debug("生成delete sql error! 参数columns必须有值"); } throw new Exception("参数columns必须有值!"); } } /** * 将SQL查询出来的map对象转成实体对象 * * @param map * @param pojoClass * @return * @throws Exception */ public static Object coverMapToBean(Map map, Class pojoClass) throws Exception { Object result = pojoClass.newInstance(); List<FieldInfo> list = loadPojoSqlInfo(pojoClass); for (FieldInfo fieldInfo : list) { String dbName = fieldInfo.getDbFieldName().toUpperCase(); String fieldName = fieldInfo.getPojoFieldName(); String setMethoName = "set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); if (map.get(dbName) != null) { Method m = pojoClass.getMethod(setMethoName, fieldInfo.getType()); m.invoke(result, map.get(dbName)); } } return result; } /** * 加载读取pojo的注解信息 * * @param pojoClass * @return */ @SuppressWarnings("unchecked") private static List<FieldInfo> loadPojoSqlInfo(Class pojoClass) { List<FieldInfo> resultList = null; if (null == cacheMap.get(pojoClass.getName())) { resultList = new ArrayList<FieldInfo>(); java.lang.reflect.Field[] fields = pojoClass.getDeclaredFields(); for (java.lang.reflect.Field field : fields) { FieldInfo fieldInfo = new FieldInfo(); fieldInfo.setPojoFieldName(field.getName()); if (field.isAnnotationPresent(Field.class)) { String value = ((Field) field .getAnnotation(Field.class)).value();// 得到配置的数据库字段名 if (StringUtils.isEmpty(value)) {// 没有设置数据库的字段名,则取pojo的字段名 fieldInfo.setDbFieldName(lowerStrToUnderline(field .getName())); } else { fieldInfo.setDbFieldName(value); } } else { fieldInfo.setDbFieldName(lowerStrToUnderline(field .getName())); } if (field.isAnnotationPresent(PK.class)) { fieldInfo.setIsPk(true); } if (field.isAnnotationPresent(NoInsert.class)) { fieldInfo.setIsInsert(false); } if (field.isAnnotationPresent(NoUpdate.class)) { fieldInfo.setIsUpdate(false); } fieldInfo.setType(field.getType()); resultList.add(fieldInfo); } cacheMap.put(pojoClass.getName(), resultList); } else { resultList = (List<FieldInfo>) cacheMap.get(pojoClass.getName()); } return resultList; } /** * 评价select语句 * * @param pojoClass * @param fieldInfoList * @return */ private static String buildSelectSql(Class pojoClass, List<FieldInfo> fieldInfoList) { if (selectSqlCache.get(pojoClass.getName()) != null) { return (String) selectSqlCache.get(pojoClass.getName()); } return "select * from " + loadTableName(pojoClass); } /** * 拼接insert的SQL * * @param pojoClass * @param fieldInfoList * @return */ @SuppressWarnings("unchecked") private static String buildInsertSql(Class pojoClass, List<FieldInfo> fieldInfoList) { String result = null; if (insertSqlCache.get(pojoClass.getName()) != null) { result = (String) insertSqlCache.get(pojoClass.getName()); return result; } String tableName = loadTableName(pojoClass); StringBuffer temp1 = new StringBuffer(); StringBuffer temp2 = new StringBuffer(); for (FieldInfo fieldInfo : fieldInfoList) { if (fieldInfo.isInsert()) { temp1.append(fieldInfo.getDbFieldName()).append(","); temp2.append(":").append(fieldInfo.getPojoFieldName()) .append(","); } } temp1.deleteCharAt(temp1.length() - 1); temp2.deleteCharAt(temp2.length() - 1); StringBuffer resultSql = new StringBuffer(); resultSql.append("insert into "); resultSql.append(tableName); resultSql.append("("); resultSql.append(temp1); resultSql.append(") values ("); resultSql.append(temp2); resultSql.append(")"); result = resultSql.toString(); insertSqlCache.put(pojoClass.getName(), result); return result; } /** * 生成根据主键生成删除的SQL * * @param pojoClass * @param fieldInfoList * @return */ @SuppressWarnings("unchecked") private static String buildDeleteSqlByPK(Class pojoClass, List<FieldInfo> fieldInfoList) { String result = null; if (deleteSqlCache.get(pojoClass.getName() + "_pk") != null) { result = (String) deleteSqlCache.get(pojoClass.getName()); return result; } StringBuffer resultSql = new StringBuffer(); resultSql.append(appendBaseDeleteSQL(pojoClass)); for (FieldInfo fieldInfo : fieldInfoList) { if (fieldInfo.isPk()) { resultSql.append(fieldInfo.getDbFieldName()); resultSql.append("=:").append(fieldInfo.getPojoFieldName()) .append(" and "); } } resultSql.delete(resultSql.length() - 4, resultSql.length()); result = resultSql.toString(); deleteSqlCache.put(pojoClass.getName() + "_pk", result); return result; } /** * 拼接根据主键来update的SQL * * @param pojoClass * @param fieldInfoList * @return */ @SuppressWarnings("unchecked") private static String buildUpdateSqlByPK(Class pojoClass, List<FieldInfo> fieldInfoList) { String result = null; if (updateSqlCache.get(pojoClass.getName() + "_pk") != null) { result = (String) updateSqlCache.get(pojoClass.getName() + "_pk"); return result; } StringBuffer resultSql = new StringBuffer(); resultSql.append(appendBaseUpdateSQL(pojoClass, fieldInfoList)); for (FieldInfo fieldInfo : fieldInfoList) { if (fieldInfo.isPk()) { resultSql.append(fieldInfo.getDbFieldName()); resultSql.append("=:").append(fieldInfo.getPojoFieldName()) .append(" and "); } } resultSql.delete(resultSql.length() - 4, resultSql.length()); result = resultSql.toString(); updateSqlCache.put(pojoClass.getName() + "_pk", result); return result; } /** * 根据用户指定的更新条件(字段)来生成update的SQL * * @param pojoClass * @param fieldInfoList * @param columns * @return */ private static String buildUpdateSqlByColumns(Class pojoClass, List<FieldInfo> fieldInfoList, String[] columns) { StringBuffer resultSql = new StringBuffer(); if (updateSqlCache.get(pojoClass.getName() + "_columns") != null) { resultSql.append((String) updateSqlCache.get(pojoClass.getName() + "_columns")); } else { resultSql.append(appendBaseUpdateSQL(pojoClass, fieldInfoList)); } for (String column : columns) { for (FieldInfo fieldInfo : fieldInfoList) { if (column.equals(fieldInfo.getPojoFieldName())) { resultSql.append(fieldInfo.getDbFieldName()); resultSql.append("=:").append(column).append(" and "); break; } } } resultSql.delete(resultSql.length() - 4, resultSql.length()); return resultSql.toString(); } /** * 拼接update语句的where之前的sql * * @param pojoClass * @param fieldInfoList * @param resultSql */ @SuppressWarnings("unchecked") private static String appendBaseUpdateSQL(Class pojoClass, List<FieldInfo> fieldInfoList) { String result = null; if (updateSqlCache.get(pojoClass.getName() + "_columns") != null) { result = (String) updateSqlCache.get(pojoClass.getName() + "_columns"); } else { StringBuffer resultSql = new StringBuffer(); String tableName = loadTableName(pojoClass); resultSql.append("update ").append(tableName).append(" set "); for (FieldInfo fieldInfo : fieldInfoList) { if (fieldInfo.isUpdate() && !fieldInfo.isPk()) { resultSql.append(fieldInfo.getDbFieldName()); resultSql.append("=:").append(fieldInfo.getPojoFieldName()) .append(","); } } resultSql.deleteCharAt(resultSql.length() - 1); resultSql.append(" where "); result = resultSql.toString(); updateSqlCache.put(pojoClass.getName() + "_columns", result); } return result; } /** * 根据用户指定的更新条件(字段)来生成delete的SQL * * @param pojoClass * @param fieldInfoList * @param columns * @return */ private static String buildDeleteSqlByColumns(Class pojoClass, List<FieldInfo> fieldInfoList, String[] columns) { StringBuffer resultSql = new StringBuffer(); if (deleteSqlCache.get(pojoClass.getName() + "_columns") != null) { resultSql.append((String) deleteSqlCache.get(pojoClass.getName() + "_columns")); } else { resultSql.append(appendBaseUpdateSQL(pojoClass, fieldInfoList)); } for (String column : columns) { for (FieldInfo fieldInfo : fieldInfoList) { if (column.equals(fieldInfo.getPojoFieldName())) { resultSql.append(fieldInfo.getDbFieldName()); resultSql.append("=:").append(column).append(" and "); break; } } } resultSql.delete(resultSql.length() - 4, resultSql.length()); return resultSql.toString(); } /** * 拼接delete语句的where之前的sql * * @param pojoClass * @param fieldInfoList * @param resultSql */ @SuppressWarnings("unchecked") private static String appendBaseDeleteSQL(Class pojoClass) { if (deleteSqlCache.get(pojoClass.getName() + "_columns") != null) { return (String) deleteSqlCache .get(pojoClass.getName() + "_columns"); } else { String result = "delete from " + loadTableName(pojoClass) + " where "; deleteSqlCache.put(pojoClass.getName() + "_columns", result); return result; } } /** * 通过类获取表名 * * @param pojoClass * @return */ @SuppressWarnings("unchecked") private static String loadTableName(Class pojoClass) { if (pojoClass.isAnnotationPresent(Table.class)) { Table table = (Table) pojoClass.getAnnotation(Table.class); return table.value(); } else { return lowerStrToUnderline(pojoClass.getSimpleName()); } } /** * 将大写字母转换成下划线加小写字母 例:userName--> user_name * * @param str * @return */ private static String lowerStrToUnderline(String str) { if (StringUtils.isEmpty(str)) { return ""; } StringBuilder sb = new StringBuilder(str); char c; int count = 0; for (int i = 0; i < str.length(); i++) { c = str.charAt(i); if (c >= 'A' && c <= 'Z') { sb.replace(i + count, i + count + 1, (c + "").toLowerCase()); sb.insert(i + count, "_"); count++; } } return sb.toString(); } }
pk
package utils; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface PK { }
table
package utils; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface Table { public String value(); }
Noupdate
package utils; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface NoUpdate { }
NoInsert
package utils; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface NoInsert { }
Filed
package utils; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface Field { //数据库字段名 public String value() default ""; }
FiledInfo
package utils; public class FieldInfo { //java字段名 private String pojoFieldName; //数据库字段名 private String dbFieldName; //是否是主键 private boolean isPk = false; //update时是否需要更新 private boolean isUpdate = true; //insert时是否需要插入 private boolean isInsert = true; private Class type; public boolean isPk() { return isPk; } public void setIsPk(boolean isPk) { this.isPk = isPk; } public boolean isUpdate() { return isUpdate; } public void setIsUpdate(boolean isUpdate) { this.isUpdate = isUpdate; } public String getPojoFieldName() { return pojoFieldName; } public void setPojoFieldName(String pojoFieldName) { this.pojoFieldName = pojoFieldName; } public String getDbFieldName() { return dbFieldName; } public void setDbFieldName(String dbFieldName) { this.dbFieldName = dbFieldName; } public boolean isInsert() { return isInsert; } public void setIsInsert(boolean isInsert) { this.isInsert = isInsert; } public void setType(Class<?> type) { // TODO Auto-generated method stub this.type = type; } public Class getType() { // TODO Auto-generated method stub return this.type; } }
Condition
package utils; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.apache.commons.lang3.StringUtils; public class Condition { public static final String AND = " AND "; public static final String OR = " OR "; public static final char PREFIX_MATCH = 'P'; public static final char SUFFIX_MATCH = 'S'; public static final char GLOBAL_MATCH = 'G'; public static final char LIKE_MODE = 'L'; public static final char STANDARD_MODE = 0; List<Integer> varTypesList = new ArrayList(); private String conditionClauseStr = ""; private String relateOperate = AND; public Condition(ConditionDef def, Map valueMap) { this(def, valueMap, AND); } public Condition(ConditionDef def, Map valueMap, String relateOperate) { this.relateOperate = relateOperate; String[] varNameArr = def.getConditionVarNames(); List<String> usedSubConditionClauseList = new ArrayList(); for (String varName : varNameArr) { if (!StringUtils.isEmpty(valueMap.get(varName).toString())) { usedSubConditionClauseList.add(def.getSubConditionClause(varName)); Object priValue = valueMap.get(varName); if (def.isExistClassTypeInfo(varName)) { Class targetClass = def.getClassTypeInfo(varName); Object newValue = null; if (targetClass == java.sql.Date.class) { newValue = java.sql.Date.valueOf((String)priValue); valueMap.put(varName, newValue); } else if (targetClass == java.sql.Timestamp.class) { newValue = java.sql.Timestamp.valueOf((String)priValue); valueMap.put(varName, newValue); } else if (targetClass == java.sql.Time.class) { newValue = java.sql.Time.valueOf((String)priValue); valueMap.put(varName, newValue); } else if (targetClass == java.util.List.class) { List valueList=new ArrayList(); if (priValue.getClass().isArray()){ String[] valueArr=(String[])priValue; for (String string : valueArr) { valueList.add(string); } }else{ valueList.add(priValue); } valueMap.put(varName, valueList); } } if (def.isExistMatchModeInfo(varName)) { List<Character> matchModeList = def.getMatchModeInfo(varName); if (matchModeList.size() == 1) { if (matchModeList.get(0) == Condition.GLOBAL_MATCH) { priValue = "%" + priValue + "%"; } else if (matchModeList.get(0) == Condition.PREFIX_MATCH) { priValue = priValue + "%"; } else if (matchModeList.get(0) == Condition.SUFFIX_MATCH) { priValue = "%" + priValue; } valueMap.put(varName , priValue); } else { for (char currMatchMode : matchModeList) { if (currMatchMode == Condition.GLOBAL_MATCH) { String newValue = "%" + priValue + "%"; valueMap.put(varName + "_globalMatch", newValue); } else if (currMatchMode == Condition.PREFIX_MATCH) { String newValue = priValue + "%"; valueMap.put(varName + "_prefixMatch", newValue); } else if (currMatchMode == Condition.SUFFIX_MATCH) { String newValue = "%" + priValue; valueMap.put(varName + "_suffixMatch", newValue); } } } } } } this.conditionClauseStr = StringUtils.join(usedSubConditionClauseList, relateOperate); } public String getConditionClause() { return this.conditionClauseStr; } public String getConditionClauseWithWhere() { return "".equals(conditionClauseStr)?"":" WHERE " + conditionClauseStr; } public String getConditionClauseWithStartRelateOperatorIfNeeded() { if(conditionClauseStr.trim().equals("")) { return ""; }else { return this.relateOperate + " " + conditionClauseStr; } } public String getConditionClauseWithRelateOperatorAtStart() { return this.relateOperate + " " + conditionClauseStr; } public Integer[] getConditionVarTypes() { return varTypesList.toArray(new Integer[]{}); } }
ConditionDef
package utils; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; public class ConditionDef { private Map<String, String> paraNameAndSubConditionClauseMap = new LinkedHashMap(); private Map<String, Class> paraNameAndClassTypeMap = new HashMap(); private Map<String, List<Character>> paraNameAndLikeMatchInfoMap = new HashMap(); public ConditionDef(Object[][] defineArr) { for (Object[] subDefine : defineArr) { Pattern pattern = Pattern.compile(":([\\w\\d_]+)"); String currDefClause = (String) subDefine[0]; int currDefClauseLen = currDefClause.length(); Matcher matcher = pattern.matcher(currDefClause); //System.out.println(currDefClause); Set varNameSet = new HashSet(); int varNameCount = 0; char clauseMode = Condition.STANDARD_MODE; String oneVarName = null; boolean isUsedSameMatchMode=true; List<Character> matchModeList=new ArrayList(); while (matcher.find()) { String varName = matcher.group(1); oneVarName = varName; int start = matcher.start(); int end = matcher.end(); char prefix = currDefClause.charAt(start - 1); char suffix = end >= currDefClauseLen ? ' ' : currDefClause.charAt(end); char subConditionMatchMode = Condition.STANDARD_MODE; if (prefix == '%' && suffix == '%') { clauseMode = subConditionMatchMode = Condition.GLOBAL_MATCH; matchModeList.add(clauseMode); } else if (prefix == '%') { clauseMode = subConditionMatchMode = Condition.PREFIX_MATCH; matchModeList.add(clauseMode); } else if (suffix == '%') { clauseMode = subConditionMatchMode = Condition.SUFFIX_MATCH; matchModeList.add(clauseMode); } varNameSet.add(varName); varNameCount++; if(varNameCount>1&&matchModeList.size()>=2) { int size=matchModeList.size(); if(!matchModeList.get(size-1).equals(matchModeList.get(size-2))) { isUsedSameMatchMode=false; } } } if (varNameSet.size() != 1) { throw new RuntimeException("One sub condition clause must only have one var name ! clause :" + currDefClause); } if (oneVarName == null) { throw new RuntimeException("Sub condition is not have any var name ! clause :" + currDefClause); } if (subDefine.length > 1) { paraNameAndClassTypeMap.put(oneVarName, (Class) subDefine[1]); //System.out.println("save var type : " + oneVarName + "," + ((Class) subDefine[1]).getSimpleName()); } if (clauseMode != Condition.STANDARD_MODE) { if (isUsedSameMatchMode&&varNameCount==matchModeList.size()) { paraNameAndLikeMatchInfoMap.put(oneVarName, matchModeList.subList(0,1)); } else { currDefClause=currDefClause.replaceAll("%:"+oneVarName+"%", ":"+oneVarName+"_globalMatch"); currDefClause=currDefClause.replaceAll("%:"+oneVarName, ":"+oneVarName+"_suffixMatch"); currDefClause=currDefClause.replaceAll(":"+oneVarName+"%", ":"+oneVarName+"_prefixMatch"); paraNameAndLikeMatchInfoMap.put(oneVarName, matchModeList); } currDefClause = currDefClause.replaceAll("'\\%", ""); currDefClause = currDefClause.replaceAll("\\%'", ""); currDefClause = currDefClause.replaceAll("\\%", ""); currDefClause = currDefClause.replaceAll("'", ""); //System.out.println("processed clause : " + currDefClause); } String tempClause=currDefClause.toUpperCase(); if(tempClause.indexOf("AND")!=-1||tempClause.indexOf("OR")!=-1) { currDefClause="("+currDefClause+")"; } paraNameAndSubConditionClauseMap.put(oneVarName, currDefClause); } } public String[] getConditionVarNames() { // TODO Auto-generated method stub return paraNameAndSubConditionClauseMap.keySet().toArray(new String[paraNameAndSubConditionClauseMap.keySet().size()]); } public String getSubConditionClause(String varName) { // TODO Auto-generated method stub return paraNameAndSubConditionClauseMap.get(varName); } public boolean isExistClassTypeInfo(String varName) { // TODO Auto-generated method stub return paraNameAndClassTypeMap.containsKey(varName); } public Class getClassTypeInfo(String varName) { // TODO Auto-generated method stub return paraNameAndClassTypeMap.get(varName); } public boolean isExistMatchModeInfo(String varName) { // TODO Auto-generated method stub return paraNameAndLikeMatchInfoMap.containsKey(varName); } public List<Character> getMatchModeInfo(String varName) { // TODO Auto-generated method stub return paraNameAndLikeMatchInfoMap.get(varName); } }
---
相关文章推荐
- (4) hibernate增删查改+批量操作+类似Mybatis动态sql
- [置顶] A.CTable开源框架Mybatis增强自动创建表/更新表结构/实现类似hibernate共通的增删改查
- 基于Spring+Hibernate的通用增删改查的实现方法
- 封装Ext.grid.Grid+dwr实现增删该查(ext+dwr+hibernate)
- 简单的linq to sql 的例子 ,实现了增删改查。
- Hibernate使用sql语句实现多表关联查询
- Spring+Hibernate实现增删改查的两种方法
- 在DataSet实现类似sql语句的查询
- 用类似操纵Sql语句的方式快速实现Excel读写的方法(oleDB 方式)-不使用OWC
- 利用反射+自定义特性实现简单ORM(二),“无SQL”的数据库增删改查
- 使用Hibernate SQLquery实现动态表
- ASP.NET + EXTJS 实现类似GridView行内编辑、Pannel、分页、增删改查、数据验证,格式转换
- 实现类似LINQ TO SQL的功能, 轻量级的数据访问组件
- 关于ADO.NET,只须一个连接,一条SQL语句,轻松实现增删改查
- SQL实现类似C#的Split()函数的功能
- SQLSERVER Image类型 Hibernate 映射问题 简单实现
- [导入]封装Ext.grid.Grid+dwr实现增删该查(ext+dwr+hibernate)
- 在DataSet实现类似sql语句的查询
- strut2+hibernate实现的增删改查
- hibernateutil实现增删改查