`

[转]Java读取解析sql文件,并使用netiler dao执行sql

    博客分类:
  • JAVA
阅读更多
转至:
最近在做系统数据初始化,采用sql形式导入基础数据,这里记录下编码过程。
导出的sql文件已经放在dao目录下了。
先来写个方法读取sql文件:

/**
* 加载解析sql文件
* @param sqlFile
* @return
* @throws Exception
*/
private static List<String> loadSql(String sqlFile) throws Exception {
List<String> sqlList = new ArrayList<String>();
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[i].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<String> list = new ArrayList<String>();
try {
list = loadSql("D:\\workspace\\com.leadal.netiler.install\\web\\data\\dao\\newclips.sql");
int i=0;
service.setProgess(0);
service.setExecute(true);
int size = list.size();
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文件写法:
<?xml version="1.0" encoding="UTF-8" ?>
<sql>
<result id="result" auto="true">
</result>
<statement id="executeSql"  result="result">
<![CDATA[
#parse($sql)
]]>
</statement>
</sql>
这里使用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<String> loadSql2(String sqlFile) throws Exception{
        List<String> sqlList = new ArrayList<String>();
        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;  
    }
经过测试,乱码问题得到解决
分享到:
评论

相关推荐

    毕设必下C# Winform+SQLServer 图书管理系统+源码+DB+账号密码

    C# Winform 图书管理系统,数据库使用SQLServer,源码功能实用,使用经典MVC分层模式,代码清晰、注释完整,非常适合初学者学习或有相应软件需求的二次开发借鉴、源码收藏。 该源码包含各数据表完整的增删改查功能...

    (带源码)根据MS SQLServer数据库信息生成C#或JAVA实体类DEMO

    初学C#时用VS2003开发的一个读取MS SQLServer数据库架构信息,进而生成简单的C#或者java实体类代码的小程序。 旨在学习交流使用。

    java万能DAO

    import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.ArrayList; import java.util....

    day01_eesy_03mybatis_dao.zip

    把IUserDao.xml移除,在dao接口的方法上使用@Select注解,并且指定SQL语句 同时需要在SqlMapConfig.xml中的mapper配置时,使用class属性指定dao接口的全限定类名。 明确: 我们在实际开发中,都是越简便越好,...

    Java Web程序设计教程

    4.2.3使用jdbc读取数据 69 4.3项目实战——存储图书信息 73 本章小结 78 课后练习 79 第5章struts2框架基础 80 5.1mvc框架 80 5.1.1model1与model2 80 5.1.2mvc设计模式 81 5.1.3struts2框架的mvc架构 82 ...

    java面试题

    答:JDBC数据库连接,是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问。 什么情况下不建议使用Hibernate? 答:当数据量大,并且表关系复杂的时候不建议使用。 sleep()和wait()有什么区别? ...

    S2S3H3整合以及泛型Dao与Service封装

    运行前先修改jdbc.properties文件,可以加入jtds的SQL Server驱动包使用SQL Server进行运行。运行时,使用是通过http://localhost:8080/uleweb/user/user_addUser.do进行添加测试,...

    MVBANK::red_heart:CRUD + JDBC + IREPORT + DAO + JAVA

    该项目包括使用JDBC与ORACLE银行进行通信,并在IREPORT中输出报表,从而创建Java中的收支控制系统。 CRUD :(创建,读取,更新和删除)是提供给系统用户的关系数据库中使用的四个基本操作。 其他首字母缩写词可...

    day01_eesy_01mybatis.zip

    把IUserDao.xml移除,在dao接口的方法上使用@Select注解,并且指定SQL语句 同时需要在SqlMapConfig.xml中的mapper配置时,使用class属性指定dao接口的全限定类名。 明确: 我们在实际开发中,都是越简便越好,...

    day01_eesy_02mybatis_annotation.zip

    把IUserDao.xml移除,在dao接口的方法上使用@Select注解,并且指定SQL语句 同时需要在SqlMapConfig.xml中的mapper配置时,使用class属性指定dao接口的全限定类名。 明确: 我们在实际开发中,都是越简便越好,...

    Visual C++编程技巧精选500例.pdf

    222 如何从文本文件中读取一个字符串? 第12章 文件与文件夹属-操作 223 如何判断文件只读属性? 224 如何设置文件只读属性? 225 如何判断文件隐藏属性? 226 如何设置文件隐藏属性? 227 如何判断文件归档属性? 228 ...

    《直接通过DAO读写Access文件》配套VC源代码

    作者采用两种方法:SQL和DAO类函数来混合实现Access文件的操作。 关键字:dao,access,CDaoDatabase,CDaoRecordset,Execute,AddNew,SetFieldValue,Update

    李兴华Java Web开发实战经典.pdf (高清版) Part1

    MLDN 李兴华 Java Web 开发实战经典.pdf (高清版) 全书分为两部分,需 要全部下载下载一起解压,此部分为第一部分 带有书签,清华大学出版社 第1章 JAVA WEB开发简介 1.1、WEB发展历程 1.2、企业开发架构 ...

    MLDN+李兴华+Java+Web开发实战经典.part3.rar )

    MLDN 李兴华 Java Web 开发实战经典.pdf (高清版) 带有书签,清华大学出版社 第1章 JAVA WEB开发简介 1.1、WEB发展历程 1.2、企业开发架构 1.3、JAVA EE架构 1.4、JAVA EE核心设计模式 1.5、Struts开发...

    java web 视频、电子书、源码(李兴华老师出版)

    13.4.3、读取资源文件 13.4.4、数字格式化标签 13.4.5、日期时间格式化标签 13.4.6、设置时区 13.5、SQL标签库 13.5.1、&lt;sql:setDataSource&gt; 13.5.2、数据库操作标签 13.5.3、事务处理 13.6、XML...

    李兴华Java Web开发实战经典(高清版) Part2

    MLDN 李兴华 Java Web 开发实战经典.pdf (高清版) 全书分为两部分,需 要全部下载下载一起解压,此部分为第二部分 带有书签,清华大学出版社 第1章 JAVA WEB开发简介 1.1、WEB发展历程 1.2、企业开发架构 ...

    pandas实现to_sql将DataFrame保存到数据库中

    或者我们有一个中间的结果,如果放到数据库中通过sql操作会更加的直观,处理后再将结果读取到DataFrame中。这两个场景,就需要用到DataFrame的to_sql操作。 具体的操作 连接数据库代码 import pandas as pd from ...

    李兴华 Java Web 开发实战经典_带源码_高清pdf 带书签 上

    第1章 JAVA WEB开发简介 1.1、WEB发展历程 1.2、企业开发架构 1.3、JAVA EE架构 1.4、JAVA EE核心设计模式 1.5、Struts开发框架 1.6、本章摘要 1.7、开发实战讲解 第2章 HTML、JavaScript简介 2.1、服务器...

Global site tag (gtag.js) - Google Analytics