欢迎大家指出不足之处!/** 提供基本的面向对象的数据库操作(基于驼峰命名法Camel-Case)
 * (支持的Oracle数据类型:VARCHAR2、NVARCHAR2、CHAR、NCHAR、FLOAT、NUMBER、DATE、TIMESTAMP)
 * (支持的Java数据类型:ava.lang.Byte、java.lang.Short、java.lang.Integer、java.lang.Long、java.lang.Float、java.lang.Double、java.sql.Date、java.util.Date、java.sql.Timestamp)
 * @author yangxuan
 * @time 2011-11-11上午11:11:11
 */
public class BaseDaoFactory{
private Logger logger = Logger.getLogger(this.getClass());
private Map<String,Set<String>> tableColumns = new Hashtable<String, Set<String>>();
private Map<String,String> columnsType = new Hashtable<String, String>();
private Map<String,Set<String>> tablePrimaryKeys = new Hashtable<String,Set<String>>();
private String prefix = "jk_";

private static BaseDaoFactory baseDaoFactory = new BaseDaoFactory();

private BaseDaoFactory() {
}

public static BaseDaoFactory getInstance(){
if(null == baseDaoFactory){
baseDaoFactory = new BaseDaoFactory();
}
return baseDaoFactory;
}

/**
 * 保存
 * @param pojo 保存的对象实例
 * @param conn 数据库连接对象
 * @return boolean 是否成功,true成功:false不成功
 */
public boolean saveObject(Object pojo,Connection conn) {
PreparedStatement st = null;
try{
String tableName = this.getTableName(pojo);
StringBuffer prefix = new StringBuffer();
prefix.append("insert into "+tableName+"(");
StringBuffer suffix = new StringBuffer();
suffix.append(" values(");
List<String> columns = getTableColumns(pojo,conn);
for (int i = 0; i < columns.size(); i++) {
String columnName = columns.get(i);
String columnValue = this.convertToSqlValue(pojo, columnName, conn);
prefix.append(columnName);
prefix.append(", ");
suffix.append(columnValue);
suffix.append(", ");
}
if(columns.size()>0){
prefix = prefix.delete(prefix.length()-2,prefix.length());
suffix = suffix.delete(suffix.length()-2,suffix.length());
}
prefix.append(")");
suffix.append(")");
String sql = prefix.toString() + suffix.toString();
logger.info(sql);
st = conn.prepareStatement(sql);
st.executeUpdate();
return true;
}catch(Exception e){
logger.error("database insert row error!", e);
return false;
}finally{
this.close(null, st, null);
}
}
/**
 * 更新
 * @param conditionPojo 更新之前的实例
 * @param conditionNullValue 是否将空值加入where判断条件,true加入:false不加入
 * @param valuePojo 更新之后的实例
 * @param updateNullValue 是否将空值也更新到数据库,true更新:false不更新
 * @param conn 数据库连接对象
 * @return boolean 是否成功,true成功:false不成功
 */
public boolean updateObject(Object conditionPojo,boolean conditionNullValue,Object valuePojo,boolean updateNullValue,Connection conn) {
PreparedStatement st = null;
try{
if(!conditionPojo.getClass().getName().equals(valuePojo.getClass().getName())){
logger.error("the two objects's class name is not the same one!");
return false;
}
String tableName = this.getTableName(conditionPojo);
StringBuffer prefix = new StringBuffer();
prefix.append("update "+tableName+" set ");
List<String> columns = this.getTableColumns(conditionPojo,conn);
boolean has = false;
for (int i = 0; i < columns.size(); i++) {
String columnName = columns.get(i);
String columnValue = this.convertToSqlValue(valuePojo, columnName, conn);
if(updateNullValue){
if(null != columnValue){
prefix.append(columnName);
prefix.append(" = ");
prefix.append(columnValue);
prefix.append(", ");
has = true;
}
}else{
if(null != columnValue && !"NULL".equals(columnValue)){
prefix.append(columnName);
prefix.append(" = ");
prefix.append(columnValue);
prefix.append(", ");
has = true;
}
}
}
if(has){
prefix = prefix.delete(prefix.length()-2,prefix.length());
}
List <String> primaryKeys = this.getTablePrimaryKeys(conditionPojo, conn);
if(primaryKeys.size() == 0){
primaryKeys = columns;
}
StringBuffer suffix = new StringBuffer();
suffix.append(" where ");
has = false;
for (int i = 0; i < primaryKeys.size(); i++) {
String columnName = primaryKeys.get(i);
String columnValue = this.convertToSqlValue(conditionPojo, columnName, conn);
if(conditionNullValue){
if(null != columnValue){
if("NULL".equals(columnValue)){
suffix.append(columnName);
suffix.append(" is ");
suffix.append(columnValue);
suffix.append(" and ");
has = true;
}else{
suffix.append(columnName);
suffix.append(" = ");
suffix.append(columnValue);
suffix.append(" and ");
has = true;
}
}
}else{
if(null != columnValue && !"NULL".equals(columnValue)){
suffix.append(columnName);
suffix.append(" = ");
suffix.append(columnValue);
suffix.append(" and ");
has = true;
}
}
}
if(has){
suffix = suffix.delete(suffix.length()-5,suffix.length());
}
String sql = prefix.toString() + suffix.toString();
logger.info(sql);
st = conn.prepareStatement(sql);
st.executeUpdate();
return true;
}catch(Exception e){
logger.error("database update row or rows error!", e);
return false;
}finally{
this.close(null, st, null);
}
}
/**
 * 删除
 * @param pojo 删除的对象实例
 * @param conditionNullValue 是否将空值加入where判断条件,true加入:false不加入
 * @param conn 数据库连接对象
 * @return boolean 是否成功,true成功:false不成功
 */
public boolean deleteObject(Object pojo,boolean conditionNullValue,Connection conn) {
PreparedStatement st = null;
try{
String tableName = this.getTableName(pojo);
StringBuffer prefix = new StringBuffer();
prefix.append("delete from "+tableName);
StringBuffer suffix = new StringBuffer();
suffix.append(" where ");
List <String> primaryKeys = this.getTablePrimaryKeys(pojo, conn);
if(primaryKeys.size() == 0){
primaryKeys = this.getTableColumns(pojo, conn);
}
boolean has = false;
for (int i = 0; i < primaryKeys.size(); i++) {
String columnName = primaryKeys.get(i);
String columnValue = this.convertToSqlValue(pojo, columnName, conn);
if(conditionNullValue){
if(null != columnValue){
if("NULL".equals(columnValue)){
suffix.append(columnName);
suffix.append(" is ");
suffix.append(columnValue);
suffix.append(" and ");
has = true;
}else{
suffix.append(columnName);
suffix.append(" = ");
suffix.append(columnValue);
suffix.append(" and ");
has = true;
}
}
}else{
if(null != columnValue && !"NULL".equals(columnValue)){
suffix.append(columnName);
suffix.append(" = ");
suffix.append(columnValue);
suffix.append(" and ");
has = true;
}
}
}
if(has){
suffix = suffix.delete(suffix.length()-5,suffix.length());
}
String sql = prefix.toString() + suffix.toString();
logger.info(sql);
st = conn.prepareStatement(sql);
st.executeUpdate();
return true;
}catch(Exception e){
logger.error("database delete row or rows error!", e);
return false;
}finally{
this.close(null, st, null);
}
}
/**
 * 查询
 * @param pojo 查询的对象实例
 * @param conditionNullValue 是否将空值加入where判断条件,true加入:false不加入
 * @param conn 数据库连接对象
 * @return List 对象实例的集合
 */
public List<Object> findObject(Object pojo,boolean conditionNullValue,Connection conn) {
PreparedStatement st = null;
ResultSet rs = null;
List<Object> list = new ArrayList<Object>();
try{
String tableName = this.getTableName(pojo);
StringBuffer prefix = new StringBuffer();
prefix.append("select ");
StringBuffer suffix = new StringBuffer();
suffix.append(" where ");
List <String> columns = this.getTableColumns(pojo, conn);
boolean has = false;
for (int i = 0; i < columns.size(); i++) {
String columnName = columns.get(i);
prefix.append(columnName);
prefix.append(", ");
String columnValue = this.convertToSqlValue(pojo, columnName, conn);
if(conditionNullValue){
if(null != columnValue){
if("NULL".equals(columnValue)){
suffix.append(columnName);
suffix.append(" is ");
suffix.append(columnValue);
suffix.append(" and ");
has = true;
}else{
suffix.append(columnName);
suffix.append(" = ");
suffix.append(columnValue);
suffix.append(" and ");
has = true;
}
}
}else{
if(null != columnValue && !"NULL".equals(columnValue)){
suffix.append(columnName);
suffix.append(" = ");
suffix.append(columnValue);
suffix.append(" and ");
has = true;
}
}
}
if(columns.size()>0){
prefix = prefix.delete(prefix.length()-2,prefix.length());
}
prefix.append(" from "+ tableName);
if(has){
suffix = suffix.delete(suffix.length()-5,suffix.length());
}else{
suffix.setLength(0);
}
String sql = prefix.toString() + suffix.toString();
logger.info(sql);
st = conn.prepareStatement(sql);
rs = st.executeQuery();
while(rs.next()){
Object obj = Class.forName(pojo.getClass().getName()).newInstance();
for (int i = 0; i < columns.size(); i++) {
String columnName = columns.get(i);
Object objValue = rs.getObject(columnName);
if(null != objValue){
this.setPojoValue(obj, columnName, objValue, conn);
}
}
list.add(obj);
}
}catch(Exception e){
logger.error("database find row or rows error!", e);
}finally{
this.close(null, st, null);
}
return list;
}
}

