baseDao操作数据库的表字段(通用)

package com.dao;

import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

import org.apache.log4j.Logger;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

public class BaseDao {
    private static Logger logger = Logger.getLogger(BaseDao.class);
    // protected final Log logger = (Log) LogFactory.getLog(getClass());
    private String driverName = "oracle.jdbc.driver.OracleDriver";
    private String dbURL = "jdbc:oracle:thin:@192.168.8.15:1521:susdata";
    private String userName = "sa";
    private String userPwd = "sa";

    private Connection con;
    private PreparedStatement ps;
    private ResultSet rs;

    /**
     * 构造函数
     */
    public BaseDao() {
    }

    /**
     * 构造函数
     * 
     * @param DriverName
     * @param DbURL
     * @param UserName
     * @param UserPwd
     */
    public BaseDao(String DriverName, String DbURL, String UserName,
            String UserPwd) {
        this.driverName = DriverName;
        this.dbURL = DbURL;
        this.userName = UserName;
        this.userPwd = UserPwd;
    }

    /**
     * 打开数据连接sa
     * 
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public void GetConnection() {

        // try {
        // Class.forName(driverName);
        // } catch (ClassNotFoundException e) {
        // e.printStackTrace();
        // }
        // try {
        // con = DriverManager.getConnection(dbURL, userName, userPwd);
        // } catch (SQLException e) { // TODO Auto-generated catch block
        // System.out.println("连接数据库失败!");
        // e.printStackTrace();
        // }

        try {
            // 初始化查找命名空间
            Context initContext = new InitialContext();
            // 找到DataSource
            DataSource ds = (DataSource) initContext
                    .lookup("java:/comp/env/jdbc/oracleDb");
            try {
                con = ds.getConnection();
            } catch (SQLException e) {
                SimpleDateFormat formatter = new SimpleDateFormat(
                        "yyyy-MM-dd HH:mm:ss");
                logger.error("-------" + formatter.format(new Date()));
                logger.error("getConnection 连接数据失败:" + e.toString());
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } catch (NamingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    /**
     * 关闭数据连接
     * 
     */
    private void CloseConnection() {
        if (null != rs) {
            try {
                rs.close();
            } catch (SQLException e) {
                rs = null;
                e.printStackTrace();
            }
        }
        if (null != ps) {
            try {
                ps.close();
            } catch (SQLException e) {
                ps = null;
                e.printStackTrace();
            }
        }
        if (null != con) {
            try {
                con.close();
            } catch (SQLException e) {
                con = null;
                e.printStackTrace();
            }
        }
    }

    /**
     * ִ执行SQL新增,修改,删除
     * 
     * @param sql
     * @return
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public Boolean ExecuteNoQuery(String sql) throws ClassNotFoundException,
            SQLException {
        Boolean _bool = false;
        try {
            GetConnection();
            ps = con.prepareStatement(sql);
            if (0 < ps.executeUpdate()) {
                con.commit();
                _bool = true;
            } else
                _bool = false;
        
        } catch (SQLException e) {
            SimpleDateFormat formatter = new SimpleDateFormat(
                    "yyyy-MM-dd HH:mm:ss");
            logger.error("-------" + formatter.format(new Date()));
            logger.error("sql 执行失败:" + e.toString());
            logger.error("sql 语句:" + sql);
            e.printStackTrace();
            con.rollback();
            _bool = false;
        } finally {
            CloseConnection();
        }
        return _bool;
    }

    /**
     * 根据键值从数据库取数据
     * 
     * @param tableName
     * @param key
     * @param value
     * @return
     * @throws DocumentException
     */
    public List GetList(String SqlString) throws DocumentException {
        List list = new ArrayList();
        try {
            GetConnection();
            ps = con.prepareStatement(SqlString);
            rs = ps.executeQuery();
            // 有关这个数据库的信息:表名,表的索引,数据库产品的名称和版本,数据库支持的操作
            ResultSetMetaData rsmd = rs.getMetaData();
            int cols = rsmd.getColumnCount();
            while (rs.next()) {
                Map map = new HashMap();
                for (int i = 1; i <= cols; i++) {
                    String key = rsmd.getColumnName(i);
                    int type = rsmd.getColumnType(i);
                    if (type == 2)// number
                    {
                        Double value = rs.getDouble(i);
                        map.put(key, value == null ? 0 : value.doubleValue());
                    } else {
                        String value = rs.getString(i);
                        map.put(key, value == null ? "" : value.trim());
                    }
                }
                list.add(map);
            }
        } catch (Exception e) {
            SimpleDateFormat formatter = new SimpleDateFormat(
                    "yyyy-MM-dd HH:mm:ss");
            logger.error("-------" + formatter.format(new Date()));
            logger.error("sql 查询失败:" + e.toString());
            logger.error("sql 语句:" + SqlString);
            e.printStackTrace();
        } finally {
            CloseConnection();
        }

        /*
         * xml_reader try { GetConnection();
         * 
         * String xmlString = QueryToXml(SqlString, "tmp");
         * 
         * Document document = DocumentHelper.parseText(xmlString); Element el_a
         * = document.getRootElement(); for (Iterator nodes =
         * el_a.elementIterator(); nodes.hasNext();) {
         * 
         * Element el_2 = (Element) nodes.next(); Map map = new HashMap(); for
         * (Iterator node = el_2.elementIterator(); node.hasNext();) {
         * 
         * Element nd = (Element) node.next(); map.put(nd.getName(),
         * nd.getTextTrim()); } list.add(map); } } catch (ClassNotFoundException
         * e) { // TODO Auto-generated catch block e.printStackTrace(); } catch
         * (SQLException e) { // TODO Auto-generated catch block
         * e.printStackTrace(); } finally { CloseConnection(); }
         */
        return list;
    }

