`
沙漠绿树
  • 浏览: 430288 次
  • 性别: 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语句一键美化工具是一款专为数据库管理员和程序员设计的应用,旨在帮助他们将混乱无序的SQL代码自动格式化为规范、易读的格式。这个工具不仅能够快速整理SQL语句,提高代码的可读性和可维护性,还允许用户根据...

    excel生成sql语句和实体类代码生成器

    在IT行业中,开发人员经常会遇到重复的工作,例如编写SQL语句和实体类代码。为了提高效率,工具化和自动化成为了必不可少的手段。"Excel生成SQL语句和实体类代码生成器"就是一个这样的实用工具,它允许开发者通过...

    图书管理系统源代码【psql 有sql语句】

    【图书管理系统源代码【psql 有sql语句】】是一个专为教学和实践而设计的项目,适合初学者了解和掌握数据库管理以及SQL语言在实际应用中的运用。在这个系统中,开发者使用了psql(PostgreSQL的命令行工具)来处理SQL...

    快速生生成sql语句,反编译.class文件,java代码生成……

    在IT行业中,开发人员经常会遇到各种任务,如编写SQL语句、反编译Java类文件以及生成代码。这里,我们将探讨几个与标题和描述相关的工具和技术,这些工具可以帮助提升开发效率,减少繁琐的手动工作。 首先,让我们...

    java SQL 超市管理系统 软件工程

    【Java SQL超市管理系统软件工程】是一个综合性的项目,它涵盖了软件开发的多个重要方面,包括需求分析、系统设计、编程实现、数据库管理以及测试。在这个项目中,Java语言被用来编写应用程序,而SQL则用于管理和...

    Qt_sql语句.zip

    本文将深入探讨Qt中的SQL语句及其在实际工程中的应用。 首先,Qt SQL模块通过QSqlDatabase类提供了数据库连接管理。你可以通过QSqlDatabase::addDatabase()方法创建一个新的数据库连接,并指定数据库驱动,例如...

    大学生信息管理系统,SQL,Java,软件工程

    例如,可以使用SQL语句来定义学生表,包括姓名、学号、专业等字段,同时设置相应的约束条件,如唯一性约束和非空约束,以确保数据完整性。此外,SQL还支持复杂的数据查询和分析,如通过组合不同条件筛选特定学生信息...

    2015职业分类大典sql插入语句

    例如,如果“2015职业分类大典”数据库中有一个名为`jobs`的表,包含`id`(唯一标识)、`category`(类别)、`name`(职业名称)和`description`(职业描述)等字段,我们可以使用如下的SQL语句来插入一条新记录: ...

    PB图书管理系统+SQL数据库

    一旦连接成功,数据窗口可以通过连接直接访问数据库中的表,或者通过编写SQL语句实现更复杂的查询和操作。 在实际使用中,用户界面设计是关键。一个良好的界面应清晰展示图书信息,提供简单易用的搜索和过滤功能。...

    图书管理系统(mfc+sql)

    ODBC是数据库访问的标准,而ADO是微软提供的更高级别的接口,两者都可以让MFC程序方便地执行SQL语句,进行数据操作。 在图书管理系统中,当用户在界面上进行操作时,如搜索图书,MFC会捕获这些事件并生成相应的SQL...

    基于java+sql的企业固定资产管理工程

    在这个项目中,可能使用的数据库系统如MySQL或Oracle,通过SQL语句来执行对固定资产信息的CRUD(创建、读取、更新、删除)操作。例如,创建一个"assets"表,包含资产编号、资产名称、购买日期、单价、使用部门等字段...

    学校教务管理系统VS——SQL

    虽然描述中说系统“简单”,但实现这些功能仍然需要对C#语法和SQL语句有扎实的掌握,以及对软件工程的基本流程和规范有所了解。 总的来说,"学校教务管理系统VS——SQL"是一个融合了前后端开发技术的实用项目,对于...

    图书馆管理系统 c# sql

    例如,我们可以创建一个名为"Books"的表,包含"ISBN"(国际标准书号)、"Title"(书名)、"Author"(作者)、"Publisher"(出版社)、"PublicationDate"(出版日期)等字段,并使用SQL语句进行数据操作: ...

    C#图书管理系统+Sql

    SQL语句用于数据的增删改查操作,事务处理确保数据的一致性,索引优化提升查询速度。同时,为了保证数据的安全性,可能还会涉及备份恢复策略以及权限管理。 系统开发过程中,可能会使用到ADO.NET作为数据访问层,它...

    图书管理系统+Java源代码+SQL Server数据库文件

    在本系统中,数据库可能包含了如"图书信息"、"读者信息"、"借阅记录"等多个表,通过SQL语句实现数据的增删改查。可能使用了索引来提升查询速度,触发器来实现自动化的业务规则,以及存储过程来封装复杂的操作逻辑。 ...

    用C++实现的一个成绩管理系统,连接数据库SQL Server 2005,实现基本的添加删除查询修改等功能.zip

    同时,系统可能会使用SQL语句与数据库交互,通过预编译的SQL语句提高安全性,防止SQL注入攻击。 数据库连接通常会使用ODBC(Open Database Connectivity)或OLE DB等接口,或者更现代的C++库如Qt的QSql或Poco Data...

    教学成绩管理系统 java + sql2005 课程设计

    开发者需要熟练掌握SQL语句,如SELECT用于查询,INSERT用于插入,UPDATE用于修改,DELETE用于删除数据。此外,数据库设计中的表结构、主键、外键等概念也是关键,它们保证了数据的完整性和一致性。 系统功能模块...

    学生学籍管理系统vb+sql

    总的来说,"学生学籍管理系统vb+sql"是一个综合性的项目,它涵盖了软件工程中的需求分析、设计、编码、测试等多个阶段,同时涉及了数据库管理和用户界面设计的关键技术。对于学习VB和SQL的学生来说,通过实践这个...

    用VB编写的人事管理信息系统 VB+SQL

    开发者使用SQL语句与数据库进行交互,实现对人事数据的增删改查,确保数据的准确性和一致性。 该系统的核心部分是数据库设计,通常包括员工基本信息表、考勤记录表、薪资表等。例如,员工基本信息表可能包含员工ID...

Global site tag (gtag.js) - Google Analytics