解决方案 »

  1.   

    一些内部方法private String getTableName(Object pojo) throws Exception {
    if(null == pojo){
    return "";
    }else{
    List<Integer> positions = new ArrayList<Integer>();
    String className = pojo.getClass().getSimpleName();
    for (int i = 0; i < className.length(); i++) {
    int charCode = (int)className.charAt(i);
    if (i > 0 && charCode > 64 && charCode < 91) {
    positions.add(i);
    }
    }
    StringBuffer sb = new StringBuffer();
    if(null != prefix && !"".equals(prefix.trim())){
    sb.append(prefix);
    }
    if(positions.size() < 1){
    sb.append(className);
    }else{
    for (int i = 0; i < positions.size(); i++) {
    if(i == 0){
    sb.append(className.substring(0, positions.get(i)));
    }else{
    sb.append(className.substring(positions.get(i-1), positions.get(i)));
    }
    sb.append("_");
    }
    sb.append(className.substring(positions.get(positions.size()-1)));
    }
    return sb.toString().toUpperCase();
    }
    }

    private void fillTableColumns(Object pojo,Connection conn) throws Exception{
    PreparedStatement st = null;
    ResultSet rs = null;
    try{
    String tableName = this.getTableName(pojo);
    String sql = "SELECT COLUMN_NAME FROM USER_TAB_COLUMNS WHERE TABLE_NAME = '"+tableName+"'";
    logger.info(sql);
    st = conn.prepareStatement(sql);
    rs = st.executeQuery();
    Set<String> set = new HashSet<String>();
    while(rs.next()){
    String columnName = rs.getString("COLUMN_NAME");
    if(null != columnName && !"".equals(columnName.trim())){
    set.add(columnName.toUpperCase());
    }
    }
    if(set.size()>0){
    tableColumns.put(tableName, set);
    }
    }catch(Exception e){
    throw e;
    }finally{
    this.close(rs, st, null);
    }
    }

    private void fillTableColumnsType(Object pojo,Connection conn) throws Exception{
    PreparedStatement st = null;
    ResultSet rs = null;
    try{
    String tableName = this.getTableName(pojo);
    String sql = "SELECT COLUMN_NAME, DATA_TYPE FROM USER_TAB_COLUMNS WHERE TABLE_NAME = '"+tableName+"'";
    logger.info(sql);
    st = conn.prepareStatement(sql);
    rs = st.executeQuery();
    while(rs.next()){
    String columnName = rs.getString("COLUMN_NAME");
    if(null != columnName && !"".equals(columnName.trim())){
    String dataType = rs.getString("DATA_TYPE");
    if(null != dataType && !"".equals(dataType.trim())){
    columnsType.put(tableName+"."+columnName.toUpperCase(), dataType.toUpperCase());
    }
    }
    }
    }catch(Exception e){
    throw e;
    }finally{
    this.close(rs, st, null);
    }
    }

    private void fillTablePrimaryKeys(Object pojo,Connection conn) throws Exception{
    PreparedStatement st = null;
    ResultSet rs = null;
    try{
    String tableName = this.getTableName(pojo);
    String sql="SELECT A.COLUMN_NAME FROM USER_CONS_COLUMNS A, USER_CONSTRAINTS B WHERE A.CONSTRAINT_NAME = B.CONSTRAINT_NAME AND A.TABLE_NAME = B.TABLE_NAME AND B.TABLE_NAME = '"+tableName+"' and B.CONSTRAINT_TYPE='P'";
    logger.info(sql);
    st = conn.prepareStatement(sql);
    rs = st.executeQuery();
    Set<String> set = new HashSet<String>();
    while(rs.next()){
    String columnName = rs.getString("COLUMN_NAME");
    if(null != columnName && !"".equals(columnName.trim())){
    set.add(columnName.toUpperCase());
    }
    }
    if(set.size()>0){
    tablePrimaryKeys.put(tableName, set);
    }
    }catch(Exception e){
    throw e;
    }finally{
    this.close(rs, st, null);
    }
    }
      

  2.   

    没了,就这么多private List<String> getTableColumns(Object pojo,Connection conn) throws Exception {
    List<String> list = new ArrayList<String>();
    String tableName = this.getTableName(pojo);
    Set<String> columns = tableColumns.get(tableName);
    if(columns == null){
    this.fillTableColumns(pojo, conn);
    }
    columns = tableColumns.get(tableName);
    if(columns != null){
    Iterator iterator = columns.iterator();
    while(iterator.hasNext()){
    list.add((String) iterator.next());
    }
    }
    return list;
    }

    private List<String> getTablePrimaryKeys(Object pojo,Connection conn) throws Exception {
    List<String> list = new ArrayList<String>();
    String tableName = this.getTableName(pojo);
    Set<String> columns = tablePrimaryKeys.get(tableName);
    if(columns == null){
    this.fillTablePrimaryKeys(pojo, conn);
    }
    columns = tablePrimaryKeys.get(tableName);
    if(columns != null){
    Iterator iterator = columns.iterator();
    while(iterator.hasNext()){
    list.add((String) iterator.next());
    }
    }
    return list;
    }

    private String convertToSqlValue(Object pojo, String columnName,Connection conn) throws Exception {
    Object obj = null;
    try{
    StringBuffer methodName = new StringBuffer("get");
    String [] str = columnName.toLowerCase().split("_");
    for (int i = 0; i < str.length; i++) {
    str[i] = str[i].replaceFirst(String.valueOf(str[i].charAt(0)), String.valueOf(str[i].charAt(0)).toUpperCase());
    methodName.append(str[i]);
    }
    Method method = pojo.getClass().getMethod(methodName.toString(), null);
    obj = method.invoke(pojo, null);
    }catch(Exception e){
    logger.error("invoke object method error!", e);
    return null;
    }
    String tableName = this.getTableName(pojo);
    String dataType = columnsType.get(tableName+"."+columnName);
    if(null == dataType){
    this.fillTableColumnsType(pojo,conn);
    }
    dataType = columnsType.get(tableName+"."+columnName);
    if("VARCHAR2".equals(dataType)||"NVARCHAR2".equals(dataType)||"CHAR".equals(dataType)||"NCHAR".equals(dataType)){
    if(obj == null || "".equals(obj.toString())){
    return "NULL";
    }else{
    return "'"+obj.toString().replace("'", "\"")+"'";
    }
    }else if("FLOAT".equals(dataType) || "NUMBER".equals(dataType)){
    if(obj == null || "".equals(obj.toString().trim())){
    return "NULL";
    }else{
    return obj.toString().replace("'", "\"");
    }
    }else if("DATE".equals(dataType)){
    if(obj == null || "".equals(obj.toString().trim())){
    return "NULL";
    }else{
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
    if("java.sql.Date".equals(obj.getClass().getName())){
    java.sql.Date date = (java.sql.Date)obj;
    return "to_date('"+sdf.format(new java.util.Date(date.getTime()))+"','yyyy/mm/dd hh24:mi:ss')";
    }else if("java.util.Date".equals(obj.getClass().getName())){
    java.util.Date date = (java.util.Date)obj;
    return "to_date('"+sdf.format(date)+"','yyyy/mm/dd hh24:mi:ss')";
    }else if("java.sql.Timestamp".equals(obj.getClass().getName())){
    java.sql.Timestamp date = (java.sql.Timestamp)obj;
    return "to_date('"+sdf.format(new java.util.Date(date.getTime()))+"','yyyy/mm/dd hh24:mi:ss')";
    }else{
    return "to_date('"+obj.toString().replace("'", "\"")+"','yyyy/mm/dd hh24:mi:ss')";
    }
    }
    }else if(dataType.indexOf("TIMESTAMP") != -1){
    if(obj == null || "".equals(obj.toString().trim())){
    return "NULL";
    }else{
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss:SSS");
    if("java.sql.Date".equals(obj.getClass().getName())){
    java.sql.Date date = (java.sql.Date)obj;
    return "to_timestamp('"+sdf.format(new java.util.Date(date.getTime()))+"','yyyy/mm/dd hh24:mi:ss:ff')";
    }else if("java.util.Date".equals(obj.getClass().getName())){
    java.util.Date date = (java.util.Date)obj;
    return "to_timestamp('"+sdf.format(date)+"','yyyy/mm/dd hh24:mi:ss:ff')";
    }else if("java.sql.Timestamp".equals(obj.getClass().getName())){
    java.sql.Timestamp date = (java.sql.Timestamp)obj;
    return "to_timestamp('"+sdf.format(new java.util.Date(date.getTime()))+"','yyyy/mm/dd hh24:mi:ss:ff')";
    }else{
    return "to_timestamp('"+obj.toString().replace("'", "\"")+"','yyyy/mm/dd hh24:mi:ss:ff')";
    }
    }
    }else{
    if(obj == null || "".equals(obj.toString())){
    return "NULL";
    }else{
    return "'"+obj.toString().replace("'", "\"")+"'";
    }
    }
    }

    private void setPojoValue(Object pojo, String columnName,Object objValue,Connection conn) throws Exception {
    Method method = null;
    String type = null;
    try{
    StringBuffer methodName = new StringBuffer("get");
    String [] str = columnName.toLowerCase().split("_");
    for (int i = 0; i < str.length; i++) {
    str[i] = str[i].replaceFirst(String.valueOf(str[i].charAt(0)), String.valueOf(str[i].charAt(0)).toUpperCase());
    methodName.append(str[i]);
    }
    method = pojo.getClass().getMethod(methodName.toString(), null);
    type = method.getGenericReturnType().toString().replaceFirst("class ", "");
    methodName = new StringBuffer("set");
    for (int i = 0; i < str.length; i++) {
    methodName.append(str[i]);
    }
    method = pojo.getClass().getMethod(methodName.toString(), new Class[]{Class.forName(type)});
    }catch(Exception e){
    logger.error("invoke object method error!", e);
    }
    String tableName = this.getTableName(pojo);
    String dataType = columnsType.get(tableName+"."+columnName);
    if(null == dataType){
    this.fillTableColumnsType(pojo,conn);
    }
    dataType = columnsType.get(tableName+"."+columnName);
    if("VARCHAR2".equals(dataType)||"NVARCHAR2".equals(dataType)||"CHAR".equals(dataType)||"NCHAR".equals(dataType)){
    java.lang.String data = (java.lang.String)objValue;
    method.invoke(pojo, data);
    }else if("FLOAT".equals(dataType) || "NUMBER".equals(dataType)){
    java.math.BigDecimal data = (java.math.BigDecimal)objValue;
    if("java.lang.Byte".equals(type)){
    method.invoke(pojo, data.byteValue());
    }else if("java.lang.Short".equals(type)){
    method.invoke(pojo, data.shortValue());
    }else if("java.lang.Integer".equals(type)){
    method.invoke(pojo, data.intValue());
    }else if("java.lang.Long".equals(type)){
    method.invoke(pojo, data.longValue());
    }else if("java.lang.Float".equals(type)){
    method.invoke(pojo, data.floatValue());
    }else if("java.lang.Double".equals(type)){
    method.invoke(pojo, data.doubleValue());
    }else{
    method.invoke(pojo, data.toString());
    }
    }else if("DATE".equals(dataType)){
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
    java.sql.Timestamp date = (java.sql.Timestamp)objValue;
    if("java.sql.Date".equals(type)){
    method.invoke(pojo, new java.sql.Date(date.getTime()));
    }else if("java.util.Date".equals(type)){
    method.invoke(pojo, new java.util.Date(date.getTime()));
    }else if("java.sql.Timestamp".equals(type)){
    method.invoke(pojo, date);
    }else{
    method.invoke(pojo, sdf.format(new java.util.Date(date.getTime())));
    }
    }else if(dataType.indexOf("TIMESTAMP") != -1){
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss:SSS");
    oracle.sql.TIMESTAMP date = (oracle.sql.TIMESTAMP)objValue;
    if("java.sql.Date".equals(type)){
    method.invoke(pojo, new java.sql.Date(date.timestampValue().getTime()));
    }else if("java.util.Date".equals(type)){
    method.invoke(pojo, new java.util.Date(date.timestampValue().getTime()));
    }else if("java.sql.Timestamp".equals(type)){
    method.invoke(pojo, date.timestampValue());
    }else{
    method.invoke(pojo, sdf.format(new java.util.Date(date.timestampValue().getTime())));
    }
    }else{
    method.invoke(pojo, objValue);
    }
    }