方便管理工程中的SQL语句

[quote][size=medium] 之前在项目开发时候,经理要求把所有的SQL语句挑出文档化管理,也就是说要把项目中的SQL语句全部写到一起,方便以后维护。经理是一个资深技术人员,对新技术、框架没有关注的缘故吧,因为现成有很多这样的框架,hibernate,iBATIS 等都具有这个功能。这些框架,我也只是在以前用过一小段时间,不是很熟练,为了完成要求,为此特意设计一下简易、方便的SQL管理,使用方法。
模仿properties文件的性质。把所有SQL文件放在一个文件中,分别加上注释;使用一个SqlReader类静态加载所有SQL。在使用的地方直接获取其KEY就能得到该SQL语句。这样就很好,很方便的SQL语句含义注释,解决后期维护的问题。
下面分别贴出类properties的train.sql文件,SqlReader类,具体项目中调用SQL的TrainSqlReader类,和是一个TrainDao类。来演示这种方法使用。

[/size][/quote]



1. train.sql文件

#查询火车车次信息
select_train_detail=select t.train_name from tmp_train_time t WHERE t.train_name=? AND t.station_serial=?

#插入火车车次信息
insert_train_detail=INSERT INTO tmp_train_time t (t.train_name,t.station_serial,t.station_name,t.arrive_time,t.start_time,t.elapsed_time,t.distance,t.hard_based_seat,t.soft_based_seat,t.hard_sleeper,t.soft_sleeper) VALUES (?,?,?,?,?,?,?,?,?,?,?)

#查询未采集车次站点价格的车次
#select_train_names=SELECT train_name FROM tmp_train_time LEFT JOIN tmp_train_price ON train_name=che_ci WHERE che_ci IS NULL GROUP BY train_name ORDER BY train_name
select_train_names=SELECT train_name FROM tmp_train_time GROUP BY train_name ORDER BY train_name

#查询一趟车次所有站名
select_train_station=SELECT station_name FROM tmp_train_time WHERE train_name=? ORDER BY TO_NUMBER(station_serial)


#查询火车车次站点价格
select_train_price=SELECT che_ci FROM tmp_train_price WHERE che_ci=? AND chu_fa_zhan=? AND dao_da_zhan=?

#插入火车车次站点价格
insert_train_price=INSERT INTO tmp_train_price (che_ci,chu_fa_zhan,dao_da_zhan,ying_zuo,ruan_zuo,ying_wo_shang,ying_wo_zhong,ying_wo_xia,ruan_wo_shang,ruan_wo_xia,yi_deng_zuo,er_deng_zuo,gao_ji_ruan_wo_shang,gao_ji_ruan_wo_xia) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)


2.SqlReader.java类。解析sql文件,根据key获取sql语句。

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.HashMap;

/**
* 读取SQL文件指定键名的SQL语句。
*
* @作者 华龙
*
* @日期:2010-03-12
*/
public class SqlReader {

private HashMap<String, String> prop = null;

private static Logger log = Log4jFactory.getLogger(SqlReader.class);


/**
* 加载读取sql语句的配置文件。
* @param sqlFilePath sql语句配置文件
*/
public void initial(String sqlFilePath) {
if (prop == null) {
prop = new HashMap<String, String>();
try {
initial(new FileReader(sqlFilePath));
} catch (Exception e) {
e.e.printStackTrace() }
}
}

/**
* 加载配置。
*
* @param sqlReader 含配置的字符输入流。
* @throws IOException IO异常。
*/
private void initial(Reader sqlReader) throws IOException {
BufferedReader br = (sqlReader instanceof BufferedReader) ? (BufferedReader) sqlReader
: new BufferedReader(sqlReader);
String line = null;
line = br.readLine();
for (int i = 0; line != null; i++) {
line = line.trim();// 去除一行中的前后空格
if(!"".equals(line)){
String key = getKey(line);
String value = getValue(line);
if (key != null && !line.startsWith("#")) {
prop.put(key, value);
}
}
line = br.readLine();
}
br.close();
}

/**
* 获取指定行键的名。
*
* @param line 配置文件中的一行字符串。
* @return 该行中键的名。
*/
private static String getKey(String line) {
if (line == null || line.equals("")) {
return null;
}
if (line.indexOf("=") < 0) {
return null;
}
return line.substring(0, line.indexOf("=")).trim();
}

/**
* 获取指定行键的值。
*
* @param line 配置文件中的一行字符串。
* @return 该行中键的值。
*/
private static String getValue(String line) {
if (line == null || line.equals("")) {
return null;
}
if (line.indexOf("=") < 0) {
return null;
}
return line.substring(line.indexOf("=") + 1).trim();
}

/**
* 获取指定键名的SQL语句。
* @param key 指定键名。
* @return SQL语句。
*/
public String getSql(String key) {
return prop.get(key);
}
}

