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);
}