设为首页 收藏本站
查看: 1541|回复: 0

[经验分享] Java读取解析sql文件,并使用netiler dao执行sql-leadal

[复制链接]

尚未签到

发表于 2018-10-14 10:47:24 | 显示全部楼层 |阅读模式
  最近在做系统数据初始化,采用sql形式导入基础数据,这里记录下编码过程。
  导出的sql文件已经放在dao目录下了。
  先来写个方法读取sql文件:
/**  
* 加载解析sql文件
  
* @param sqlFile
  
* @return
  
* @throws Exception
  
*/
  
private static List loadSql(String sqlFile) throws Exception {
  
List sqlList = new ArrayList();
  
try {
  
InputStream sqlFileIn = new FileInputStream(sqlFile);
  
StringBuffer sqlSb = new StringBuffer();
  
byte[] buff = new byte[1024];
  
int byteRead = 0;
  
while ((byteRead = sqlFileIn.read(buff)) != -1) {
  
sqlSb.append(new String(buff, 0, byteRead,"utf-8"));
  
}
  
sqlFileIn.close();
  
// Windows 下换行是 \r\n, Linux 下是 \n
  
String[] sqlArr = sqlSb.toString()
  
.split("(;\\s*\\r\\n)|(;\\s*\\n)");
  
for (int i = 0; i < sqlArr.length; i++) {
  
String sql = sqlArr.replaceAll("--.*", "").trim();
  
if (!sql.equals("")) {
  
sqlList.add(sql);
  
}
  
}
  
return sqlList;
  
} catch (Exception ex) {
  
throw new Exception(ex.getMessage());
  
}
  
}
  即把sql文件读取出来,解析成单条sql语句。
  下面是action执行方法
/**  
* 执行sql,初始化系统基础数据
  
* @return
  
*/
  
public Object init(){
  
List list = new ArrayList();
  
try {
  
list = loadSql("D:\\workspace\\com.leadal.netiler.install\\web\\data\\dao\\newclips.sql");
  
int i=0;
  
service.setProgess(0);
  
service.setExecute(true);

  
int>  
for(String sql:list){
  
if(!service.getExecute()){
  
service.setProgess(100);
  
break;
  
}
  
service.executeSql(sql);
  
i++;
  
service.setProgess(100*i/size);
  
}
  
ActionMessage.info("基础数据初始化成功!");
  
} catch (Exception e) {
  
e.printStackTrace();
  
ActionMessage.error("初始化失败!");
  
}
  
return this;
  
}
  由于是测试,sql文件直接写了个绝对路径。
  service调用dao的executeSql(String sql)方法
  netiler dao:
@Dao("Netiler.Install.Init.InitBasicData")  
public interface InitBasicDataDao {
  
@Paramable("sql")
  
public void executeSql(String sql);
  
}
  Netiler Dao dao文件写法:
  

  

  

  

  

  

  

  这里使用statement,定义了个自动类型的result。
  过程中遇到几个问题,一个是返回值的,另一个是sql文件包含指令如#if()时,#if()括号里为空字符,解析时有点问题,最后把#if()换成#if(1==1)
  2013/5/31 10:35 补充与修改:
  在数据插入后,发现部分中文数据是乱码的,经过初步分析,乱码的位置都很有规律,即总是固定的位置出现中文乱码了。这里得到结果是,字节流解析的时候没有处理中文的问题,因为汉字是占两个字节的,当一个汉字刚好占1024-1025字节时,汉字就被拆开了。
  解决的方法有两种,一种是继续使用字节流解析,但是对汉字需要进行特殊处理,即通过对比ASCII码大小来确定是否是汉字而进行拼接操作。这样显然是比较麻烦的,当然肯定可以实现。
  这里笔者采用字符流行读取形式进行读取解析,贴上代码
    /**  
* 加载解析sql 读取方式字符流 行读取
  
* @param sqlFile
  
* @return
  
* @throws Exception
  
*/
  
private List loadSql2(String sqlFile) throws Exception{
  
List sqlList = new ArrayList();
  
try {
  
FileReader fr = new FileReader(sqlFile);
  
BufferedReader br = new BufferedReader(fr);
  
String s="";
  
StringBuffer sb = new StringBuffer();
  
while ((s = br.readLine()) != null) {
  
if(s.startsWith("/*")||s.startsWith("--")){
  

  
}
  
else if(s.endsWith(";")){
  
sb.append(s);
  
sqlList.add(sb.toString());
  
sb.delete(0, sb.length());
  
}
  
else{
  
sb.append(s);
  
}
  

  
}
  
fr.close();
  
br.close();
  
//          for(String sql : sqlList){
  
//              System.out.println("sql:"+sql);
  
//          }
  
} catch (Exception e) {
  
throw new Exception(e.getMessage());
  
}
  
return sqlList;
  
}
  经过测试,乱码问题得到解决



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-621404-1-1.html 上篇帖子: SQL Server审计功能入门:更改跟踪(Change Tracking) 下篇帖子: VMware vCenter Server5.1功能介绍与安装
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表