3.TrainSqlReader.java类,跟据sql文件路径,加载sql文件。

import SqlReader

public class TrainSqlReader {

static boolean isLoad=false;
static SqlReader sqlReader=new SqlReader();

public static void load(){
if(isLoad==false){
sqlReader.initial("./train/sql/train.sql");
isLoad=true;
}
}

public static String getSql(String key){
load();
return sqlReader.getSql(key);
}
}

4. TrainDao.java类,这个类使用了一些其他的类没有上传,但是不影响本文的演示。

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;


import org.apache.log4j.Logger;

import com.dzd.time.train.db.TrainDBConnPool;
import com.dzd.time.train.db.TrainSqlReader;
import com.dzd.time.train.log.TrainLogger;
import com.dzd.time.train.po.TrainBean;

public class TrainDao {

static Logger log=TrainLogger.getLogger(TrainDao.class);

public List<String> getTrainNames(){
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;

List<String> trainNames=new ArrayList<String>();
try {

conn=TrainDBConnPool.getConnection();

String sql=TrainSqlReader.getSql("select_train_names");
ps=conn.prepareStatement(sql);

rs=ps.executeQuery();
while(rs.next()){
trainNames.add(rs.getString("train_name"));
}

} catch (Exception e) {
log.error("查询所有车次名称时异常",e);
}
finally{
TrainDBConnPool.close(rs, ps, conn);
}

return trainNames;
}


public List<String> getTrainStations(String cheCi){
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;

List<String> trainStations=new ArrayList<String>();
try {

conn=TrainDBConnPool.getConnection();

String sql=TrainSqlReader.getSql("select_train_station");
ps=conn.prepareStatement(sql);

int m=0;
ps.setString(++m, cheCi);

rs=ps.executeQuery();
while(rs.next()){
trainStations.add(rs.getString("station_name"));
}

} catch (Exception e) {
log.error("查询自定车次 "+cheCi+" 的站名时异常",e);
}
finally{
TrainDBConnPool.close(rs, ps, conn);
}

return trainStations;
}


public int insert(List<TrainBean> trainList){
Connection conn=null;
PreparedStatement sps=null;
PreparedStatement ips=null;
ResultSet rs=null;

try {
conn=TrainDBConnPool.getConnection();

String ssql=TrainSqlReader.getSql("select_train_detail");
String isql=TrainSqlReader.getSql("insert_train_detail");

sps=conn.prepareStatement(ssql);
ips=conn.prepareStatement(isql);
for (TrainBean trainBean : trainList) {

int m=0;
sps.setString(++m, trainBean.getTrainName());
sps.setString(++m, trainBean.getStationSerial());

rs=sps.executeQuery();
if(rs.next()){
continue;
}

int n=0;
ips.setString(++n, trainBean.getTrainName());
ips.setString(++n, trainBean.getStationSerial());
ips.setString(++n, trainBean.getStationName());

ips.setString(++n, trainBean.getArriveTime());
ips.setString(++n, trainBean.getStartTime());
ips.setString(++n, trainBean.getElapsedTime());

ips.setString(++n, trainBean.getDistance());

ips.setString(++n, trainBean.getHardBasedSeat());
ips.setString(++n, trainBean.getSoftBasedSeat());
ips.setString(++n, trainBean.getHardSleeper());
ips.setString(++n, trainBean.getSoftSleeper());

ips.addBatch();
}

// 执行插入
int flag[]=ips.executeBatch();
// 判断是否插入成功
return flag != null && flag.length >= 0 ? 1 : -1;

} catch (Exception e) {
log.error("插入火车车次查询结果异常",e);
}
finally{
TrainDBConnPool.close(rs, ips, conn);
TrainDBConnPool.close(rs, sps, conn);
}

return -1;
}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值