    /**
     * 单笔数据的增删改
     * 
     * @param tableName
     *            表名
     * @param type
     *            insert/update/delete
     * @param key
     *            主键名
     * @param value
     *            键值ֵ
     * @param map
     */
    public Boolean DataBaseHandle(String tableName, String type, String key,
            String value, Map map) {
        Boolean _bool = false;
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String sql = "";
        try {
            // 新增
            if (type.toLowerCase().equals("insert")) {
                String colName = "";
                String valueName = "";
                for (Iterator iter = map.entrySet().iterator(); iter.hasNext();) {
                    Map.Entry el = (Map.Entry) iter.next();
                    // column
                    String _Key = (String) el.getKey();
                    colName += "," + _Key;
                    // value
                    String types = el.getValue().getClass().getName();
                    if (types.equals("java.util.Date")) {
                        Date dt = (Date) el.getValue();
                        valueName += "," + "to_date('" + sdf.format(dt)
                                + "','yyyy-mm-dd hh24:mi:ss')";
                    } else {
                        if(el.getValue().toString().trim().indexOf("SEQ_")!=-1||el.getValue().toString().trim().indexOf("seq_")!=-1)
                            valueName += "," + el.getValue().toString().trim();
                        else 
                            valueName += ",'" + el.getValue().toString().trim() + "'";
                    }
                }
                sql += "insert into " + tableName + "(" + colName.substring(1)
                        + ") values(" + valueName.substring(1) + ")";
            }
            // 修改
            if (type.toLowerCase().equals("update")) {
                String sqlTemp = "";
                for (Iterator iter = map.entrySet().iterator(); iter.hasNext();) {
                    Map.Entry el = (Map.Entry) iter.next();
                    String _Key = (String) el.getKey();
                    String _value = "";
                    String types = el.getValue().getClass().getName();
                    if (types.equals("java.util.Date")) {
                        Date dt = (Date) el.getValue();
                        _value += "to_date('" + sdf.format(dt)
                                + "','yyyy-mm-dd hh24:mi:ss')";
                    } else {
                        _value += "'" + el.getValue().toString().trim() + "'";
                    }
                    sqlTemp += "," + _Key + "=" + _value;
                }
                sql += "update " + tableName + " set " + sqlTemp.substring(1)
                        + " where " + key + "='" + value + "'";
                ;
            }
            // 删除
            if (type.toLowerCase().equals("delete")) {
                sql += "delete from " + tableName + " where " + key + " ='"
                        + value + "'";
            }
            _bool = ExecuteNoQuery(sql);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            CloseConnection();
        }
        return _bool;
    }

