解析Java源码文件中所有sql操作(下)

接着上篇解析Xml文件的文章,讲下Java文件的处理思路。

2.2 对于Java文件

2.2.1 针对jdbc的操作

jdbc是在源码上直接写sql语句,类似于下图:

public class JdbcDemo {
    private static final String SQL_SELECT = ""
        + " SELECT *"
        + "    FROM table"
        + "    WHERE a = b";

    private static final String SQL_ADD = ""
        + " INSERT INTO table "
        + "    VALUES(?, ?)"; 
}    

其实这种跟上篇2.1解析xml文件的思路很类型,select操作用开始结束索引算法,update、insert、delete操作用正则表达式来匹配,就可以得到表名了。

 

2.2.2 对于注解类型的

比如在mapper接口类上使用@Select注解

@Select("select * from table where a = b;")
List<String> findById();

可以先用正则表达式,匹配出@Select括号里面的字符串,再使用开始结束索引算法来解析。

String JAVA_SEL_ANNOTATION = "@Select[(][\"](.*?)[\"][)]";

其他注解比如@Update、@Delete,应该思路也是差不多的。

 

2.2.3 对于使用SQL()方法的

private final static String TABLE_NAME = "table";

public static String getById() {
    return new SQL()
        .SELECT("pam1, pam2")
        .FROM(TABLE_NAME)
        .WHERE("a = b")
        .toString();
}

如法炮制,先用正则表达式匹配出.FROM括号里面的字符串,比如tableStr

String JAVA_SQL_FUN_SELETE = ".FROM[(](\\w*\\.*\\w*)[)]";

但这里有点特殊,拿到的字符串tableStr可能不是真正的表名,而是用变量TABLE_NAME表示。通过判断该字符串是不是双引号开始,如果是,表示是真正的表名,如果不是,还得重新解析一下整个文件,获取该变量TABLE_NAME对应的参数值。

此时,又要根据tableStr,去匹配真正的表名,正则表达式需要拼接一下:

// 需要解析的字符串
String TABLE_NAME = "table";

// 左前缀
String JAVA_SQL_TABLE_NAME_LEFT = "String( )*";
// 右前缀
String JAVA_SQL_TABLE_NAME_RIGHT = "( )*=( )*\\\"(\\w*\\.*\\w*)\\\"";

// 拼接正则表达式
String parrernStr = JAVA_SQL_TABLE_NAME_LEFT + tableStr + JAVA_SQL_TABLE_NAME_RIGHT;

然后通过matcher.groud(4).trim()来拿到真正的表名。

另外,由于一个java文件里可能会多出用到这个TABLE_NAME变量,所以可以用一个map来维护变量名与表名的映射,避免重复扫描。

private static final Map<String, String> PARAM_TABLE_NAME_MAP = new HashMap<>();

