`

[转]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;  
    }
经过测试,乱码问题得到解决
分享到:
评论

相关推荐

    java自动化之自动化框架项目(第五天-解析并执行初始化sql)代码

    在这个特定的“java自动化之自动化框架项目”中,第五天的主题聚焦于“解析并执行初始化SQL”。这个过程涉及到数据库的前期准备,确保测试环境的一致性和可重复性。下面将详细讲解这个过程中的关键知识点。 首先,...

    若依微服务数据库执行sql

    这些框架允许我们将SQL语句封装在Java代码中,通过注解或XML配置文件进行管理,从而提高开发效率和代码的可读性。 在执行SQL时,我们需要了解以下关键点: 1. **数据访问层(DAO)**:这是微服务中负责与数据库...

    java mysql 与 sql server 逆向工程

    3. **运行MyBatis Generator**:在IDEA中运行MyBatis Generator,它会根据配置文件中的设置,读取数据库表信息并生成相应的Java代码。 4. **使用生成的代码**:生成的实体类可以直接在业务逻辑中使用,Mapper接口和...

    mybatis-generator生成sqlserver数据库Bean、Dao、Mapper代码工具

    Mapper XML文件包含了SQL语句的具体实现,与DAO接口对应,MyBatis框架会根据这些XML文件动态生成SQL执行。 在使用MBG之前,你需要准备以下几样东西: 1. 数据库连接信息:包括数据库URL、用户名和密码,这是MBG连接...

    连接sqlserver数据库,批量执行sql语句

    如果需要读取SQL脚本文件执行,可以使用MFC的`CFile`类来打开和读取文件内容。 5. **代码结构**: - 通常,会有一个主函数(如`int main()`)来初始化MFC应用,并调用连接数据库和执行SQL的函数。 - 连接函数会...

    BeetlSQL数据库访问框架 (DAO工具) v3.25.3.zip

    7. **代码生成器**:BeetlSQL附带的代码生成器可以帮助开发者快速生成实体类、Mapper接口、Mapper XML文件以及对应的DAO实现类,极大地减少了重复工作。 8. **兼容性**:BeetlSQL兼容多种主流的数据库,包括MySQL、...

    基于java的SQL数据库开发

    在“基于Java的SQL数据库开发”这一主题中,我们探讨的是如何使用Java编程语言与SQL数据库进行交互,以便实现学生管理系统的课程设计。这个系统通常包括对学生成绩、个人信息等数据的存储、检索和更新功能。以下是...

    SQL和DAO类函数来混合实现Access文件的操作(120kb)

    通过编写SQL语句,我们可以高效地处理大量数据并执行复杂的查询。 2. **DAO(Data Access Objects)**: DAO是Microsoft Jet数据库引擎提供的一个接口,用于与Access数据库进行交互。它允许开发者通过对象模型直接...

    sql2005数据库自动生成代码 java

    一旦建立了数据库连接,你可以使用Java反射API或者第三方库(如Apache Velocity或Freemarker)来遍历数据库中的表和列,并生成相应的Java实体类、DAO(Data Access Object)、Service或Repository代码。 例如,...

    java 基于泛型与反射的通用 DAO

    // 获取并执行SQL查询方法 private Method getMethod(String methodName, Class&lt;?&gt;... parameterTypes) { // ... } } ``` 这里,`getMethod`方法使用反射查找并返回JdbcTemplate的特定方法,然后在`save`方法中...

    mybatis-sql生成器

    4. **XML配置文件**:生成的XML文件包含了SQL语句和结果映射,与DAO接口配合使用,实现数据访问。 5. **注释生成**:可根据配置为生成的代码添加详细的注释,便于理解和维护。 在使用MyBatis-SQL生成器时,需要...

    java自动生成dao 层mapper,以及model实体类文件 generator .

    Java开发过程中,DAO(Data Access Object)层是用于与数据库交互的重要组件,它封装了SQL查询,使得业务逻辑层与数据库操作分离,提高了代码的可维护性和可复用性。而Model实体类则是数据传输的对象,通常对应...

    JAVA SQL酒店管理系统.zip

    本篇文章将详细解析基于JAVA和SQL Server设计的酒店管理系统,探讨其核心功能、架构设计以及如何通过源代码实现基本操作。 一、系统概述 JAVA SQL酒店管理系统是一个集成化的解决方案,旨在简化酒店日常运营中的...

    VB6 DAO数据库操作实例

    在VB6中,我们通常使用DAO的Database和Recordset对象来执行CRUD(创建、读取、更新、删除)操作。 创建数据库连接是使用DAO的第一步。在VB6中,我们可以通过以下代码创建一个Database对象: ```vb Dim db As DAO....

    java操作dbf+java读取dbf 项目源码

    4. **文件I/O**:读取DBF文件时,会涉及到Java的文件I/O操作,如`java.io.File`类的使用,以及`InputStream`和`OutputStream`的子类,用于读写二进制数据。 5. **异常处理**:由于文件操作可能会出现各种异常,如...

    让Access执行用户手工输入的SQL

    在Microsoft Access中,虽然默认界面并不直接支持用户输入并执行SQL语句,但可以通过编程接口实现这一功能。这里提到的“让Access执行用户手工输入的SQL”是指利用数据访问对象(DAO)技术来扩展Access的功能,允许...

    教师信息管理系统(JAVA、SQLserver)

    3. 数据访问对象(DAO):JAVA的JDBC(Java Database Connectivity)接口用于与SQL Server建立连接,实现数据的CRUD(创建、读取、更新、删除)操作。 二、SQL Server数据库管理 SQL Server作为后端数据库,具有高...

    mybatis generator自动生成DAO、Bean、MapperXML等文件

    3. **Mapper接口和XML映射文件**:Mapper接口是DAO接口的具体实现,它通过MyBatis的动态SQL功能来执行SQL。XML映射文件则包含了具体的SQL语句,包括元素(用于设置参数)、元素(用于获取结果集)。MBG会根据表的...

    使用JAVA读取ORACLE_BLOB字段实现上传下载.doc

    在 DAO 中,我们需要使用 PreparedStatement 来执行 SQL 语句,並insert一个空 BLOB 对象,然后 Update 这个空对象。 在 Struts 项目中,我们可以使用以下代码来实现大对象的上传: ```java // 新增 if (action...

    关于java dao的入门介绍

    在DAO中,应该捕获并适当地处理可能发生的数据库相关异常,如SQL异常,同时记录这些异常信息,以便于后续的调试和问题排查。异常处理可以帮助防止数据的不一致性和程序的意外终止。 **日志记录**是跟踪和诊断问题的...

Global site tag (gtag.js) - Google Analytics