    /**
     * 根据查询的SQL返回XML
     * 
     * @param sql
     * @param tableName
     * @return
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public String QueryToXml(String sql, String tableName)
            throws ClassNotFoundException, SQLException {
        Document document = DocumentHelper.createDocument();
        Element root = (Element) document.addElement("TableNodes");
        try {
            GetConnection();
            ps = con.prepareStatement(sql);
            rs = ps.executeQuery();
            // 有关这个数据库的信息:表名,表的索引,数据库产品的名称和版本,数据库支持的操作
            ResultSetMetaData rsmd = rs.getMetaData();
            int cols = rsmd.getColumnCount();

            while (rs.next()) {
                Element el = root.addElement("TableNode").addAttribute(
                        "TableName", tableName);
                for (int i = 1; i <= cols; i++) {
                    Element element = el.addElement(rsmd.getColumnName(i));

                    @SuppressWarnings("unused")
                    int type = rsmd.getColumnType(i);
                    if (type == 2)// number
                    {
                        Double rvalue = rs.getDouble(i);
                        element.setText(rvalue.toString());
                    } else {
                        element.setText(rs.getString(i) == null ? "" : rs
                                .getString(i));
                    }

                }
            }

            // 下面供测试,创建outputStream对象,设置格式和是否换行
            OutputFormat format = new OutputFormat();
            format.setEncoding("gb2312");
            format.setNewlines(true);
            XMLWriter write = new XMLWriter(new FileWriter("c://f.xml"), format);
            write.write(document);
            write.close();

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            CloseConnection();
        }
        return root.asXML();
    }

    /**
     * 增删改,由XML写到数据库。说明:三个属性必须要统一即:TableName="表名"
     * CommandType="Insert/Update/Delete" KeyName="唯一主键,不支持联合主键" KeyValue="主键值ֵ"
     * 
     * @param XmlString
     * @return
     * @throws DocumentException
     */
    public Boolean ExecuteXmlToDataBase(String XmlString)
            throws DocumentException {
        Boolean _bool = false;
        try {
            Document document = DocumentHelper.parseText(XmlString);
            // 每个XMl必须有CommandType属性指令集,insert,Update,Delete
            Element el = document.getRootElement();
            String sql = "";
            for (Iterator it = el.elementIterator(); it.hasNext();) {
                Element TableNode = (Element) it.next();
                if (TableNode.attributeValue("CommandType").toLowerCase()
                        .equals("insert")) {
                    String tableName = TableNode.attributeValue("TableName");
                    String colName = "";
                    String valueName = "";
                    for (Iterator iel = TableNode.elementIterator(); iel
                            .hasNext();) {
                        Element eel = (Element) iel.next();
                        colName += "," + eel.getName();
                        valueName += "," + "'" + eel.getTextTrim() + "'";
                    }

                    sql += ";insert into " + tableName + "("
                            + colName.substring(1) + ") values("
                            + valueName.substring(1) + ")";
                }
                if (TableNode.attributeValue("CommandType").toLowerCase()
                        .equals("update")) {
                    String KeyName = TableNode.attributeValue("KeyName");
                    String KeyValue = TableNode.attributeValue("KeyValue");

                    String tableName = TableNode.attributeValue("TableName");
                    String colName = "";
                    String valueName = "";

                    sql += ";update " + tableName + " set ";
                    String sqlTemp = "";
                    for (Iterator iel = TableNode.elementIterator(); iel
                            .hasNext();) {
                        Element eel = (Element) iel.next();
                        colName += "," + eel.getName();
                        valueName += "," + "'" + eel.getTextTrim() + "'";
                        sqlTemp += "," + eel.getName() + "=" + "'"
                                + eel.getTextTrim() + "'";
                    }
                    sql += sqlTemp.substring(1) + " where " + KeyName + "='"
                            + KeyValue + "'";
                }
                if (TableNode.attributeValue("CommandType").toLowerCase()
                        .equals("delete")) {
                    String KeyName = TableNode.attributeValue("KeyName");
                    String KeyValue = TableNode.attributeValue("KeyValue");

                    String tableName = TableNode.attributeValue("TableName");
                    sql += ";delete from " + tableName + " where " + KeyName
                            + " ='" + KeyValue + "'";
                }
            }
            sql = sql.substring(1);
            _bool = ExecuteNoQuery(sql);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            CloseConnection();
        }
        return _bool;
    }

