JAVA连接oracle数据库并执行SQL,解决in传参的问题,并将结果放入指定队列

6 篇文章 0 订阅
3 篇文章 0 订阅

JAVA连接oracle数据库并执行SQL,解决in传参的问题

java连接ORACLE数据库并执行SQL语句,查询结果另做处理

JAVA连接Oracle

/**
     * 连接ORACLE数据库 每隔10秒查询一次数据,发送到其他队列,并修改数据库已经发送至队列的数据的删除标志
     */
    private static void extracted() {
        System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS").format(new Date()) + ":执行开始");
        Connection connect = null;
        Statement statement = null;
        ResultSet resultSet = null;
        PreparedStatement preState = null;
        PreparedStatement preState1 = null;

        try {
            //第一步:注册驱动 利用Driver对象
            //第一种方式:类加载(常用)
            //Class.forName("oracle.jdbc.OracleDriver");

            //第二种方式:利用Driver对象
            Driver driver = new OracleDriver();
            DriverManager.deregisterDriver(driver);

            //第二步:获取连接
            //第一种方式:利用DriverManager(常用)
            //connect = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "你的oracle数据库用户名", "用户名密码");

            //第二种方式:直接使用Driver
            Properties pro = new Properties();
            // 用户名
            pro.put("user", "root");
            // 密码
            pro.put("password", "root");
            connect = driver.connect("jdbc:oracle:thin:@127.0.0.1:1521", pro);

            //测试connect正确与否
//            System.out.println("数据库连接状态:"+connect);

            //第三步:获取执行sql语句对象
            //第一种方式:statement
            //statement = connect.createStatement();

            //第二种方式:PreStatement
            preState = connect.prepareStatement("select  * from table where CREATE_DATETIME > TO_DATE('2021-11-29 09:48:08', 'YYYY-MM-DD HH24:MI:SS') and DEL_FLAG = '0'");

            //第四步:执行sql语句
            //第一种方式:
            //resultSet = statement.executeQuery("select  * from tb1_dept");

            //第二种方式:
//            preState.setInt(1, 2);//1是指sql语句中第一个?,  2是指第一个?的values值
            //resultSet = preState.executeQuery();        //执行查询语句
            //查询任何语句,如果有结果集,返回true,没有的话返回false,注意如果是插入一条数据的话,虽然是没有结果集,返回false,但是却能成功的插入一条数据
//            boolean execute = preState.execute();
//            System.out.println(execute);
            // 查询结果
            resultSet = preState.executeQuery();
            // 处理sql拼接in的方法
            StringBuilder ids1 = new StringBuilder();
            //第五步:处理结果集
            while (resultSet.next()) {
                Long id = resultSet.getLong("ID");
                String msgContent = resultSet.getString("NAME");
                String delFlag = resultSet.getString("DEL_FLAG");
                ids1.append(id).append(",");
                //发送至mq队列
                try {
                    MessageByMQ mqst = new MessageByMQ();
                    mqst.init();
                    // 转发至队列
                    mqst.SendMsg(msgContent.getBytes());
                    mqst.release();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            String ids = String.valueOf(ids1);
            if (StringUtil.isNotBlank(ids)) {
                if (ids.endsWith(",")) {
                    ids = ids.substring(0, ids.length() - 1);
                }
                String sql = "update TABLE set DEL_FLAG = '1' " + "where ID in (?)";
                // 解决in拼接的问题
                String newSql = String.format(sql.replace("?", "%s"), ids);

//                System.out.println("newSql:"+newSql);
                // 将delFlag改为1
                preState1 = connect.prepareStatement(newSql);
                preState1.execute();
                System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS").format(new Date()) + ":执行结束");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //第六步:关闭资源
            try {
                if (resultSet != null) resultSet.close();
                if (statement != null) statement.close();
                if (connect != null) connect.close();
                if (preState != null) preState.close();
                if (preState1 != null) preState1.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

发送消息至指定队列


 
import com.ibm.mq.MQC;
import com.ibm.mq.MQEnvironment;
import com.ibm.mq.MQException;
import com.ibm.mq.MQGetMessageOptions;
import com.ibm.mq.MQMessage;
import com.ibm.mq.MQPutMessageOptions;
import com.ibm.mq.MQQueue;
import com.ibm.mq.MQQueueManager;

import java.io.IOException;
import java.io.InputStream;

/**
 * 列出常用的錯誤碼:如下:
 * 2540:通道定义有错误:</p>
 * 		解决方式如下:</p>
 * 			1.进入用户交互界面:runmqsc  QMEMBFE(QMEMBFE为队列管理器名称)
 * 			2.创建相应的服务器连接通道:DEFINE CHANNEL(DC.SVRCONN) CHLTYPE (SVRCONN) REPLACE
 * 2035:授权相关错误:解决方式如下:
 * 		进入用户交互界面:(同上):
 * 	ALTER CHANNEL(DC.SVRCONN) CHLTYPE(SVRCONN) MCAUSER('mqm')
 * 	说明:DC.SVRCONN 服务器连接通道名称 mqm为ibm mq用户名称
 * 
 * 
 * 
 * 
 * @author lxd
 *
 */
 
public class MessageByMQ {
	
	/**
	 * 队列管理器的名称
	 */
	private String qManagerName="TestOne";
	
	/**
	 * 队列管理器
	 */
	private   MQQueueManager qMgr;
	/**
	 * 队列名称
	 */
	private  String queueName="MQ_NAME";
	/**
	 * 队列
	 */
	private MQQueue qQueue;
	
	/**
	 * mq服务器所在的主机名称
	 */
	private String hostname="127.0.0.1";
	/**
	 * 服务器连接通道名称
	 */
	private String channelName="channel";
	
	/**
	 * 监听器监听的端口
	 */
	private  int  port=1414;
	/**
	 * 传输的编码类型
	 */
	private int CCSID = 1381;

	public  void  init(){
        try {
            // 安裝MQ所在的ip address
            MQEnvironment.hostname = this.hostname;
            // TCP/IP port
            MQEnvironment.port = this.port;
            // 通道名称
            MQEnvironment.channel = this.channelName;
            // CCSID(windows:1381\linux:1208)
            MQEnvironment.CCSID = CCSID;
            qMgr = new MQQueueManager(this.qManagerName);
            int qOptioin = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_INQUIRE | MQC.MQOO_OUTPUT;
            qQueue = qMgr.accessQueue(queueName, qOptioin);
        } catch (MQException e) {
        	e.printStackTrace();
        }
	}








    /**
     * 发送信息
     */
 
    public void SendMsg(byte[] qByte) {
        try {

           MQMessage qMsg = new MQMessage();
            qMsg.write(qByte);
            MQPutMessageOptions pmo = new MQPutMessageOptions();
            qQueue.put(qMsg, pmo);
//            System.out.println("发送成功");
//            System.out.println("The message is sent!");
//            System.out.println("\tThe message is " + new String(qByte, "GBK"));
        } catch (MQException e) {
        	e.printStackTrace();
//            System.out.println("A WebSphere MQ error occurred : Completion code "
//                            + e.completionCode + " Reason Code is "
//                            + e.reasonCode);
        } catch (java.io.IOException e) {
        	e.printStackTrace();
//            System.out.println("An error occurred whilst to the message buffer " + e);
        }
 
    }
    
    
 
    
    /**
     * 从消息队列取数据
     */
    public void GetMsg() {
        try {
            MQMessage retrievedMessage = new MQMessage();

            MQGetMessageOptions gmo = new MQGetMessageOptions();
            gmo.options += MQC.MQPMO_SYNCPOINT;
            qQueue.get(retrievedMessage, gmo);
            int length = retrievedMessage.getDataLength();

            byte[] msg = new byte[length];

            retrievedMessage.readFully(msg);

            String sMsg = new String(msg, "GBK");

        } catch (RuntimeException e) {
            e.printStackTrace();
        } catch (MQException e) {
            e.printStackTrace();
            if (e.reasonCode != 2033) // 没有消息
            {
                e.printStackTrace();
                System.out.println("A WebSphere MQ error occurred : Completion code "
                                + e.completionCode
                                + " Reason Code is "
                                + e.reasonCode);
            }
        } catch (java.io.IOException e) {
            System.out.println("An error occurred whilst to the message buffer "
                            + e);
        }
    }
    
 
    
    
    
   /* *//**
     * 单元测试方法
     *//*
    
    @Test
    public  void  testMQ(){
    	MessageByMQ mqst = new MessageByMQ();
        mqst.init();
        try {
            mqst.SendMsg("你好,Webshpere MQ 7.5!".getBytes("GBK"));
            mqst.GetMsg();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }*/
    
    
    /**
     * 释放资源
     */
    public  void  release(){
        try {
            qQueue.close();
            qMgr.disconnect();
        } catch (MQException e) {
            System.out
                    .println("A WebSphere MQ error occurred : Completion code "
                            + e.completionCode + " Reason Code is "
                            + e.reasonCode);
        }	
    }
    
 
}

间隔10秒执行

//时间间隔(10秒)
    private static final long PERIOD_DAY = 10 * 1000;

    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();
        // 控制时
        calendar.set(Calendar.HOUR_OF_DAY, 9);
        // 控制分
        calendar.set(Calendar.MINUTE, 51);
        // 控制秒
        calendar.set(Calendar.SECOND, 0);
        // 得出执行任务的时间,此处为每天的00:00:00
        Date time = calendar.getTime();
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask() {
            // 这里设定将延时每天固定执行
            public void run() {
                extracted();
            }
        }, time, PERIOD_DAY);

    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值