jdbc⽣成建表语句_使⽤JdbcTemplate动态创建表并添加数据
动态连表查询
前⾯已经说了⼀个动态的根据当前时间创建表和插⼊数据的⽰例,那么如何进⾏动态的查询呢?
我写了这样⼀个公共⽅法,仅供参考!
这⾥需要传递两个时间间隔参数,根据时间间隔判断相差的⽉数,然后从起始时间开始递增⽉份,然后动态拼装表的名称,如果存在该表则标记需要查询
所有的SQL通过 union all 来连接,最后增加分页的参数,分页只适合MySQL数据库
当然这个⽰例也只是适合于按⽉份来存储的情况
代码并不是很复杂,希望⼤家还是通过代码来理解⼀下:
package com;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import t.ApplicationContext;
import t.support.ClassPathXmlApplicationContext;
jdbctemplate查询一条数据import org.JdbcTemplate;
/**
* @说明 进⾏测试
* @author cuisuqiang
* @version 1.0
* @since
*/
public class DbTest {
private static ApplicationContext context = null;
@SuppressWarnings("unchecked")
public static void main(String[] args) {
context = new ClassPathXmlApplicationContext("l");
String key = "nm_cpu_log";
String beginTime = "2012-1-1 12:12:12";
String endTime = "2014-12-1 12:12:12";
String formatkey = "yyyy_MM";
List list = getListFromEachTable(sql,key,beginTime,endTime,formatkey,1,100); if(null != list){
System.out.println(list.size());
}else{
System.out.println("没有数据!");
}
}
/**
* 动态查询表数据
* @param sqlTemplate 要执⾏的单条SQL 其中表名称⽤ :TABLE_NAME 标识
* @param tableKey 表前缀,不包含和时间中间的 下划线
* @param dateBegin 开始时间 yyyy-MM-dd HH:mm:ss
* @param dateEnd 结束时间 yyyy-MM-dd HH:mm:ss
* @param dateFormat 时间格式化⽅式
* @param pageIndex 分页索引 从 1 开始
* @param pageCount 每页查询数量 ⽆限制
* @return 模版查询直接返回
*/
@SuppressWarnings("unchecked")
public synchronized static List getListFromEachTable(String sqlTemplate, String tableKey, String dateBegin, String dateEnd,
String dateFormat, int pageIndex, int pageCount) {
List list = null;
try {
// ⼀共有多少需要执⾏的SQL
List sqlList = new ArrayList();
JdbcTemplate jt = (JdbcTemplate) Bean("jdbcTemplate");
// 转为时间
Date dbegin = StringToDateTime(dateBegin);
int monthCount = calculateMonthIn(dend, dbegin);
for (int i = 0; i <= monthCount; i++) {
// 下 N 个⽉的时间
Date d = getNextMonth(dbegin, i);
SimpleDateFormat format = new SimpleDateFormat(dateFormat); // 动态表名
String tableName = tableKey + "_" + format.format(d);
// 如果有某表
if (getAllTableName(jt, tableName)) {
System.out.println("存在表:" + tableName);
// 替换名称获得SQL
String sql = place(":TABLE_NAME", tableName); sqlList.add(sql);
}
}
// 实际要执⾏的SQL
StringBuffer sqlGo = new StringBuffer("");
if (sqlList.size() > 0) {
for (int i = 0; i
if (i == sqlList.size() - 1) {
sqlGo.(i));
} else {
sqlGo.(i) + " union all ");
}
}
}
if (sqlList.size() > 0) {
/
/ 增加分页
int cindex = (pageIndex - 1) * pageCount;
sqlGo.append(" limit " + cindex + "," + pageCount);
}
if (!"".String())) {
list = jt.String());
}
} catch (Exception e) {
e.printStackTrace();
list = null;
}
return list;
}
/**
* 将传⼊的字符串按yyyy-MM-dd HH:mm:ss格式转换成对应的⽇期对象
* @param str 需要转换的字符串
*/
public synchronized static Date StringToDateTime(String str) {
String _pattern = "yyyy-MM-dd HH:mm:ss";
return StringToDate(str, _pattern);
}
/**
* 将插⼊的字符串按格式转换成对应的⽇期对象
* @param str 字符串
* @param pattern 格式
*/
public synchronized static Date StringToDate(String str, String pattern) { Date dateTime = null;
try {
if (str != null && !str.equals("")) {
SimpleDateFormat formater = new SimpleDateFormat(pattern); dateTime = formater.parse(str);
}
} catch (Exception ex) {
ex.printStackTrace();
}
return dateTime;
/**
* 两个时间相差的⽉数
* @param date1
* @param date2
* @return
*/
public static int calculateMonthIn(Date date1, Date date2) { Calendar cal1 = new GregorianCalendar();
cal1.setTime(date1);
Calendar cal2 = new GregorianCalendar();
cal2.setTime(date2);
int c = ((Calendar.YEAR) - (Calendar.YEAR)) * 12 + (Calendar.MONTH) - (Calendar.MONTH);
return c;
}
/**
* 获得下⼏个⽉的时间对象
* @param date
* @param count
* @return
*/
public static Date getNextMonth(Date date, int count) {
Calendar c = Instance();
c.setTime(date);
c.add(Calendar.MONTH, count);
Time();
}
/**
* 查询数据库是否有某表
* @param jt
* @param tableName
* @return
* @throws Exception
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论