    /**
     * 根据数据集(单笔)Map批量产生XMl,并存入数据库
     * 
     * @param tableName
     *            表名
     * @param type
     *            insert/update/delete
     * @param key
     *            主键名
     * @param value
     *            键值ֵ
     * @param map
     */
    public Boolean CreateXMl(String tableName, String type, String key,
            String value, Map map) {

        Boolean _done = false;
        Document document = DocumentHelper.createDocument();
        document.setXMLEncoding("utf-8");
        Element root = (Element) document.addElement("TableNodes");
        Element el = root.addElement("TableNode");
        el.addAttribute("TableName", tableName);
        el.addAttribute("CommandType", type);
        el.addAttribute("KeyName", key);
        el.addAttribute("KeyValue", value);

        try {
            Set set = map.entrySet();
            Iterator iterator = set.iterator();
            while (iterator.hasNext()) {
                Map.Entry mapentry = (Map.Entry) iterator.next();

                String _key = (String) mapentry.getKey();
                String _value = (String) mapentry.getValue();
                Element element = el.addElement(_key);
                element.setText(_value);
            }

            // 下面供测试,创建outputStream对象,设置格式和是否换行
            // OutputFormat format = new OutputFormat();
            // format.setEncoding("gb2312");
            // format.setNewlines(true);
            // XMLWriter write = new XMLWriter(new FileWriter("c://f.xml"),
            // format);
            // write.write(document);
            // write.close();

            // 新增一笔数据
            String asd = root.asXML();
            _done = ExecuteXmlToDataBase(root.asXML());
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        } finally {
            CloseConnection();
        }
        return _done;
    }
    /**
     * 向数据库中新增blob字段
     * @param sqlString
     * @param blobUrl
     * @param pkId01
     * @param pkId02
     * @return
     */
    private Statement pstmt = null;
    public Boolean updateBlobDate(String insertSql, String updateSql, String blobUrl) {
        Boolean _bool = true;
        try {
            GetConnection();
            pstmt = con.createStatement();
            con.setAutoCommit(false);
            OutputStream os = null;
            //插入一个空的empty_blob
            pstmt.executeUpdate(insertSql);
            // 锁定数据行进行更新,注意"for update"语句  
            rs = pstmt.executeQuery(updateSql);
            if (rs.next()) {  
                // 得到java.sql.Blob对象后强制转换为oracle.sql.BLOB  
                oracle.sql.BLOB blob = (oracle.sql.BLOB) rs.getBlob("IMG");  
                  
                // 通过getBinaryOutputStream()方法获得向数据库中插入图片的"管道"  
                os = blob.getBinaryOutputStream();  
                  
                // 读取想要存储的图片文件  
                InputStream is = new FileInputStream(blobUrl);  
                  
                // 依次读取流字节,并输出到已定义好的数据库字段中.  
                int i = 0;  
                while ((i = is.read()) != -1) {  
                    os.write(i);  
                }  
                is.close();
            }  
            os.flush();  
            os.close();  
            con.commit();
            con.setAutoCommit(true);// 恢复现场  
        } catch (Exception e) {
            e.printStackTrace();
            try {
                con.rollback();
            } catch (SQLException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            _bool = false;
        } finally {
            CloseConnection();
        }
        return _bool;
    }
    /**
     * 读取Oracle中Blob字段
     * @param querySql
     * @param string
     * @return
     */
    public byte[] getBlobByteArray(String sql, String colName){
        Blob blob = null;
        byte[] data = null;
        try {
            GetConnection();
            ps = con.prepareStatement(sql);
            rs = ps.executeQuery();
            StringBuffer myStringBuffer = new StringBuffer();
            while (rs.next()) {
                Map map = new HashMap();
                blob = rs.getBlob(colName);
            }
            InputStream inStream = blob.getBinaryStream();
            long nLen = blob.length();
            int nSize = (int) nLen;
            //System.out.println("img data size is :" + nSize);
            data = new byte[nSize];
            inStream.read(data);
            inStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            CloseConnection();
        }
        return data;
    }

}
 

转载于:https://my.oschina.net/ldm95/blog/719174

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值