至此,这就是Java文件的解析,由于时间问题,没有怎么去深入处理。而且单纯靠正则表达式,感觉应该有更好更高端的方法来做文字解析的。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ava+SQL信用卡管理系统源代码,MSSQL数据库,比较复杂,新手调试可能会遇到问题,附有Java源代码,仅供学习参考。 Java+SQL信用卡管理系统源代码 (1 folders, 2 files, 1.38 KB, 3.52 MB in total.)         源码 (1 folders, 2 files, 1.38 KB, 3.52 MB in total.)               信用卡管理系统SQL (4 folders, 17 files, 2.21 MB, 3.52 MB in total.)       card.jpx 9.58 KB       card.jpx.local 3.02 KB       card.jpx.local~ 3.02 KB       cardSystem_Data.MDF 1.13 MB       cardSystem_Log.LDF 1.00 MB       hs_err_pid1392.log 7.06 KB       hs_err_pid2360.log 6.88 KB       hs_err_pid2756.log 7.06 KB       hs_err_pid2804.log 7.05 KB       hs_err_pid2932.log 6.88 KB       hs_err_pid3152.log 7.06 KB       hs_err_pid3548.log 7.05 KB       hs_err_pid3856.log 7.06 KB       hs_err_pid512.log 6.88 KB       hs_err_pid748.log 7.05 KB                      bak (1 folders, 2 files, 1.38 KB, 208.28 KB in total.)                        card (0 folders, 67 files, 206.90 KB, 206.90 KB in total.)           cardConnect.java~1~ 1.52 KB           cardConnect.java~2~ 508 bytes           cardConnect.java~3~ 661 bytes           cardConnect.java~4~ 1.01 KB           cardConnect.java~5~ 971 bytes           creditCard.java~1~ 1.53 KB           eventFrame.java~18~ 2.86 KB           eventFrame.java~19~ 3.04 KB           eventFrame.java~20~ 2.98 KB           eventFrame.java~21~ 3.19 KB           eventFrame.java~22~ 3.20 KB           eventFrame.java~23~ 3.20 KB           eventFrame.java~24~ 3.35 KB           eventFrame.java~25~ 3.36 KB           eventFrame.java~26~ 3.36 KB           eventFrame.java~27~ 3.36 KB           getPanel.java~22~ 3.64 KB           getPanel.java~23~ 3.64 KB           getPanel.java~24~ 3.50 KB           getPanel.java~25~ 3.50 KB           getPanel.java~26~ 3.54 KB           getPanel.java~27~ 3.58 KB           getPanel.java~28~ 3.58 KB           getPanel.java~29~ 3.55 KB           getPanel.java~30~ 3.54 KB           getPanel.java~31~ 3.59 KB           loginFrame.java~100~ 6.04 KB           loginFrame.java~101~ 6.29 KB           loginFrame.java~102~ 6.47 KB           loginFrame.java~103~ 6.47 KB           loginFrame.java~104~ 6.64 KB           loginFrame.java~95~ 6.07 KB           loginFrame.java~96~ 6.07 KB           loginFrame.java~97~ 6.07 KB           loginFrame.java~98~ 6.07 KB           loginFrame.java~99~ 6.07 KB                      moveFrameEvent.java~1~ 882 bytes           queryPanel.java~10~ 2.54 KB           queryPanel.java~11~ 2.57 KB           queryPanel.java~12~ 2.58 KB           queryPanel.java~13~ 2.10 KB           queryPanel.java~14~ 2.10 KB           queryPanel.java~15~ 2.08 KB           queryPanel.java~6~ 2.61 KB           queryPanel.java~7~ 2.61 KB           queryPanel.java~8~ 2.61 KB           queryPanel.java~9~ 2.57 KB           staticMessage.java~1~ 1.06 KB           staticMessage.java~2~ 1.08 KB           staticMessage.java~3~ 1.12 KB           staticMessage.java~4~ 1.07 KB           staticMessage.java~5~ 1.07 KB           storePanel.java~15~ 3.43 KB           storePanel.java~16~ 3.43 KB           storePanel.java~17~ 3.43 KB           storePanel.java~18~ 3.52 KB           storePanel.java~19~ 3.52 KB           storePanel.java~20~ 3.47 KB           storePanel.java~21~ 3.52 KB           storePanel.java~22~ 3.52 KB           storePanel.java~23~ 3.49 KB           storePanel.java~24~ 3.53 KB           welcomePanel.java~1~ 1.19 KB           welcomePanel.java~2~ 1.37 KB           welcomePanel.java~3~ 1.47 KB                   classes (2 folders, 2 files, 1.38 KB, 73.03 KB in total.)                         card (0 folders, 27 files, 41.28 KB, 41.28 KB in total.)          cardConnect.class 1.75 KB          creditCard$1.class 714 bytes          creditCard.class 1.16 KB          eventFrame.class 4.17 KB          getPanel$1.class 652 bytes          getPanel$2.class 649 bytes          getPanel$3.class 649 bytes          getPanel.class 4.56 KB          loginFrame$1.class 664 bytes          loginFrame$2.class 618 bytes          loginFrame$3.class 622 bytes          loginFrame$4.class 664 bytes          loginFrame$5.class 618 bytes          loginFrame$6.class 622 bytes          loginFrame$7.class 661 bytes          loginFrame$8.class 661 bytes          loginFrame.class 7.27 KB                    moveFrameEvent.class 1.20 KB          queryPanel.class 2.10 KB          staticMessage.class 1.83 KB          storePanel$1.class 664 bytes          storePanel$2.class 661 bytes          storePanel$3.class 661 bytes          storePanel.class 4.57 KB          welcomePanel.class 1.73 KB                  package cache (0 folders, 3 files, 30.37 KB, 30.37 KB in total.)           card.dep2 28.98 KB                              img (0 folders, 9 files, 1.01 MB, 1.01 MB in total.)         1.jpg 69.44 KB         11.jpg 585.41 KB         img.gif 1.76 KB         l562.png 313.27 KB         log001.gif 24.68 KB         log002.gif 7.21 KB                  Thumbs.db 26.50 KB                src (1 folders, 2 files, 1.38 KB, 29.22 KB in total.)                           card (0 folders, 12 files, 27.84 KB, 27.84 KB in total.)            cardConnect.java 1.14 KB            creditCard.java 1.49 KB            eventFrame.java 3.39 KB            getPanel.java 3.91 KB            loginFrame.java 7.16 KB                        moveFrameEvent.java 917 bytes            queryPanel.java 2.13 KB            staticMessage.java 1.12 KB            storePanel.java 3.85 KB            welcomePanel.java 1.37 KB
mysql-connector-java是MySQL官方提供的Java驱动程序,用于在Java应用程序连接和操作MySQL数据库。下面是mysql-connector-java源码的一些解析: 1. 驱动程序注册 在使用mysql-connector-java之前,需要先将驱动程序注册到JDBC驱动程序管理器。这可以通过以下代码实现: ``` Class.forName("com.mysql.jdbc.Driver"); ``` 2. 创建连接 创建连接的过程可以通过以下代码实现: ``` Connection conn = DriverManager.getConnection(jdbcurl, username, password); ``` 其,jdbcurl是连接字符串,包括数据库的地址、端口、数据库名称等信息。 3. 连接池 为了提高应用程序的性能,可以使用连接池来管理数据库连接。mysql-connector-java提供了一个名为“com.mysql.jdbc.jdbc2.optional.MysqlDataSource”的类,用于创建连接池。以下是一个简单的示例: ``` MysqlDataSource dataSource = new MysqlDataSource(); dataSource.setURL(jdbcurl); dataSource.setUser(username); dataSource.setPassword(password); Connection conn = dataSource.getConnection(); ``` 4. 执行SQL语句 mysql-connector-java提供了一个名为“java.sql.Statement”的接口,用于执行SQL语句。以下是一个简单的示例: ``` Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM users"); while (rs.next()) { System.out.println(rs.getString("username")); } ``` 5. 关闭连接 使用完连接后,需要将其关闭以释放资源。可以通过以下代码实现: ``` conn.close(); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值