`
沙漠绿树
  • 浏览: 425353 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

方便管理工程中的SQL语句

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




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
1
分享到:
评论

相关推荐

    达梦数据库_SQL语言手册

    达梦数据库_SQL语言手册.pdf 数据库快照定义语句 数据库快照删除语句 第章数据查询语句和全文检索语句 单表查询 简单查询 带条件查询 集函数 情况表达式 连接查询 子查询 标量子查询 表子查询 派生表子...

    项目管理-Mybatis学习源码(三)

    其核心思想是将 SQL 语句从 Java 代码中分离出来,在 XML 或注解中进行配置,从而实现了 SQL 与 Java 代码的分离。 以下是 MyBatis 的一些主要特点和功能: SQL 映射配置:MyBatis 使用 XML 文件或注解来描述 SQL ...

    项目管理-mybatis学习源码(二)

    其核心思想是将 SQL 语句从 Java 代码中分离出来,在 XML 或注解中进行配置,从而实现了 SQL 与 Java 代码的分离。 以下是 MyBatis 的一些主要特点和功能: SQL 映射配置:MyBatis 使用 XML 文件或注解来描述 SQL ...

    项目管理-Mybatis学习源码(一)

    其核心思想是将 SQL 语句从 Java 代码中分离出来,在 XML 或注解中进行配置,从而实现了 SQL 与 Java 代码的分离。 以下是 MyBatis 的一些主要特点和功能: SQL 映射配置:MyBatis 使用 XML 文件或注解来描述 SQL ...

    教务管理系统(软件工程课程设计).doc

    软件工程实践报告 教务管理系统 第一章 问题定义 随着学校规模的扩大,人员的不断增加、复杂程度逐渐增强,学校中,教务是一项繁 琐的事,每年都有新生入学、老生毕业,以及其他各种人事变动。每学期的考试成绩都 ...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    6.2.4 标识SQL语句以便以后取回计划 153 6.2.5 深入理解DBMS_XPLAN的细节 156 6.2.6 使用计划信息来解决问题 161 6.3 小结 169 第7章 高级分组 170 7.1 基本的GROUP BY用法 171 7.2 HAVING子句 174 7.3 GROUP...

    MSSQL Server 管理器 V3.0 免注册

    20.SQL中实用的语句帮助文档! 二、辅助功能 1.对IP或域名进行端口测试 2.获取当前外网IP地址 3.直接远程连接当前连接IP 4.网整测试当前连接的情况 5.格式化JSON格式内容 联系方式:75934092@qq.com或可直接加QQ:...

    SqlToolBox 1.8.2

    执行Sql语句的过程具体来说是这样做的,首先,在输入窗口输入您向执行的Sql语句,如“select * from table”之类,当然您更可以通过表格的右键菜单来获得常用的sql语句(在输入或是粘贴文本的过程中,Sql语句中的...

    销售管理系统数据库设计说明书

    项目目标:利用计算机技术和信息技术实现销售管理的信息化,达到客户管理、合同管理、业务管理的规范有序、信息查阅快速准确、事务处理方便高效的要求,及时跟踪企业营销目标并适时进行结构化分析,为营销策略的修正...

    MSSQL 查询管理器 V1.0.0.135

    20.SQL中实用的语句帮助文档! 二、辅助功能 1.对IP或域名进行端口测试 2.获取当前外网IP地址 3.直接远程连接当前连接IP 4.网整测试当前连接的情况 注:本软件使用次数为10次,因本软件需要大家的建议。功能还在...

    MSSQL Server 管理器 V1.0.0.138

    20.SQL中实用的语句帮助文档! 二、辅助功能 1.对IP或域名进行端口测试 2.获取当前外网IP地址 3.直接远程连接当前连接IP 4.网整测试当前连接的情况 注:本软件使用次数为10次,因本软件需要大家的建议。功能还在...

    MSSQL Server 管理器 V2.0.0.0

    20.SQL中实用的语句帮助文档! 二、辅助功能 1.对IP或域名进行端口测试 2.获取当前外网IP地址 3.直接远程连接当前连接IP 4.网整测试当前连接的情况 5.格式化JSON格式内容 注:本软件使用次数为10次,因本软件需要...

    基于Python Tkinter的学生管理系统源码(怎删改查、点名等)+sql数据库+项目说明.zip

    根据市场上所具有的学生管理系统得,目前市面上的学生管理系统大多是具有增删查改等几部分内容,所面向的群体是中高校的教师群体,最主要的功能是教师方便管理学生的信息。而本设计是面向小学低年级学生的管理系统,...

    教务管理系统(软件工程课程设计)-.doc

    2.2.1可行性分析 A 技术可行性:对Delphi能够运用自如,对SQL语句熟练掌握运用。 B 经济可行性:开发费用合理 C 操作可行性:能够良好的解决用户需要的问题 第三章 需求分析 3.1功能需求 3.1.1系统目标 通过本...

    PLSQLDeveloper下载

    为了处理SQL语句,Oracle将在内存中分配一个区域,这就是上下文区。这个区包含了已经处理完的行数、指向被分析语句的指针,整个区是查询语句返回的数据行集。游标就是指向上下文区句柄或指针。 显示游标  显示游标...

    设计学生学籍管理系统

    在学生学籍管理系统的开发过程中,主要使用了嵌入式SQL语句和动态SQL语句在程序中灵活地操纵数据库。 关键字:SQL语言 对象 窗口 数据窗口 控件 一、概述 1.1 项目的背景及意义 学生学籍管理工作是学校管理工作...

    Derby数据库的使用指南--包括存图片到数据库和读取数据库中的图片操作

    6、如果成功,那么工程中的"演示时需要的数据库脚本.sql"文档打开,拷贝也相应的SQL语句,创建应用所需要的表 7、创建表成功之后,自己写insert语句给测试数据 8、如果以上步骤完成,那么在工程中运行...

    创力网站管理系统 v4.2

    查看系统空间占用情况、系统初始化、查看服务器信息及到在线直接执行SQL语句。 &lt;br&gt;CreateLive CMS v4.2 What's New 1,修正跨频道移动后,连接地址不变 2,修正{$ChannelDir}等标签不随频道变换 3...

Global site tag (gtag.js) - Google Analytics