├── .classpath ├── .gitignore ├── .project ├── .settings ├── org.eclipse.core.resources.prefs ├── org.eclipse.jdt.core.prefs ├── org.eclipse.ltk.core.refactoring.prefs └── org.eclipse.m2e.core.prefs ├── AUTHORS ├── ChangeLog-CN ├── LICENSE ├── README.md ├── README.zh-CN.md ├── SqlactionBenchmarkSAO.java.png ├── SqlactionBenchmarkSAOMapper.java.png ├── TODO ├── benchmark.xlsx ├── benchmark_DELETE_WHERE.png ├── benchmark_INSERT.png ├── benchmark_SELECT_WHERE.png ├── benchmark_SELECT_to_LIST.png ├── benchmark_UPDATE_WHERE.png ├── dbserver.conf.json.png ├── git_deve_merge_to_test_and_release.bat ├── mybatis-config.xml.png ├── mybatis-mapper.xml.png ├── pom.xml ├── sqlaction.conf.json.png └── src ├── main └── java │ └── xyz │ └── calvinwilliams │ └── sqlaction │ ├── DbServerConf.java │ ├── DbServerConfUserDefineDataTypes.java │ ├── SqlActionColumn.java │ ├── SqlActionConf.java │ ├── SqlActionConfTable.java │ ├── SqlActionDatabase.java │ ├── SqlActionFromTableToken.java │ ├── SqlActionFromTableTokenForAdvancedMode.java │ ├── SqlActionGencode.java │ ├── SqlActionIndex.java │ ├── SqlActionJdbcDataTypeEnum.java │ ├── SqlActionLexicalParser.java │ ├── SqlActionOtherClassTokenForAdvancedMode.java │ ├── SqlActionPredicateEnum.java │ ├── SqlActionSelectColumnToken.java │ ├── SqlActionSelectColumnTokenForAdvancedMode.java │ ├── SqlActionSetColumnToken.java │ ├── SqlActionStatementEnum.java │ ├── SqlActionSyntaxParser.java │ ├── SqlActionTable.java │ ├── SqlActionUtil.java │ ├── SqlActionWhereColumnToken.java │ └── SqlActionWhereColumnTokenForAdvancedMode.java └── test └── java ├── dbserver(mysql).conf.json ├── dbserver(oracle).conf.json ├── dbserver(postgresql).conf.json ├── dbserver(sqlite).conf.json ├── dbserver(sqlserver).conf.json ├── dbserver.conf.json └── xyz └── calvinwilliams └── test ├── SqlActionTest.java ├── SqlActionTestConf.java ├── UserBaseSAO.java ├── UserBaseSAU.java ├── UserOrderSAO.java ├── UserOrderSAU.java ├── ddl_mysql.sql ├── ddl_oracle.sql ├── ddl_postgresql.sql ├── ddl_sqlite.sql ├── ddl_sqlserver.sql ├── pp.bat ├── sqlaction.conf.json └── sqlaction.conf.json.bak /.classpath: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target/ 2 | -------------------------------------------------------------------------------- /.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | sqlaction 4 | 5 | 6 | 7 | 8 | 9 | org.eclipse.jdt.core.javabuilder 10 | 11 | 12 | 13 | 14 | org.eclipse.m2e.core.maven2Builder 15 | 16 | 17 | 18 | 19 | 20 | org.eclipse.jdt.core.javanature 21 | org.eclipse.m2e.core.maven2Nature 22 | 23 | 24 | -------------------------------------------------------------------------------- /.settings/org.eclipse.core.resources.prefs: -------------------------------------------------------------------------------- 1 | eclipse.preferences.version=1 2 | encoding//src/main/java=UTF-8 3 | encoding//src/main/resources=UTF-8 4 | encoding//src/test/java=UTF-8 5 | encoding//src/test/resources=UTF-8 6 | encoding/=UTF-8 7 | -------------------------------------------------------------------------------- /.settings/org.eclipse.jdt.core.prefs: -------------------------------------------------------------------------------- 1 | eclipse.preferences.version=1 2 | org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled 3 | org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate 4 | org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 5 | org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve 6 | org.eclipse.jdt.core.compiler.compliance=1.5 7 | org.eclipse.jdt.core.compiler.debug.lineNumber=generate 8 | org.eclipse.jdt.core.compiler.debug.localVariable=generate 9 | org.eclipse.jdt.core.compiler.debug.sourceFile=generate 10 | org.eclipse.jdt.core.compiler.problem.assertIdentifier=error 11 | org.eclipse.jdt.core.compiler.problem.enumIdentifier=error 12 | org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning 13 | org.eclipse.jdt.core.compiler.release=disabled 14 | org.eclipse.jdt.core.compiler.source=1.5 15 | -------------------------------------------------------------------------------- /.settings/org.eclipse.ltk.core.refactoring.prefs: -------------------------------------------------------------------------------- 1 | eclipse.preferences.version=1 2 | org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false 3 | -------------------------------------------------------------------------------- /.settings/org.eclipse.m2e.core.prefs: -------------------------------------------------------------------------------- 1 | activeProfiles= 2 | eclipse.preferences.version=1 3 | resolveWorkspaceProjects=true 4 | version=1 5 | -------------------------------------------------------------------------------- /AUTHORS: -------------------------------------------------------------------------------- 1 | calvin 2 | -------------------------------------------------------------------------------- /ChangeLog-CN: -------------------------------------------------------------------------------- 1 | 0.2.9.0 2019-05-25 calvin 2 | * 高级模式支持输出SAU以外的自定义类属性 3 | 4 | 0.2.8.1 2019-05-25 calvin 5 | * 修正了"SELECT table.* ..."和"SELECT table_alias_name.* ..."的展开问题 6 | 7 | 0.2.8.0 2019-05-23 calvin 8 | * 新增高级模式"@@ADVANCEDMODE"用于支持复杂SQL 9 | 10 | 0.2.7.0 2019-05-19 calvin 11 | * 新增支持数据库SqlServer 12 | * 应用推荐改用SAU对象,便于SAO刷新后保留SAU自定义源码;已更新示例源码 13 | 14 | 0.2.6.0 2019-05-18 calvin 15 | * 新增支持数据库Sqlite 16 | 17 | 0.2.5.0 2019-04-30 calvin 18 | * 新增支持数据库Oracle,但表名和字段名暂时只能用大写,生成的SAO源文件名也是大写的 19 | * 新增配置元"@@PAGESORT"用于分页排序 20 | 21 | 0.2.4.0 2019-04-27 calvin 22 | * 新增支持数据库PostgreSQL 23 | 24 | 0.2.3.0 2019-04-25 calvin 25 | * 新增配置元"@@PAGEKEY(...)"用于自动生成分页代码 26 | 27 | 0.2.2.0 2019-04-20 calvin 28 | * 重构了内部属性存傄1�7 29 | * 新增配置元"@@SELECTKEY(...)"用于返回插入的主键值 30 | * 修正了自动生成JDBC代码中的Statement和ResultSet对象泄露问题 31 | 32 | 0.2.1.0 2019-04-17 calvin 33 | * 新增配置元"@@STATEMENT_INTERCEPTOR(...)"用于指定SQL拦截器方法名 34 | 35 | 0.2.0.0 2019-04-14 calvin 36 | * 重整了项目文件结构 37 | 38 | 0.1.1.0 2019-04-07 calvin 39 | * SQL动作配置文件支持SQL折行 40 | 41 | 0.1.0.0 2019-04-06 calvin 42 | * 重构了语法分析器 43 | * 调整了自动生成方法名原型 44 | * 开始写文档 45 | 46 | 0.0.8.0 2019-04-03 calvin 47 | * 支持配置元"@@METHOD(...)"用于指定自定义方法名 48 | 49 | 0.0.7.0 2019-04-02 calvin 50 | * 支持hint 51 | * 完善sqlaction-benchmark和mybatis-benchmark 52 | 53 | 0.0.6.0 2019-04-01 calvin 54 | * 新增子项目sqlaction-benchmark和mybatis-benchmark用于性能比较 55 | 56 | 0.0.5.0 2019-03-31 calvin 57 | * 支持在dbserver.conf.json中用户自定义数据类型 58 | ,比如MySQL的类型"decimal(12,2)"对应jdbc的类型"SQLACTION_DATA_TYPE_DECIMAL" 59 | 通过配置可转定义为jdbc的类型"SQLACTION_DATA_TYPE_DOUBLE",自动生成JAVA实体属性类型为"double" 60 | 61 | 0.0.4.0 2019-03-31 calvin 62 | * SELECT后支持COUNT(*) 63 | * FROM后支持GROUP、HAVING、ORDER 64 | 65 | 0.0.3.0 2019-03-30 calvin 66 | * 调整了增删改查方法名和原型 67 | * 支持SELECT多表连接查询 68 | * 支持表别名功能 69 | * 支持单个目录里同时生成多个表实体类 70 | * 支持SET和WHERE直接写常量 71 | 72 | 0.0.2.0 2019-03-26 calvin 73 | * 实现单表的增删改查jdbc代码自动生成 74 | 75 | 0.0.1.0 2019-03-23 calvin 76 | * 创建 77 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright {yyyy} {name of copyright owner} 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | sqlaction - Database persistence layer tool based auto-gen JDBC code 2 | =================================== 3 | 4 | 5 | 6 | - [sqlaction - Database persistence layer tool based auto-gen JDBC code](#sqlaction---database-persistence-layer-tool-based-auto-gen-jdbc-code) 7 | - [1. overview](#1-overview) 8 | - [2. A demo](#2-a-demo) 9 | - [2.1. Create Table DDL](#21-create-table-ddl) 10 | - [2.2. Create Java Project](#22-create-java-project) 11 | - [2.3. Executing sqlaction](#23-executing-sqlaction) 12 | - [2.4. Beginning to write your first line application code](#24-beginning-to-write-your-first-line-application-code) 13 | - [8. About Author](#8-about-author) 14 | 15 | 16 | 17 | # 1. overview 18 | 19 | sqlaction is a Database persistence layer tool based auto-gen JDBC code. 20 | 21 | sqlaction core advantage : 22 | 23 | 1. Multi-DBMS supported: MySQL,PostgreSQL,Oracle,Sqlite,SqlServer 24 | 1. Abstract fetch-last-insert-rowid or sequence syntax configuration 25 | 1. Abstract physical paging-sql syntax configuration 26 | 1. Performance faster 20% than MyBatis 27 | 1. Support complex SQL on advanced-mode 28 | 29 | # 2. A demo 30 | 31 | ## 2.1. Create Table DDL 32 | 33 | For example using MySQL 34 | 35 | `ddl.sql` 36 | 37 | ``` 38 | CREATE TABLE `sqlaction_demo` ( 39 | `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '±໅', 40 | `name` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT 'Ļؖ', 41 | `address` varchar(128) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'µٖ·', 42 | PRIMARY KEY (`id`), 43 | KEY `sqlaction_demo` (`name`) 44 | ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin 45 | ``` 46 | 47 | ## 2.2. Create Java Project 48 | 49 | Add jar "mysql-connector-java-X.Y.Z.jar". 50 | 51 | Create `dbserver.conf.json` in Java package folder. 52 | 53 | ``` 54 | { 55 | "driver" : "com.mysql.jdbc.Driver" , 56 | "url" : "jdbc:mysql://127.0.0.1:3306/calvindb?serverTimezone=GMT" , 57 | "user" : "calvin" , 58 | "pwd" : "calvin" 59 | } 60 | ``` 61 | 62 | Create `sqlaction.conf.json` in Java package folder. 63 | 64 | ``` 65 | { 66 | "database" : "calvindb" , 67 | "tables" : [ 68 | { 69 | "table" : "sqlaction_demo" , 70 | "sqlactions" : [ 71 | "SELECT * FROM sqlaction_demo" , 72 | "SELECT * FROM sqlaction_demo WHERE name=?" , 73 | "INSERT INTO sqlaction_demo" , 74 | "UPDATE sqlaction_demo SET address=? WHERE name=?" , 75 | "DELETE FROM sqlaction_demo WHERE name=?" 76 | ] 77 | } 78 | ] , 79 | "javaPackage" : "xyz.calvinwilliams.sqlaction" 80 | } 81 | ``` 82 | 83 | ## 2.3. Executing sqlaction 84 | 85 | pp.bat 86 | 87 | ``` 88 | java -Dfile.encoding=UTF-8 -classpath "D:\Work\mysql-connector-java-8.0.15\mysql-connector-java-8.0.15.jar;%USERPROFILE%\.m2\repository\xyz\calvinwilliams\okjson\0.0.9.0\okjson-0.0.9.0.jar;%USERPROFILE%\.m2\repository\xyz\calvinwilliams\sqlaction\0.2.7.0\sqlaction-0.2.7.0.jar" xyz.calvinwilliams.sqlaction.SqlActionGencode 89 | pause 90 | ``` 91 | 92 | Executing pp.bat 93 | 94 | ``` 95 | ////////////////////////////////////////////////////////////////////////////// 96 | /// sqlaction v0.2.9.0 97 | /// Copyright by calvin 98 | ////////////////////////////////////////////////////////////////////////////// 99 | --- dbserverConf --- 100 | dbms[mysql] 101 | driver[com.mysql.jdbc.Driver] 102 | url[jdbc:mysql://127.0.0.1:3306/calvindb?serverTimezone=GMT] 103 | user[calvin] 104 | pwd[calvin] 105 | --- sqlactionConf --- 106 | database[calvindb] 107 | table[sqlaction_demo] 108 | sqlaction[SELECT * FROM sqlaction_demo] 109 | sqlaction[SELECT * FROM sqlaction_demo WHERE name=?] 110 | sqlaction[INSERT INTO sqlaction_demo] 111 | sqlaction[UPDATE sqlaction_demo SET address=? WHERE name=? @@METHOD(updateAddressByName)] 112 | sqlaction[DELETE FROM sqlaction_demo WHERE name=?] 113 | SqlActionTable.getTableInDatabase[sqlaction_demo] ... 114 | ... 115 | *** NOTICE : Write SqlactionDemoSAO.java completed!!! 116 | ``` 117 | 118 | Auto-gen code to 119 | 120 | `SqlactionDemoSAO.java` 121 | ``` 122 | // This file generated by sqlaction v0.2.9.0 123 | // WARN : DON'T MODIFY THIS FILE 124 | 125 | package xyz.calvinwilliams.sqlaction; 126 | 127 | import java.math.*; 128 | import java.util.*; 129 | import java.sql.Time; 130 | import java.sql.Timestamp; 131 | import java.sql.Connection; 132 | import java.sql.Statement; 133 | import java.sql.PreparedStatement; 134 | import java.sql.ResultSet; 135 | 136 | public class SqlactionDemoSAO { 137 | 138 | int id ; // ±໅ // PRIMARY KEY 139 | String name ; // Ļؖ 140 | String address ; // µٖ· 141 | 142 | int _count_ ; // defining for 'SELECT COUNT(*)' 143 | 144 | // SELECT * FROM sqlaction_demo 145 | public static int SELECT_ALL_FROM_sqlaction_demo( Connection conn, List sqlactionDemoListForSelectOutput ) throws Exception { 146 | Statement stmt = conn.createStatement() ; 147 | ResultSet rs = stmt.executeQuery( "SELECT * FROM sqlaction_demo" ) ; 148 | while( rs.next() ) { 149 | SqlactionDemoSAU sqlactionDemo = new SqlactionDemoSAU() ; 150 | sqlactionDemo.id = rs.getInt( 1 ) ; 151 | sqlactionDemo.name = rs.getString( 2 ) ; 152 | sqlactionDemo.address = rs.getString( 3 ) ; 153 | sqlactionDemoListForSelectOutput.add(sqlactionDemo) ; 154 | } 155 | rs.close(); 156 | stmt.close(); 157 | return sqlactionDemoListForSelectOutput.size(); 158 | } 159 | 160 | // SELECT * FROM sqlaction_demo WHERE name=? 161 | public static int SELECT_ALL_FROM_sqlaction_demo_WHERE_name_E_( Connection conn, List sqlactionDemoListForSelectOutput, String _1_SqlactionDemoSAU_name ) throws Exception { 162 | PreparedStatement prestmt = conn.prepareStatement( "SELECT * FROM sqlaction_demo WHERE name=?" ) ; 163 | prestmt.setString( 1, _1_SqlactionDemoSAU_name ); 164 | ResultSet rs = prestmt.executeQuery() ; 165 | while( rs.next() ) { 166 | SqlactionDemoSAU sqlactionDemo = new SqlactionDemoSAU() ; 167 | sqlactionDemo.id = rs.getInt( 1 ) ; 168 | sqlactionDemo.name = rs.getString( 2 ) ; 169 | sqlactionDemo.address = rs.getString( 3 ) ; 170 | sqlactionDemoListForSelectOutput.add(sqlactionDemo) ; 171 | } 172 | rs.close(); 173 | prestmt.close(); 174 | return sqlactionDemoListForSelectOutput.size(); 175 | } 176 | 177 | // INSERT INTO sqlaction_demo 178 | public static int INSERT_INTO_sqlaction_demo( Connection conn, SqlactionDemoSAU sqlactionDemo ) throws Exception { 179 | PreparedStatement prestmt ; 180 | Statement stmt ; 181 | ResultSet rs ; 182 | prestmt = conn.prepareStatement( "INSERT INTO sqlaction_demo (name,address) VALUES (?,?)" ) ; 183 | prestmt.setString( 1, sqlactionDemo.name ); 184 | prestmt.setString( 2, sqlactionDemo.address ); 185 | int count = prestmt.executeUpdate() ; 186 | prestmt.close(); 187 | return count; 188 | } 189 | 190 | // UPDATE sqlaction_demo SET address=? WHERE name=? 191 | public static int UPDATE_sqlaction_demo_SET_address_E_WHERE_name_E_( Connection conn, String _1_address_ForSetInput, String _1_name_ForWhereInput ) throws Exception { 192 | PreparedStatement prestmt = conn.prepareStatement( "UPDATE sqlaction_demo SET address=? WHERE name=?" ) ; 193 | prestmt.setString( 1, _1_address_ForSetInput ); 194 | prestmt.setString( 2, _1_name_ForWhereInput ); 195 | int count = prestmt.executeUpdate() ; 196 | prestmt.close(); 197 | return count; 198 | } 199 | 200 | // DELETE FROM sqlaction_demo WHERE name=? 201 | public static int DELETE_FROM_sqlaction_demo_WHERE_name_E_( Connection conn, String _1_name ) throws Exception { 202 | PreparedStatement prestmt = conn.prepareStatement( "DELETE FROM sqlaction_demo WHERE name=?" ) ; 203 | prestmt.setString( 1, _1_name ); 204 | int count = prestmt.executeUpdate() ; 205 | prestmt.close(); 206 | return count; 207 | } 208 | 209 | } 210 | ``` 211 | `SqlactionDemoSAU.java` 212 | ``` 213 | // This file generated by sqlaction v0.2.9.0 214 | 215 | package xyz.calvinwilliams.sqlaction; 216 | 217 | import java.math.*; 218 | import java.util.*; 219 | import java.sql.Time; 220 | import java.sql.Timestamp; 221 | import java.sql.Connection; 222 | import java.sql.Statement; 223 | import java.sql.PreparedStatement; 224 | import java.sql.ResultSet; 225 | 226 | public class SqlactionDemoSAU extends SqlactionDemoSAO { 227 | 228 | } 229 | ``` 230 | 231 | ## 2.4. Beginning to write your first line application code 232 | 233 | `Demo.java` 234 | 235 | ``` 236 | `Demo.java` 237 | 238 | ``` 239 | package xyz.calvinwilliams.sqlaction; 240 | 241 | import java.sql.Connection; 242 | import java.sql.DriverManager; 243 | import java.sql.SQLException; 244 | import java.util.LinkedList; 245 | import java.util.List; 246 | 247 | public class Demo { 248 | 249 | public static void main(String[] args) { 250 | Connection conn = null ; 251 | List sqlactionDemoList = null ; 252 | SqlactionDemoSAU sqlactionDemo = null ; 253 | int nret = 0 ; 254 | 255 | // Connect to database 256 | try { 257 | Class.forName( "com.mysql.jdbc.Driver" ); 258 | conn = DriverManager.getConnection( "jdbc:mysql://127.0.0.1:3306/calvindb?serverTimezone=GMT", "calvin", "calvin" ) ; 259 | } catch (ClassNotFoundException e1) { 260 | e1.printStackTrace(); 261 | } catch (SQLException e) { 262 | e.printStackTrace(); 263 | } 264 | 265 | try { 266 | conn.setAutoCommit(false); 267 | 268 | // Delete records with name 269 | nret = SqlactionDemoSAU.DELETE_FROM_sqlaction_demo_WHERE_name_E_( conn, "Calvin" ) ; 270 | if( nret < 0 ) { 271 | System.out.println( "SqlactionDemoSAU.DELETE_FROM_sqlaction_demo_WHERE_name_E_ failed["+nret+"]" ); 272 | conn.rollback(); 273 | return; 274 | } else { 275 | System.out.println( "SqlactionDemoSAU.DELETE_FROM_sqlaction_demo_WHERE_name_E_ ok , rows["+nret+"] effected" ); 276 | } 277 | 278 | // Insert record 279 | sqlactionDemo = new SqlactionDemoSAU() ; 280 | sqlactionDemo.name = "Calvin" ; 281 | sqlactionDemo.address = "My address" ; 282 | nret = SqlactionDemoSAU.INSERT_INTO_sqlaction_demo( conn, sqlactionDemo ) ; 283 | if( nret < 0 ) { 284 | System.out.println( "SqlactionDemoSAU.INSERT_INTO_sqlaction_demo failed["+nret+"]" ); 285 | conn.rollback(); 286 | return; 287 | } else { 288 | System.out.println( "SqlactionDemoSAU.INSERT_INTO_sqlaction_demo ok" ); 289 | } 290 | 291 | // Update record with name 292 | nret = SqlactionDemoSAU.UPDATE_sqlaction_demo_SET_address_E_WHERE_name_E_( conn, "My address 2", "Calvin" ) ; 293 | if( nret < 0 ) { 294 | System.out.println( "SqlactionDemoSAU.UPDATE_sqlaction_demo_SET_address_E_WHERE_name_E_ failed["+nret+"]" ); 295 | conn.rollback(); 296 | return; 297 | } else { 298 | System.out.println( "SqlactionDemoSAU.UPDATE_sqlaction_demo_SET_address_E_WHERE_name_E_ ok , rows["+nret+"] effected" ); 299 | } 300 | 301 | // Query records 302 | sqlactionDemoList = new LinkedList() ; 303 | nret = SqlactionDemoSAU.SELECT_ALL_FROM_sqlaction_demo( conn, sqlactionDemoList ) ; 304 | if( nret < 0 ) { 305 | System.out.println( "SqlactionDemoSAO.SELECT_ALL_FROM_sqlaction_demo failed["+nret+"]" ); 306 | conn.rollback(); 307 | return; 308 | } else { 309 | System.out.println( "SqlactionDemoSAO.SELECT_ALL_FROM_sqlaction_demo ok" ); 310 | for( SqlactionDemoSAU r : sqlactionDemoList ) { 311 | System.out.println( " id["+r.id+"] name["+r.name+"] address["+r.address+"]" ); 312 | } 313 | } 314 | 315 | conn.commit(); 316 | } catch(Exception e) { 317 | try { 318 | conn.rollback(); 319 | } catch (Exception e2) { 320 | return; 321 | } 322 | } 323 | 324 | return; 325 | } 326 | 327 | } 328 | ``` 329 | 330 | ## 2.5. Executing your application 331 | 332 | ``` 333 | SqlactionDemoSAU.DELETE_FROM_sqlaction_demo_WHERE_name_E_ ok , rows[1] effected 334 | SqlactionDemoSAU.INSERT_INTO_sqlaction_demo ok 335 | SqlactionDemoSAU.UPDATE_sqlaction_demo_SET_address_E_WHERE_name_E_ ok , rows[1] effected 336 | SqlactionDemoSAO.SELECT_ALL_FROM_sqlaction_demo ok 337 | id[20] name[Calvin] address[My address 2] 338 | ``` 339 | 340 | # 3. Reference 341 | 342 | ## 3.1. Process flow 343 | 344 | ``` 345 | sqlaction 346 | dbserver.conf.json¡¢sqlaction.conf.json ---------> XxxSao.java¡¢XxxSau.java --\ 347 | ---> App.jar 348 | App.java --/ 349 | ``` 350 | 351 | # 4. Workload difference MyBatis and sqlaction 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 361 | 362 | 363 | 364 | 365 | 366 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 |
MyBatissqlaction
Configure project once 360 |
Databaes conntion configDatabaes conntion config
Configure every table 367 |
table mapper configtable action config
table entity classsqlaction auto-gen
table interface classDon't need
Don't needsqlaction execute command?
java -Dfile.encoding=UTF-8 -classpath "D:\Work\sqlaction\sqlaction.jar;D:\Work\mysql-connector-java-8.0.15\mysql-connector-java-8.0.15.jar" xyz.calvinwilliams.sqlaction.gencode.SqlActionGencode
385 | 386 | # 5. Benchmark difference MyBatis and sqlaction 387 | 388 | CPU : Intel Core i5-7500 3.4GHz 3.4GHz 389 | Momey : 16GB 390 | OS : WINDOWS 10 391 | JAVA IDE : Eclipse 2018-12 392 | Database : MySQL 8.0.15 Community Server 393 | Database connect-address : 127.0.0.1:3306 394 | 395 | DDL 396 | 397 | ``` 398 | CREATE TABLE `sqlaction_benchmark` ( 399 | `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '编号', 400 | `name` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT '英文厄1¤71¤71?71¤7', 401 | `name_cn` varchar(128) COLLATE utf8mb4_bin NOT NULL COMMENT '䶿文各1¤71¤71?71¤7', 402 | `salary` decimal(12,2) NOT NULL COMMENT '蔿殿', 403 | `birthday` date NOT NULL COMMENT '生日', 404 | PRIMARY KEY (`id`) 405 | ) ENGINE=InnoDB AUTO_INCREMENT=42332 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin 406 | ``` 407 | 408 | ## 5.1. Prepare sqlaction 409 | 410 | Create `dbserver.conf.json` 411 | 412 | ``` 413 | { 414 | "driver" : "com.mysql.jdbc.Driver" , 415 | "url" : "jdbc:mysql://127.0.0.1:3306/calvindb?serverTimezone=GMT" , 416 | "user" : "calvin" , 417 | "pwd" : "calvin" 418 | } 419 | ``` 420 | 421 | Create `sqlaction.conf.json` 422 | 423 | ``` 424 | { 425 | "database" : "calvindb" , 426 | "tables" : [ 427 | { 428 | "table" : "sqlaction_benchmark" , 429 | "sqlactions" : [ 430 | "INSERT INTO sqlaction_benchmark" , 431 | "UPDATE sqlaction_benchmark SET salary=? WHERE name=?" , 432 | "SELECT * FROM sqlaction_benchmark WHERE name=?" , 433 | "SELECT * FROM sqlaction_benchmark" , 434 | "DELETE FROM sqlaction_benchmark WHERE name=?" , 435 | "DELETE FROM sqlaction_benchmark" 436 | ] 437 | } 438 | ] , 439 | "javaPackage" : "xyz.calvinwilliams.sqlaction.benchmark" 440 | } 441 | ``` 442 | 443 | Executing `sqlaction`, auto-gen `SqlactionBenchmarkSAO.java` 444 | 445 | Create `SqlActionBenchmarkCrud.java` 446 | 447 | ``` 448 | /* 449 | * sqlaction - SQL action object auto-gencode tool based JDBC for Java 450 | * author : calvin 451 | * email : calvinwilliams@163.com 452 | * 453 | * See the file LICENSE in base directory. 454 | */ 455 | 456 | package xyz.calvinwilliams.sqlaction.benchmark; 457 | 458 | import java.math.BigDecimal; 459 | import java.sql.Connection; 460 | import java.sql.DriverManager; 461 | import java.sql.SQLException; 462 | import java.text.SimpleDateFormat; 463 | import java.util.Date; 464 | import java.util.LinkedList; 465 | import java.util.List; 466 | 467 | public class SqlActionBenchmarkCrud { 468 | 469 | public static void main(String[] args) { 470 | Connection conn = null ; 471 | SqlactionBenchmarkSAO sqlactionBenchmark ; 472 | List sqlactionBenchmarkList ; 473 | long beginMillisSecondstamp ; 474 | long endMillisSecondstamp ; 475 | double elpaseSecond ; 476 | long i , j , k ; 477 | long count , count2 , count3 ; 478 | int rows = 0 ; 479 | 480 | // connect to database 481 | try { 482 | Class.forName( "com.mysql.jdbc.Driver" ); 483 | conn = DriverManager.getConnection( "jdbc:mysql://127.0.0.1:3306/calvindb?serverTimezone=GMT", "calvin", "calvin" ) ; 484 | } catch (ClassNotFoundException e1) { 485 | e1.printStackTrace(); 486 | } catch (SQLException e) { 487 | e.printStackTrace(); 488 | } 489 | 490 | try { 491 | conn.setAutoCommit(false); 492 | 493 | sqlactionBenchmark = new SqlactionBenchmarkSAO() ; 494 | sqlactionBenchmark.name = "Calvin" ; 495 | sqlactionBenchmark.nameCn = "卡尔攄1¤71¤71?71¤7" ; 496 | sqlactionBenchmark.salary = new BigDecimal(0) ; 497 | long time = System.currentTimeMillis() ; 498 | sqlactionBenchmark.birthday = new java.sql.Date(time) ; 499 | count = 500 ; 500 | count2 = 5 ; 501 | count3 = 1000 ; 502 | 503 | rows = SqlactionBenchmarkSAO.DELETE_FROM_sqlaction_benchmark( conn ) ; 504 | conn.commit(); 505 | 506 | // benchmark for INSERT 507 | beginMillisSecondstamp = System.currentTimeMillis() ; 508 | for( i = 0 ; i < count ; i++ ) { 509 | sqlactionBenchmark.name = "Calvin"+i ; 510 | sqlactionBenchmark.nameCn = "卡尔攄1¤71¤71?71¤7"+i ; 511 | rows = SqlactionBenchmarkSAO.INSERT_INTO_sqlaction_benchmark( conn, sqlactionBenchmark ) ; 512 | if( rows != 1 ) { 513 | System.out.println( "SqlactionBenchmarkSAO.INSERT_INTO_sqlaction_benchmark failed["+rows+"]" ); 514 | return; 515 | } 516 | if( i % 10 == 0 ) { 517 | conn.commit(); 518 | } 519 | } 520 | conn.commit(); 521 | endMillisSecondstamp = System.currentTimeMillis() ; 522 | elpaseSecond = (endMillisSecondstamp-beginMillisSecondstamp)/1000.0 ; 523 | System.out.println( "All sqlaction INSERT done , count["+count+"] elapse["+elpaseSecond+"]s" ); 524 | 525 | // benchmark for UPDATE 526 | beginMillisSecondstamp = System.currentTimeMillis() ; 527 | for( i = 0 ; i < count ; i++ ) { 528 | rows = SqlactionBenchmarkSAO.UPDATE_sqlaction_benchmark_SET_salary_E_WHERE_name_E_( conn, new BigDecimal(i), "Calvin"+i ) ; 529 | if( rows != 1 ) { 530 | System.out.println( "SqlactionBenchmarkSAO.UPDATE_sqlaction_benchmark_SET_salary_E_WHERE_name_E_ failed["+rows+"]" ); 531 | return; 532 | } 533 | if( i % 10 == 0 ) { 534 | conn.commit(); 535 | } 536 | } 537 | conn.commit(); 538 | endMillisSecondstamp = System.currentTimeMillis() ; 539 | elpaseSecond = (endMillisSecondstamp-beginMillisSecondstamp)/1000.0 ; 540 | System.out.println( "All sqlaction UPDATE WHERE done , count["+count+"] elapse["+elpaseSecond+"]s" ); 541 | 542 | // benchmark for SELECT ... WHERE ... 543 | beginMillisSecondstamp = System.currentTimeMillis() ; 544 | for( j = 0 ; j < count2 ; j++ ) { 545 | for( i = 0 ; i < count ; i++ ) { 546 | sqlactionBenchmarkList = new LinkedList() ; 547 | rows = SqlactionBenchmarkSAO.SELECT_ALL_FROM_sqlaction_benchmark_WHERE_name_E_( conn, sqlactionBenchmarkList, "Calvin"+i ) ; 548 | if( rows != 1 ) { 549 | System.out.println( "SqlactionBenchmarkSAO.SELECT_ALL_FROM_sqlaction_benchmark_WHERE_name_E_ failed["+rows+"]" ); 550 | return; 551 | } 552 | } 553 | } 554 | endMillisSecondstamp = System.currentTimeMillis() ; 555 | elpaseSecond = (endMillisSecondstamp-beginMillisSecondstamp)/1000.0 ; 556 | System.out.println( "All sqlaction SELECT WHERE done , count2["+count2+"] count["+count+"] elapse["+elpaseSecond+"]s" ); 557 | 558 | // benchmark for SELECT 559 | beginMillisSecondstamp = System.currentTimeMillis() ; 560 | for( k = 0 ; k < count3 ; k++ ) { 561 | sqlactionBenchmarkList = new LinkedList() ; 562 | rows = SqlactionBenchmarkSAO.SELECT_ALL_FROM_sqlaction_benchmark( conn, sqlactionBenchmarkList ) ; 563 | if( rows != count ) { 564 | System.out.println( "SqlactionBenchmarkSAO.SELECT_ALL_FROM_sqlaction_benchmark failed["+rows+"]" ); 565 | return; 566 | } 567 | } 568 | endMillisSecondstamp = System.currentTimeMillis() ; 569 | elpaseSecond = (endMillisSecondstamp-beginMillisSecondstamp)/1000.0 ; 570 | System.out.println( "All sqlaction SELECT to LIST done , count3["+count3+"] elapse["+elpaseSecond+"]s" ); 571 | 572 | // benchmark for DELETE 573 | beginMillisSecondstamp = System.currentTimeMillis() ; 574 | for( i = 0 ; i < count ; i++ ) { 575 | rows = SqlactionBenchmarkSAO.DELETE_FROM_sqlaction_benchmark_WHERE_name_E_( conn, "Calvin"+i ) ; 576 | if( rows != 1 ) { 577 | System.out.println( "SqlactionBenchmarkSAO.DELETE_FROM_sqlaction_benchmark_WHERE_name_E_ failed["+rows+"]" ); 578 | return; 579 | } 580 | if( i % 10 == 0 ) { 581 | conn.commit(); 582 | } 583 | } 584 | conn.commit(); 585 | endMillisSecondstamp = System.currentTimeMillis() ; 586 | elpaseSecond = (endMillisSecondstamp-beginMillisSecondstamp)/1000.0 ; 587 | System.out.println( "All sqlaction DELETE WHERE done , count["+count+"] elapse["+elpaseSecond+"]s" ); 588 | } catch(Exception e) { 589 | e.printStackTrace(); 590 | try { 591 | conn.rollback(); 592 | } catch (Exception e2) { 593 | e.printStackTrace(); 594 | return; 595 | } 596 | } finally { 597 | try { 598 | conn.close(); 599 | } catch (Exception e2) { 600 | e2.printStackTrace(); 601 | return; 602 | } 603 | } 604 | 605 | return; 606 | } 607 | } 608 | ``` 609 | 610 | ## 5.2. Prepare MyBatis 611 | 612 | Create `mybatis-config.xml` 613 | 614 | ``` 615 | 616 | 617 | 618 | 619 | 620 | 621 | 622 | 623 | 624 | 625 | 626 | 627 | 628 | 629 | 630 | 631 | 632 | 633 | 634 | 635 | 636 | ``` 637 | 638 | Create `mybatis-mapper.xml` 639 | 640 | ``` 641 | 642 | 643 | 644 | 645 | INSERT INTO sqlaction_benchmark (name,name_cn,salary,birthday) VALUES( #{name}, #{name_cn}, #{salary}, #{birthday} ) 646 | 647 | 648 | UPDATE sqlaction_benchmark SET salary=#{salary} WHERE name=#{name} 649 | 650 | 653 | 656 | 657 | DELETE FROM sqlaction_benchmark WHERE name=#{name} 658 | 659 | 660 | DELETE FROM sqlaction_benchmark 661 | 662 | 663 | ``` 664 | 665 | Create `SqlactionBenchmarkSAO.java` 666 | 667 | ``` 668 | package xyz.calvinwilliams.mybatis.benchmark; 669 | 670 | import java.math.*; 671 | 672 | public class SqlactionBenchmarkSAO { 673 | 674 | int id ; 675 | String name ; 676 | String name_cn ; 677 | BigDecimal salary ; 678 | java.sql.Date birthday ; 679 | 680 | int _count_ ; // defining for 'SELECT COUNT(*)' 681 | 682 | } 683 | ``` 684 | 685 | Create `SqlactionBenchmarkSAOMapper.java` 686 | 687 | ``` 688 | package xyz.calvinwilliams.mybatis.benchmark; 689 | 690 | import java.util.*; 691 | 692 | public interface SqlactionBenchmarkSAOMapper { 693 | public void insertOne(SqlactionBenchmarkSAO sqlactionBenchmark); 694 | public void updateOneByName(SqlactionBenchmarkSAO sqlactionBenchmark); 695 | public SqlactionBenchmarkSAO selectOneByName(String name); 696 | public List selectAll(); 697 | public void deleteOneByName(String name); 698 | public void deleteAll(); 699 | } 700 | ``` 701 | 702 | Create `MyBatisBenchmarkCrud.java` 703 | 704 | ``` 705 | /* 706 | * sqlaction - SQL action object auto-gencode tool based JDBC for Java 707 | * author : calvin 708 | * email : calvinwilliams@163.com 709 | * 710 | * See the file LICENSE in base directory. 711 | */ 712 | 713 | package xyz.calvinwilliams.mybatis.benchmark; 714 | 715 | import java.io.FileInputStream; 716 | import java.math.BigDecimal; 717 | import java.util.List; 718 | 719 | import org.apache.ibatis.session.SqlSession; 720 | import org.apache.ibatis.session.SqlSessionFactoryBuilder; 721 | 722 | import xyz.calvinwilliams.mybatis.benchmark.SqlactionBenchmarkSAO; 723 | import xyz.calvinwilliams.mybatis.benchmark.SqlactionBenchmarkSAOMapper; 724 | 725 | public class MyBatisBenchmarkCrud { 726 | 727 | public static void main(String[] args) { 728 | SqlSession session = null ; 729 | SqlactionBenchmarkSAOMapper mapper ; 730 | List sqlactionBenchmarkList ; 731 | long beginMillisSecondstamp ; 732 | long endMillisSecondstamp ; 733 | double elpaseSecond ; 734 | long i , j , k ; 735 | long count , count2 , count3 ; 736 | 737 | try { 738 | FileInputStream in = new FileInputStream("src/main/java/mybatis-config.xml"); 739 | session = new SqlSessionFactoryBuilder().build(in).openSession(); 740 | 741 | SqlactionBenchmarkSAO sqlactionBenchmark = new SqlactionBenchmarkSAO() ; 742 | sqlactionBenchmark.id = 1 ; 743 | sqlactionBenchmark.name = "Calvin" ; 744 | sqlactionBenchmark.name_cn = "卡尔攄1¤71¤71?71¤7" ; 745 | sqlactionBenchmark.salary = new BigDecimal(0) ; 746 | long time = System.currentTimeMillis() ; 747 | sqlactionBenchmark.birthday = new java.sql.Date(time) ; 748 | count = 500 ; 749 | count2 = 5 ; 750 | count3 = 1000 ; 751 | 752 | mapper = session.getMapper(SqlactionBenchmarkSAOMapper.class) ; 753 | 754 | mapper.deleteAll(); 755 | session.commit(); 756 | 757 | // benchmark for INSERT 758 | beginMillisSecondstamp = System.currentTimeMillis() ; 759 | for( i = 0 ; i < count ; i++ ) { 760 | sqlactionBenchmark.name = "Calvin"+i ; 761 | sqlactionBenchmark.name_cn = "卡尔攄1¤71¤71?71¤7"+i ; 762 | mapper.insertOne(sqlactionBenchmark); 763 | if( i % 10 == 0 ) { 764 | session.commit(); 765 | } 766 | } 767 | session.commit(); 768 | endMillisSecondstamp = System.currentTimeMillis() ; 769 | elpaseSecond = (endMillisSecondstamp-beginMillisSecondstamp)/1000.0 ; 770 | System.out.println( "All mybatis INSERT done , count["+count+"] elapse["+elpaseSecond+"]s" ); 771 | 772 | // benchmark for UPDATE 773 | beginMillisSecondstamp = System.currentTimeMillis() ; 774 | for( i = 0 ; i < count ; i++ ) { 775 | sqlactionBenchmark.name = "Calvin"+i ; 776 | sqlactionBenchmark.salary = new BigDecimal(i) ; 777 | mapper.updateOneByName(sqlactionBenchmark); 778 | if( i % 10 == 0 ) { 779 | session.commit(); 780 | } 781 | } 782 | session.commit(); 783 | endMillisSecondstamp = System.currentTimeMillis() ; 784 | elpaseSecond = (endMillisSecondstamp-beginMillisSecondstamp)/1000.0 ; 785 | System.out.println( "All mybatis UPDATE done , count["+count+"] elapse["+elpaseSecond+"]s" ); 786 | 787 | // benchmark for SELECT ... WHERE ... 788 | beginMillisSecondstamp = System.currentTimeMillis() ; 789 | for( j = 0 ; j < count2 ; j++ ) { 790 | for( i = 0 ; i < count ; i++ ) { 791 | sqlactionBenchmark = mapper.selectOneByName(sqlactionBenchmark.name) ; 792 | if( sqlactionBenchmark == null ) { 793 | System.out.println( "mapper.selectOneByName failed" ); 794 | return; 795 | } 796 | } 797 | } 798 | endMillisSecondstamp = System.currentTimeMillis() ; 799 | elpaseSecond = (endMillisSecondstamp-beginMillisSecondstamp)/1000.0 ; 800 | System.out.println( "All mybatis SELECT WHERE done , count2["+count2+"] count["+count+"] elapse["+elpaseSecond+"]s" ); 801 | 802 | // benchmark for SELECT 803 | beginMillisSecondstamp = System.currentTimeMillis() ; 804 | for( k = 0 ; k < count3 ; k++ ) { 805 | sqlactionBenchmarkList = mapper.selectAll() ; 806 | if( sqlactionBenchmarkList == null ) { 807 | System.out.println( "mapper.selectAll failed" ); 808 | return; 809 | } 810 | } 811 | endMillisSecondstamp = System.currentTimeMillis() ; 812 | elpaseSecond = (endMillisSecondstamp-beginMillisSecondstamp)/1000.0 ; 813 | System.out.println( "All mybatis SELECT to List done , count3["+count3+"] elapse["+elpaseSecond+"]s" ); 814 | 815 | // benchmark for DELETE 816 | beginMillisSecondstamp = System.currentTimeMillis() ; 817 | for( i = 0 ; i < count ; i++ ) { 818 | sqlactionBenchmark.name = "Calvin"+i ; 819 | mapper.deleteOneByName(sqlactionBenchmark.name); 820 | if( i % 10 == 0 ) { 821 | session.commit(); 822 | } 823 | } 824 | session.commit(); 825 | endMillisSecondstamp = System.currentTimeMillis() ; 826 | elpaseSecond = (endMillisSecondstamp-beginMillisSecondstamp)/1000.0 ; 827 | System.out.println( "All mybatis DELETE done , count["+count+"] elapse["+elpaseSecond+"]s" ); 828 | } catch (Exception e) { 829 | e.printStackTrace(); 830 | } 831 | } 832 | 833 | } 834 | ``` 835 | 836 | ## 5.3. Case 837 | 838 | INSERT table for 500 records 839 | UPDATE table for 500 records 840 | SELECT table for 500*5 records 841 | SELECT table to List for 1000 records 842 | DELETE table for 500 records 843 | 844 | ## 5.4. Result 845 | 846 | ``` 847 | All sqlaction INSERT done , count[500] elapse[4.742]s 848 | All sqlaction UPDATE WHERE done , count[500] elapse[5.912]s 849 | All sqlaction SELECT WHERE done , count2[5] count[500] elapse[0.985]s 850 | All sqlaction SELECT to LIST done , count3[1000] elapse[1.172]s 851 | All sqlaction DELETE WHERE done , count[500] elapse[5.001]s 852 | 853 | All mybatis INSERT done , count[500] elapse[5.869]s 854 | All mybatis UPDATE WHERE done , count[500] elapse[6.921]s 855 | All mybatis SELECT WHERE done , count2[5] count[500] elapse[1.239]s 856 | All mybatis SELECT to List done , count3[1000] elapse[1.792]s 857 | All mybatis DELETE WHERE done , count[500] elapse[5.382]s 858 | 859 | All sqlaction INSERT done , count[500] elapse[5.392]s 860 | All sqlaction UPDATE WHERE done , count[500] elapse[5.821]s 861 | All sqlaction SELECT WHERE done , count2[5] count[500] elapse[0.952]s 862 | All sqlaction SELECT to LIST done , count3[1000] elapse[1.15]s 863 | All sqlaction DELETE WHERE done , count[500] elapse[5.509]s 864 | 865 | All mybatis INSERT done , count[500] elapse[6.066]s 866 | All mybatis UPDATE WHERE done , count[500] elapse[6.946]s 867 | All mybatis SELECT WHERE done , count2[5] count[500] elapse[1.183]s 868 | All mybatis SELECT to List done , count3[1000] elapse[1.804]s 869 | All mybatis DELETE WHERE done , count[500] elapse[5.958]s 870 | 871 | All sqlaction INSERT done , count[500] elapse[5.236]s 872 | All sqlaction UPDATE WHERE done , count[500] elapse[5.84]s 873 | All sqlaction SELECT WHERE done , count2[5] count[500] elapse[0.985]s 874 | All sqlaction SELECT to LIST done , count3[1000] elapse[1.222]s 875 | All sqlaction DELETE WHERE done , count[500] elapse[4.91]s 876 | 877 | All mybatis INSERT done , count[500] elapse[5.448]s 878 | All mybatis UPDATE WHERE done , count[500] elapse[7.287]s 879 | All mybatis SELECT WHERE done , count2[5] count[500] elapse[1.149]s 880 | All mybatis SELECT to List done , count3[1000] elapse[1.873]s 881 | All mybatis DELETE WHERE done , count[500] elapse[6.035]s 882 | ``` 883 | 884 | ![benchmark_INSERT.png](benchmark_INSERT.png) 885 | 886 | ![benchmark_UPDATE_WHERE.png](benchmark_UPDATE_WHERE.png) 887 | 888 | ![benchmark_SELECT_WHERE.png](benchmark_SELECT_WHERE.png) 889 | 890 | ![benchmark_SELECT_to_LIST.png](benchmark_SELECT_to_LIST.png) 891 | 892 | ![benchmark_DELETE_WHERE.png](benchmark_DELETE_WHERE.png) 893 | 894 | **`sqlaction`'s performance faster 20% than `MyBatis`** 895 | 896 | # 6. TODO 897 | 898 | 1. Eclipse plugin for executing sqlaction 899 | 1. Support Cache 900 | 1. Optimize Oracle support 901 | 902 | # 7. About The Project 903 | 904 | Download source at : [gitee](https://gitee.com/calvinwilliams/sqlaction),[github](https://github.com/calvinwilliams/sqlaction) 905 | 906 | Apache Maven 907 | ``` 908 | 909 | xyz.calvinwilliams 910 | sqlaction 911 | 0.2.9.0 912 | 913 | ``` 914 | 915 | # 8. About Author 916 | 917 | Mailto : [netease](mailto:calvinwilliams@163.com) or [Gmail](mailto:calvinwilliams.c@gmail.com) 918 | 919 | -------------------------------------------------------------------------------- /SqlactionBenchmarkSAO.java.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/calvinwilliams/sqlaction/f389ab2d388a2315182dcac115eaf65f814e1a44/SqlactionBenchmarkSAO.java.png -------------------------------------------------------------------------------- /SqlactionBenchmarkSAOMapper.java.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/calvinwilliams/sqlaction/f389ab2d388a2315182dcac115eaf65f814e1a44/SqlactionBenchmarkSAOMapper.java.png -------------------------------------------------------------------------------- /TODO: -------------------------------------------------------------------------------- 1 | * Eclipse插件触发执行工具sqlaction 2 | * 增加缓存 3 | * 进一步优化支持Oracle 4 | -------------------------------------------------------------------------------- /benchmark.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/calvinwilliams/sqlaction/f389ab2d388a2315182dcac115eaf65f814e1a44/benchmark.xlsx -------------------------------------------------------------------------------- /benchmark_DELETE_WHERE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/calvinwilliams/sqlaction/f389ab2d388a2315182dcac115eaf65f814e1a44/benchmark_DELETE_WHERE.png -------------------------------------------------------------------------------- /benchmark_INSERT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/calvinwilliams/sqlaction/f389ab2d388a2315182dcac115eaf65f814e1a44/benchmark_INSERT.png -------------------------------------------------------------------------------- /benchmark_SELECT_WHERE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/calvinwilliams/sqlaction/f389ab2d388a2315182dcac115eaf65f814e1a44/benchmark_SELECT_WHERE.png -------------------------------------------------------------------------------- /benchmark_SELECT_to_LIST.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/calvinwilliams/sqlaction/f389ab2d388a2315182dcac115eaf65f814e1a44/benchmark_SELECT_to_LIST.png -------------------------------------------------------------------------------- /benchmark_UPDATE_WHERE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/calvinwilliams/sqlaction/f389ab2d388a2315182dcac115eaf65f814e1a44/benchmark_UPDATE_WHERE.png -------------------------------------------------------------------------------- /dbserver.conf.json.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/calvinwilliams/sqlaction/f389ab2d388a2315182dcac115eaf65f814e1a44/dbserver.conf.json.png -------------------------------------------------------------------------------- /git_deve_merge_to_test_and_release.bat: -------------------------------------------------------------------------------- 1 | git.exe checkout test -- 2 | git.exe merge deve 3 | 4 | git.exe checkout release -- 5 | git.exe merge test 6 | 7 | git.exe checkout deve -- 8 | 9 | pause 10 | -------------------------------------------------------------------------------- /mybatis-config.xml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/calvinwilliams/sqlaction/f389ab2d388a2315182dcac115eaf65f814e1a44/mybatis-config.xml.png -------------------------------------------------------------------------------- /mybatis-mapper.xml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/calvinwilliams/sqlaction/f389ab2d388a2315182dcac115eaf65f814e1a44/mybatis-mapper.xml.png -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 4 | 4.0.0 5 | xyz.calvinwilliams 6 | sqlaction 7 | 0.2.9.0 8 | 9 | 10 | xyz.calvinwilliams 11 | okjson 12 | 0.0.9.0 13 | 14 | 15 | mysql 16 | mysql-connector-java 17 | 8.0.15 18 | 19 | 20 | org.postgresql 21 | postgresql 22 | 42.2.5 23 | 24 | 29 | 30 | com.oracle 31 | ojdbc8 32 | 12.2.0.1 33 | 34 | 35 | org.xerial 36 | sqlite-jdbc 37 | 3.27.2.1 38 | 39 | 40 | com.microsoft.sqlserver 41 | mssql-jdbc 42 | 7.2.2.jre8 43 | 44 | 45 | 46 | 47 | org.sonatype.oss 48 | oss-parent 49 | 7 50 | 51 | 52 | 53 | 54 | The Apache Software License, Version 2.0 55 | http://www.apache.org/licenses/LICENSE-2.0.txt 56 | repo 57 | 58 | 59 | 60 | https://github.com/calvinwilliams/sqlaction 61 | https://github.com/calvinwilliams/sqlaction.git 62 | https://github.com/calvinwilliams/sqlaction 63 | 64 | 65 | 66 | calvinwilliams 67 | calvinwilliams@163.com 68 | https://github.com/calvinwilliams/sqlaction 69 | 70 | 71 | 72 | 73 | 74 | sonatype-nexus-snapshuts 75 | Sonatype Nexus Snapshots 76 | https://oss.sonatype.org/content/repositories/snapshots 77 | 78 | 79 | sonatype-nexus-releases 80 | Nexus Release Repository 81 | https://oss.sonatype.org/service/local/staging/deploy/maven2 82 | 83 | 84 | -------------------------------------------------------------------------------- /sqlaction.conf.json.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/calvinwilliams/sqlaction/f389ab2d388a2315182dcac115eaf65f814e1a44/sqlaction.conf.json.png -------------------------------------------------------------------------------- /src/main/java/xyz/calvinwilliams/sqlaction/DbServerConf.java: -------------------------------------------------------------------------------- 1 | /* 2 | * sqlaction - SQL action object auto-gencode tool based JDBC for Java 3 | * author : calvin 4 | * email : calvinwilliams@163.com 5 | * 6 | * See the file LICENSE in base directory. 7 | */ 8 | 9 | package xyz.calvinwilliams.sqlaction; 10 | 11 | import java.util.*; 12 | 13 | public class DbServerConf { 14 | public String dbms ; 15 | public String driver ; 16 | public String url ; 17 | public String user ; 18 | public String pwd ; 19 | public LinkedList userDefineDataTypes ; 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/xyz/calvinwilliams/sqlaction/DbServerConfUserDefineDataTypes.java: -------------------------------------------------------------------------------- 1 | /* 2 | * sqlaction - SQL action object auto-gencode tool based JDBC for Java 3 | * author : calvin 4 | * email : calvinwilliams@163.com 5 | * 6 | * See the file LICENSE in base directory. 7 | */ 8 | 9 | package xyz.calvinwilliams.sqlaction; 10 | 11 | import java.util.LinkedList; 12 | 13 | public class DbServerConfUserDefineDataTypes { 14 | public String source ; 15 | public String redefine ; 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/xyz/calvinwilliams/sqlaction/SqlActionConf.java: -------------------------------------------------------------------------------- 1 | /* 2 | * sqlaction - SQL action object auto-gencode tool based JDBC for Java 3 | * author : calvin 4 | * email : calvinwilliams@163.com 5 | * 6 | * See the file LICENSE in base directory. 7 | */ 8 | 9 | package xyz.calvinwilliams.sqlaction; 10 | 11 | import java.util.*; 12 | 13 | public class SqlActionConf { 14 | public String database ; 15 | public LinkedList tables ; 16 | public String javaPackage ; 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/xyz/calvinwilliams/sqlaction/SqlActionConfTable.java: -------------------------------------------------------------------------------- 1 | /* 2 | * sqlaction - SQL action object auto-gencode tool based JDBC for Java 3 | * author : calvin 4 | * email : calvinwilliams@163.com 5 | * 6 | * See the file LICENSE in base directory. 7 | */ 8 | 9 | package xyz.calvinwilliams.sqlaction; 10 | 11 | import java.util.LinkedList; 12 | 13 | public class SqlActionConfTable { 14 | public String table ; 15 | public LinkedList sqlactions ; 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/xyz/calvinwilliams/sqlaction/SqlActionDatabase.java: -------------------------------------------------------------------------------- 1 | /* 2 | * sqlaction - SQL action object auto-gencode tool based JDBC for Java 3 | * author : calvin 4 | * email : calvinwilliams@163.com 5 | * 6 | * See the file LICENSE in base directory. 7 | */ 8 | 9 | package xyz.calvinwilliams.sqlaction; 10 | 11 | import java.util.*; 12 | 13 | public class SqlActionDatabase { 14 | 15 | final public static String DBMS_MYSQL = "MySql" ; 16 | final public static String DBMS_POSTGRESQL = "PostgreSQL" ; 17 | final public static String DBMS_ORACLE = "Oracle" ; 18 | final public static String DBMS_SQLITE = "Sqlite" ; 19 | final public static String DBMS_SQLSERVER = "SqlServer" ; 20 | 21 | String databaseName ; 22 | List tableList ; 23 | 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/xyz/calvinwilliams/sqlaction/SqlActionFromTableToken.java: -------------------------------------------------------------------------------- 1 | /* 2 | * sqlaction - SQL action object auto-gencode tool based JDBC for Java 3 | * author : calvin 4 | * email : calvinwilliams@163.com 5 | * 6 | * See the file LICENSE in base directory. 7 | */ 8 | 9 | package xyz.calvinwilliams.sqlaction; 10 | 11 | import java.sql.Connection; 12 | import java.util.List; 13 | 14 | public class SqlActionFromTableToken { 15 | 16 | public String tableName = null ; 17 | public String tableAliasName = null ; 18 | public SqlActionTable table = null ; 19 | 20 | public static SqlActionTable findTable( List fromTableTokenList, String tableName ) { 21 | for( SqlActionFromTableToken tt : fromTableTokenList ) { 22 | if( tt.tableAliasName != null ) { 23 | if( tt.tableAliasName.equalsIgnoreCase(tableName) ) { 24 | return tt.table; 25 | } 26 | } 27 | } 28 | 29 | for( SqlActionFromTableToken tt : fromTableTokenList ) { 30 | if( tt.tableName.equalsIgnoreCase(tableName) ) { 31 | return tt.table; 32 | } 33 | } 34 | 35 | return null; 36 | } 37 | 38 | // public static SqlActionTable findOrFetchTableMetadataInDatabase( DbServerConf dbserverConf, SqlActionConf sqlactionConf, Connection conn, SqlActionDatabase database, SqlActionTable tableCache, String tableName ) throws Exception { 39 | // SqlActionTable table = SqlActionTable.findTable( database.tableList, tableName ) ; 40 | // if( table != null ) { 41 | // return table; 42 | // } 43 | // 44 | // return SqlActionTable.fetchTableMetadataInDatabase( dbserverConf, sqlactionConf, conn, database, tableCache, tableName ) ; 45 | // } 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/xyz/calvinwilliams/sqlaction/SqlActionFromTableTokenForAdvancedMode.java: -------------------------------------------------------------------------------- 1 | package xyz.calvinwilliams.sqlaction; 2 | 3 | public class SqlActionFromTableTokenForAdvancedMode { 4 | 5 | public SqlActionTable table ; 6 | } 7 | -------------------------------------------------------------------------------- /src/main/java/xyz/calvinwilliams/sqlaction/SqlActionIndex.java: -------------------------------------------------------------------------------- 1 | /* 2 | * sqlaction - SQL action object auto-gencode tool based JDBC for Java 3 | * author : calvin 4 | * email : calvinwilliams@163.com 5 | * 6 | * See the file LICENSE in base directory. 7 | */ 8 | 9 | package xyz.calvinwilliams.sqlaction; 10 | 11 | import java.sql.*; 12 | import java.util.*; 13 | 14 | public class SqlActionIndex { 15 | String indexName ; 16 | boolean isUnique ; 17 | List columnList ; 18 | 19 | public static int fetchAllIndexesMetadataInTable( DbServerConf dbserverConf, SqlActionConf sqlactionConf, Connection conn, SqlActionDatabase database, SqlActionTable table ) throws Exception { 20 | PreparedStatement prestmt = null ; 21 | ResultSet rs ; 22 | SqlActionIndex index ; 23 | SqlActionColumn column ; 24 | int nret = 0 ; 25 | 26 | table.indexList = new LinkedList() ; 27 | 28 | if( dbserverConf.dbms == SqlActionDatabase.DBMS_MYSQL ) { 29 | prestmt = conn.prepareStatement("SELECT non_unique,index_name FROM information_schema.STATISTICS WHERE table_schema=? AND table_name=? AND seq_in_index=1 ORDER BY index_name ASC") ; 30 | prestmt.setString( 1, database.databaseName ); 31 | prestmt.setString( 2, table.tableName ); 32 | } else if( dbserverConf.dbms == SqlActionDatabase.DBMS_POSTGRESQL ) { 33 | return 0; 34 | } else if( dbserverConf.dbms == SqlActionDatabase.DBMS_ORACLE ) { 35 | return 0; 36 | } else if( dbserverConf.dbms == SqlActionDatabase.DBMS_SQLITE ) { 37 | return 0; 38 | } else if( dbserverConf.dbms == SqlActionDatabase.DBMS_SQLSERVER ) { 39 | return 0; 40 | } 41 | rs = prestmt.executeQuery() ; 42 | while( rs.next() ) { 43 | index = new SqlActionIndex() ; 44 | 45 | if( rs.getInt(1) == 1 ) 46 | index.isUnique = false ; 47 | else 48 | index.isUnique = true ; 49 | index.indexName = rs.getString(2) ; 50 | 51 | table.indexList.add( index ); 52 | } 53 | rs.close(); 54 | 55 | for( SqlActionIndex i : table.indexList ) { 56 | i.columnList = new LinkedList() ; 57 | 58 | if( dbserverConf.dbms == SqlActionDatabase.DBMS_MYSQL ) { 59 | prestmt = conn.prepareStatement("SELECT column_name FROM information_schema.STATISTICS WHERE table_schema=? AND table_name=? AND index_name=? ORDER BY seq_in_index ASC") ; 60 | prestmt.setString( 1, database.databaseName ); 61 | prestmt.setString( 2, table.tableName ); 62 | prestmt.setString( 3, i.indexName ); 63 | } 64 | rs = prestmt.executeQuery() ; 65 | while( rs.next() ) { 66 | column = new SqlActionColumn() ; 67 | 68 | column.columnName = rs.getString(1) ; 69 | 70 | i.columnList.add( column ); 71 | } 72 | rs.close(); 73 | 74 | for( SqlActionColumn c : i.columnList ) { 75 | if( dbserverConf.dbms == SqlActionDatabase.DBMS_MYSQL ) { 76 | prestmt = conn.prepareStatement("SELECT column_name,column_default,is_nullable,data_type,character_maximum_length,numeric_precision,numeric_scale,column_key,extra,column_comment FROM information_schema.COLUMNS WHERE table_schema=? AND table_name=? AND column_name=?") ; 77 | prestmt.setString( 1, database.databaseName ); 78 | prestmt.setString( 2, table.tableName ); 79 | prestmt.setString( 3, c.columnName ); 80 | } 81 | rs = prestmt.executeQuery() ; 82 | while( rs.next() ) { 83 | nret = SqlActionColumn.getColumnMetadataFromResultSet_for_MYSQL( dbserverConf, sqlactionConf, database, table, c, rs ); 84 | if( nret != 0 ) { 85 | System.out.println( "GetColumnFromResultSet failed["+nret+"] , database["+database.databaseName+"] table["+table.tableName+"] column["+c.columnName+"]" ); 86 | return nret; 87 | } 88 | } 89 | rs.close(); 90 | } 91 | } 92 | 93 | return 0; 94 | } 95 | 96 | public static int travelAllIndexesMetadata( DbServerConf dbserverConf, SqlActionConf sqlactionConf, List sqlactionIndexList, int depth ) { 97 | for( SqlActionIndex i : sqlactionIndexList ) { 98 | for( int n = 0 ; n < depth ; n++ ) 99 | System.out.print( "\t" ); 100 | System.out.println( "indexName["+i.indexName+"] isUnique["+i.isUnique+"]" ); 101 | 102 | SqlActionColumn.travelAllColumnsMetadata( dbserverConf, sqlactionConf, i.columnList, depth+1 ); 103 | } 104 | 105 | return 0; 106 | } 107 | } 108 | -------------------------------------------------------------------------------- /src/main/java/xyz/calvinwilliams/sqlaction/SqlActionJdbcDataTypeEnum.java: -------------------------------------------------------------------------------- 1 | /* 2 | * sqlaction - SQL action object auto-gencode tool based JDBC for Java 3 | * author : calvin 4 | * email : calvinwilliams@163.com 5 | * 6 | * See the file LICENSE in base directory. 7 | */ 8 | 9 | package xyz.calvinwilliams.sqlaction; 10 | 11 | public enum SqlActionJdbcDataTypeEnum { 12 | SQLACTION_DATA_TYPE_BIT , 13 | SQLACTION_DATA_TYPE_TINYINT , 14 | SQLACTION_DATA_TYPE_SMALLINT , 15 | SQLACTION_DATA_TYPE_MEDIUMINT , 16 | SQLACTION_DATA_TYPE_INTEGER , 17 | SQLACTION_DATA_TYPE_BIGINT , 18 | SQLACTION_DATA_TYPE_REAL , 19 | SQLACTION_DATA_TYPE_FLOAT , 20 | SQLACTION_DATA_TYPE_DOUBLE , 21 | SQLACTION_DATA_TYPE_DECIMAL , 22 | SQLACTION_DATA_TYPE_NUMBERIC , 23 | SQLACTION_DATA_TYPE_CHAR , 24 | SQLACTION_DATA_TYPE_VARCHAR , 25 | SQLACTION_DATA_TYPE_LONGVARCHAR , 26 | SQLACTION_DATA_TYPE_DATE , 27 | SQLACTION_DATA_TYPE_TIME , 28 | SQLACTION_DATA_TYPE_DATETIME , 29 | SQLACTION_DATA_TYPE_TIMESTAMP , 30 | SQLACTION_DATA_TYPE_YEAR , 31 | SQLACTION_DATA_TYPE_BINARY , 32 | SQLACTION_DATA_TYPE_VARBINARY , 33 | SQLACTION_DATA_TYPE_LONGVARBINARY , 34 | SQLACTION_DATA_TYPE_BLOB , 35 | SQLACTION_DATA_TYPE_TINYBLOB , 36 | SQLACTION_DATA_TYPE_MEDIUMBLOB , 37 | SQLACTION_DATA_TYPE_LONGBLOB , 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/xyz/calvinwilliams/sqlaction/SqlActionLexicalParser.java: -------------------------------------------------------------------------------- 1 | /* 2 | * sqlaction - SQL action object auto-gencode tool based JDBC for Java 3 | * author : calvin 4 | * email : calvinwilliams@163.com 5 | * 6 | * See the file LICENSE in base directory. 7 | */ 8 | 9 | package xyz.calvinwilliams.sqlaction; 10 | 11 | public class SqlActionLexicalParser { 12 | 13 | char[] sql ; 14 | int sqlLength ; 15 | int parserOffset ; 16 | 17 | public void setSqlString( String sql ) { 18 | this.sql = sql.toCharArray() ; 19 | this.sqlLength = sql.length() ; 20 | this.parserOffset = 0 ; 21 | return; 22 | } 23 | 24 | public String getSqlToken() { 25 | int beginOffset ; 26 | 27 | while( parserOffset < sqlLength ) { 28 | if( ! ( sql[parserOffset] == ' ' || sql[parserOffset] == '\t' || sql[parserOffset] == '\r' || sql[parserOffset] == '\n' ) ) 29 | break; 30 | parserOffset++; 31 | } 32 | if( parserOffset >= sqlLength ) 33 | return null; 34 | 35 | beginOffset = parserOffset ; 36 | 37 | while( parserOffset < sqlLength ) { 38 | 39 | if( sql[parserOffset] == '/' ) { 40 | if( parserOffset != beginOffset ) { 41 | return new String(sql,beginOffset,parserOffset-beginOffset); 42 | } 43 | 44 | parserOffset++; 45 | if( sql[parserOffset] == '*' ) { 46 | parserOffset++; 47 | while( parserOffset < sqlLength ) { 48 | if( sql[parserOffset] == '*' ) { 49 | parserOffset++; 50 | if( parserOffset >= sqlLength ) 51 | return null; 52 | if( sql[parserOffset] == '/' ) { 53 | break; 54 | } else { 55 | return null; 56 | } 57 | } 58 | 59 | parserOffset++; 60 | } 61 | if( parserOffset >= sqlLength ) 62 | return null; 63 | 64 | parserOffset++; 65 | return new String(sql,beginOffset,parserOffset-beginOffset); 66 | } else { 67 | return new String(sql,beginOffset,1); 68 | } 69 | } else if( sql[parserOffset] == '#' ) { 70 | if( parserOffset != beginOffset ) { 71 | return new String(sql,beginOffset,parserOffset-beginOffset); 72 | } 73 | 74 | parserOffset++; 75 | if( sql[parserOffset] == '{' ) { 76 | parserOffset++; 77 | while(true) { 78 | if( sql[parserOffset] == '}' ) 79 | break; 80 | parserOffset++; 81 | } 82 | parserOffset++; 83 | return new String(sql,beginOffset,parserOffset-beginOffset); 84 | } else { 85 | return new String(sql,beginOffset,1); 86 | } 87 | } else if( sql[parserOffset] == '.' ) { 88 | if( parserOffset != beginOffset ) { 89 | return new String(sql,beginOffset,parserOffset-beginOffset); 90 | } 91 | 92 | parserOffset++; 93 | return new String(sql,beginOffset,1); 94 | } else if( sql[parserOffset] == ',' ) { 95 | if( parserOffset != beginOffset ) { 96 | return new String(sql,beginOffset,parserOffset-beginOffset); 97 | } 98 | 99 | parserOffset++; 100 | return new String(sql,beginOffset,1); 101 | } else if( sql[parserOffset] == '?' ) { 102 | if( parserOffset != beginOffset ) { 103 | return new String(sql,beginOffset,parserOffset-beginOffset); 104 | } 105 | 106 | parserOffset++; 107 | return new String(sql,beginOffset,1); 108 | } else if( sql[parserOffset] == '"' || sql[parserOffset] == '\'' ) { 109 | if( parserOffset != beginOffset ) { 110 | return new String(sql,beginOffset,parserOffset-beginOffset); 111 | } 112 | 113 | parserOffset++; 114 | while( parserOffset < sqlLength ) { 115 | if( sql[parserOffset] == sql[beginOffset] ) 116 | break; 117 | parserOffset++; 118 | } 119 | if( parserOffset >= sqlLength ) 120 | return null; 121 | 122 | parserOffset++; 123 | return new String(sql,beginOffset,parserOffset-beginOffset); 124 | } else if( sql[parserOffset] == '=' ) { 125 | if( parserOffset != beginOffset ) { 126 | return new String(sql,beginOffset,parserOffset-beginOffset); 127 | } 128 | 129 | parserOffset++; 130 | return new String(sql,beginOffset,1); 131 | } else if( sql[parserOffset] == '<' ) { 132 | if( parserOffset != beginOffset ) { 133 | return new String(sql,beginOffset,parserOffset-beginOffset); 134 | } 135 | 136 | parserOffset++; 137 | if( sql[parserOffset] == '>' ) { 138 | parserOffset++; 139 | return new String(sql,beginOffset,2); 140 | } else if( sql[parserOffset] == '=' ) { 141 | parserOffset++; 142 | return new String(sql,beginOffset,2); 143 | } else { 144 | return new String(sql,beginOffset,1); 145 | } 146 | } else if( sql[parserOffset] == '>' ) { 147 | if( parserOffset != beginOffset ) { 148 | return new String(sql,beginOffset,parserOffset-beginOffset); 149 | } 150 | 151 | parserOffset++; 152 | if( sql[parserOffset] == '=' ) { 153 | parserOffset++; 154 | return new String(sql,beginOffset,2); 155 | } else { 156 | return new String(sql,beginOffset,1); 157 | } 158 | } else if( sql[parserOffset] == '(' ) { 159 | if( parserOffset != beginOffset ) { 160 | return new String(sql,beginOffset,parserOffset-beginOffset); 161 | } 162 | 163 | parserOffset++; 164 | return new String(sql,beginOffset,1); 165 | } else if( sql[parserOffset] == ')' ) { 166 | if( parserOffset != beginOffset ) { 167 | return new String(sql,beginOffset,parserOffset-beginOffset); 168 | } 169 | 170 | parserOffset++; 171 | return new String(sql,beginOffset,1); 172 | } else if( sql[parserOffset] == ' ' || sql[parserOffset] == '\t' || sql[parserOffset] == '\r' || sql[parserOffset] == '\n' ) { 173 | return new String(sql,beginOffset,parserOffset-beginOffset); 174 | } 175 | 176 | parserOffset++; 177 | } 178 | if( parserOffset != beginOffset ) { 179 | return new String(sql,beginOffset,parserOffset-beginOffset); 180 | } else { 181 | return null; 182 | } 183 | } 184 | 185 | public String getRemainSqlTokens() { 186 | return new String( sql, parserOffset, sqlLength-parserOffset ); 187 | } 188 | } 189 | -------------------------------------------------------------------------------- /src/main/java/xyz/calvinwilliams/sqlaction/SqlActionOtherClassTokenForAdvancedMode.java: -------------------------------------------------------------------------------- 1 | package xyz.calvinwilliams.sqlaction; 2 | 3 | public class SqlActionOtherClassTokenForAdvancedMode { 4 | 5 | public String javaClassName ; 6 | public String javaObjectName ; 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/xyz/calvinwilliams/sqlaction/SqlActionPredicateEnum.java: -------------------------------------------------------------------------------- 1 | package xyz.calvinwilliams.sqlaction; 2 | 3 | public enum SqlActionPredicateEnum { 4 | SQLACTION_PREDICATE_NONE , 5 | SQLACTION_PREDICATE_SELECT , 6 | SQLACTION_PREDICATE_INSERT , 7 | SQLACTION_PREDICATE_UPDATE , 8 | SQLACTION_PREDICATE_DELETE 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/xyz/calvinwilliams/sqlaction/SqlActionSelectColumnToken.java: -------------------------------------------------------------------------------- 1 | /* 2 | * sqlaction - SQL action object auto-gencode tool based JDBC for Java 3 | * author : calvin 4 | * email : calvinwilliams@163.com 5 | * 6 | * See the file LICENSE in base directory. 7 | */ 8 | 9 | package xyz.calvinwilliams.sqlaction; 10 | 11 | public class SqlActionSelectColumnToken { 12 | 13 | public String tableName = null ; 14 | public SqlActionTable table = null ; 15 | public String columnName = null ; 16 | public SqlActionColumn column = null ; 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/xyz/calvinwilliams/sqlaction/SqlActionSelectColumnTokenForAdvancedMode.java: -------------------------------------------------------------------------------- 1 | package xyz.calvinwilliams.sqlaction; 2 | 3 | public class SqlActionSelectColumnTokenForAdvancedMode { 4 | 5 | public SqlActionTable table ; 6 | public String columnName ; 7 | public SqlActionColumn column ; 8 | 9 | public String javaClassName ; 10 | public String javaObjectName ; 11 | public String javaPropertyName ; 12 | public String javaPropertyType ; 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/xyz/calvinwilliams/sqlaction/SqlActionSetColumnToken.java: -------------------------------------------------------------------------------- 1 | /* 2 | * sqlaction - SQL action object auto-gencode tool based JDBC for Java 3 | * author : calvin 4 | * email : calvinwilliams@163.com 5 | * 6 | * See the file LICENSE in base directory. 7 | */ 8 | 9 | package xyz.calvinwilliams.sqlaction; 10 | 11 | public class SqlActionSetColumnToken { 12 | 13 | public String tableName = null ; 14 | public SqlActionTable table = null ; 15 | public String columnName = null ; 16 | public SqlActionColumn column = null ; 17 | public String columnValue = null ; 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/xyz/calvinwilliams/sqlaction/SqlActionStatementEnum.java: -------------------------------------------------------------------------------- 1 | package xyz.calvinwilliams.sqlaction; 2 | 3 | public enum SqlActionStatementEnum { 4 | 5 | SQLACTION_STATEMENT_NONE , 6 | SQLACTION_STATEMENT_SELECT , 7 | SQLACTION_STATEMENT_INSERT , 8 | SQLACTION_STATEMENT_UPDATE , 9 | SQLACTION_STATEMENT_DELETE , 10 | SQLACTION_STATEMENT_FROM , 11 | SQLACTION_STATEMENT_SET , 12 | SQLACTION_STATEMENT_WHERE , 13 | SQLACTION_STATEMENT_GROUP , 14 | SQLACTION_STATEMENT_ORDER , 15 | SQLACTION_STATEMENT_HAVING , 16 | SQLACTION_STATEMENT_OFFSET , 17 | SQLACTION_STATEMENT_LIMIT 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/xyz/calvinwilliams/sqlaction/SqlActionSyntaxParser.java: -------------------------------------------------------------------------------- 1 | /* 2 | * sqlaction - SQL action object auto-gencode tool based JDBC for Java 3 | * author : calvin 4 | * email : calvinwilliams@163.com 5 | * 6 | * See the file LICENSE in base directory. 7 | */ 8 | 9 | package xyz.calvinwilliams.sqlaction; 10 | 11 | import java.sql.Connection; 12 | import java.util.*; 13 | 14 | public class SqlActionSyntaxParser { 15 | 16 | SqlActionPredicateEnum sqlPredicate ; 17 | 18 | String selectHint ; 19 | List selectColumnTokenList ; 20 | List fromTableTokenList ; 21 | 22 | String insertTableName ; 23 | 24 | String updateTableName ; 25 | List setColumnTokenList ; 26 | 27 | String deleteTableName ; 28 | 29 | boolean hasWhereStatement ; 30 | List whereColumnTokenList ; 31 | 32 | String otherTokens ; 33 | 34 | String pageKey ; 35 | SqlActionColumn pageKeyColumn ; 36 | String pageSort ; 37 | 38 | List selectColumnTokenForAdvancedModeList ; 39 | List fromTableTokenForAdvancedModeList ; 40 | List otherClassTokenForAdvancedModeList ; 41 | List whereColumnTokenForAdvancedModeList ; 42 | 43 | String sqlaction ; 44 | String sql ; 45 | boolean advancedMode ; 46 | String prepareSql ; 47 | String selectSeq ; 48 | String selectKey ; 49 | SqlActionColumn selectKeyColumn ; 50 | String methodName ; 51 | String statementInterceptorMethodName ; 52 | 53 | public int parseStatementSyntax_FROM( DbServerConf dbserverConf, SqlActionConf sqlactionConf, Connection conn, SqlActionDatabase database, SqlActionTable table ) throws Exception { 54 | SqlActionLexicalParser lexicalParser ; 55 | String token ; 56 | SqlActionFromTableToken fromTableToken ; 57 | 58 | lexicalParser = new SqlActionLexicalParser() ; 59 | lexicalParser.setSqlString(sql); 60 | 61 | while(true) { 62 | token = lexicalParser.getSqlToken() ; 63 | if( token == null ) 64 | return 0; 65 | else if( token.equalsIgnoreCase("FROM") ) 66 | break; 67 | } 68 | 69 | // Support for 70 | // FROM table (WHERE|GROUP|ORDER|HAVING) 71 | // FROM table t (WHERE|GROUP|ORDER|HAVING) 72 | // FROM table,table2 (WHERE|GROUP|ORDER|HAVING) 73 | // FROM table t,table2 t2 (WHERE|GROUP|ORDER|HAVING) 74 | while(true) { 75 | String token1 = lexicalParser.getSqlToken() ; 76 | if( token1 == null ) { 77 | // 1 78 | // FROM \0 79 | return -11; 80 | } 81 | String token2 = lexicalParser.getSqlToken() ; 82 | if( token2 == null ) { 83 | // 1 84 | // FROM table\0 85 | fromTableToken = new SqlActionFromTableToken() ; 86 | fromTableToken.tableName = token1 ; 87 | fromTableToken.table = SqlActionTable.fetchTableMetadataInDatabase( dbserverConf, sqlactionConf, conn, database, table, fromTableToken.tableName ) ; 88 | if( fromTableToken.table == null ) { 89 | System.out.println( "\t" + "*** ERROR : tableName["+fromTableToken.tableName+"] not found in database["+database.databaseName+"]" ); 90 | return -12; 91 | } 92 | fromTableTokenList.add(fromTableToken); 93 | break; 94 | } else if( token2.equalsIgnoreCase("WHERE") || token2.equalsIgnoreCase("GROUP") || token2.equalsIgnoreCase("ORDER") || token2.equalsIgnoreCase("HAVING") ) { 95 | // 1 2 96 | // FROM table (WHERE|GROUP|ORDER|HAVING) 97 | fromTableToken = new SqlActionFromTableToken() ; 98 | fromTableToken.tableName = token1 ; 99 | fromTableToken.table = SqlActionTable.fetchTableMetadataInDatabase( dbserverConf, sqlactionConf, conn, database, table, fromTableToken.tableName ) ; 100 | if( fromTableToken.table == null ) { 101 | System.out.println( "\t" + "*** ERROR : tableName["+fromTableToken.tableName+"] not found in database["+database.databaseName+"]" ); 102 | return -13; 103 | } 104 | fromTableTokenList.add(fromTableToken); 105 | break; 106 | } else if( token2.equals(",") ) { 107 | // 1 2 108 | // FROM table, 109 | fromTableToken = new SqlActionFromTableToken() ; 110 | fromTableToken.tableName = token1 ; 111 | fromTableToken.table = SqlActionTable.fetchTableMetadataInDatabase( dbserverConf, sqlactionConf, conn, database, table, fromTableToken.tableName ) ; 112 | if( fromTableToken.table == null ) { 113 | System.out.println( "\t" + "*** ERROR : tableName["+fromTableToken.tableName+"] not found in database["+database.databaseName+"]" ); 114 | return -14; 115 | } 116 | fromTableTokenList.add(fromTableToken); 117 | continue; 118 | } else { 119 | // 1 2 120 | // FROM table1 t1 121 | String token3 = lexicalParser.getSqlToken() ; 122 | if( token3 == null ) { 123 | // 1 2 3 124 | // FROM table t\0 125 | fromTableToken = new SqlActionFromTableToken() ; 126 | fromTableToken.tableName = token1 ; 127 | fromTableToken.table = SqlActionTable.fetchTableMetadataInDatabase( dbserverConf, sqlactionConf, conn, database, table, fromTableToken.tableName ) ; 128 | if( fromTableToken.table == null ) { 129 | System.out.println( "\t" + "*** ERROR : tableName["+fromTableToken.tableName+"] not found in database["+database.databaseName+"]" ); 130 | return -151; 131 | } 132 | fromTableToken.tableAliasName = token2 ; 133 | fromTableTokenList.add(fromTableToken); 134 | 135 | break; 136 | } else if( token3.equals(",") ) { 137 | // 1 2 3 138 | // FROM table t, 139 | fromTableToken = new SqlActionFromTableToken() ; 140 | fromTableToken.tableName = token1 ; 141 | fromTableToken.table = SqlActionTable.fetchTableMetadataInDatabase( dbserverConf, sqlactionConf, conn, database, table, fromTableToken.tableName ) ; 142 | if( fromTableToken.table == null ) { 143 | System.out.println( "\t" + "*** ERROR : tableName["+fromTableToken.tableName+"] not found in database["+database.databaseName+"]" ); 144 | return -152; 145 | } 146 | fromTableToken.tableAliasName = token2 ; 147 | fromTableTokenList.add(fromTableToken); 148 | continue; 149 | } else if( token3.equalsIgnoreCase("WHERE") || token3.equalsIgnoreCase("GROUP") || token3.equalsIgnoreCase("ORDER") || token3.equalsIgnoreCase("HAVING") ) { 150 | // 1 2 3 151 | // FROM table t (WHERE|GROUP|ORDER|HAVING) 152 | fromTableToken = new SqlActionFromTableToken() ; 153 | fromTableToken.tableName = token1 ; 154 | fromTableToken.table = SqlActionTable.fetchTableMetadataInDatabase( dbserverConf, sqlactionConf, conn, database, table, fromTableToken.tableName ) ; 155 | if( fromTableToken.table == null ) { 156 | System.out.println( "\t" + "*** ERROR : tableName["+fromTableToken.tableName+"] not found in database["+database.databaseName+"]" ); 157 | return -153; 158 | } 159 | fromTableToken.tableAliasName = token2 ; 160 | fromTableTokenList.add(fromTableToken); 161 | break; 162 | } else { 163 | return -154; 164 | } 165 | } 166 | } 167 | 168 | return 0; 169 | } 170 | 171 | public int parseStatementSyntax_ExceptFROM( DbServerConf dbserverConf, SqlActionConf sqlactionConf, Connection conn, SqlActionDatabase database, SqlActionTable table ) { 172 | SqlActionSelectColumnToken selectColumnToken = null ; 173 | SqlActionSetColumnToken setColumnToken = null ; 174 | SqlActionWhereColumnToken whereColumnToken = null ; 175 | String token9 = null ; 176 | 177 | SqlActionLexicalParser lexicalParser = new SqlActionLexicalParser() ; 178 | lexicalParser.setSqlString(sql); 179 | 180 | sqlPredicate = SqlActionPredicateEnum.SQLACTION_PREDICATE_NONE ; 181 | 182 | String token = lexicalParser.getSqlToken() ; 183 | if( token == null ) 184 | return 0; 185 | while( token != null ) { 186 | if( token.equalsIgnoreCase("SELECT") ) { 187 | if( sqlPredicate == SqlActionPredicateEnum.SQLACTION_PREDICATE_NONE ) 188 | sqlPredicate = SqlActionPredicateEnum.SQLACTION_PREDICATE_SELECT ; 189 | 190 | // Support for 191 | // SELECT * (FROM) 192 | // SELECT [table.]column,... (FROM) 193 | // SELECT FUNC([table.]column,...),... (FROM) 194 | while(true) { 195 | String token1 = lexicalParser.getSqlToken() ; 196 | if( token1 == null ) { 197 | System.out.println( "sql["+sql+"] invalid" ); 198 | return -21; 199 | } 200 | if( token1.length() > 2 && ( token1.charAt(0) == '/' || token1.charAt(1) == '*' ) ) { 201 | selectHint = token1 ; 202 | continue; 203 | } else if( token1.equals("*") ) { 204 | // SELECT * 205 | for( SqlActionColumn c : table.columnList ) { 206 | SqlActionSelectColumnToken ct = new SqlActionSelectColumnToken() ; 207 | ct.tableName = table.tableName ; 208 | ct.table = table ; 209 | ct.columnName = c.columnName ; 210 | ct.column = c ; 211 | selectColumnTokenList.add( ct ); 212 | } 213 | 214 | String token2 = lexicalParser.getSqlToken() ; 215 | if( token2 == null ) { 216 | // SELECT *\0 217 | token = token2 ; 218 | break; 219 | } else if( token2.equalsIgnoreCase("FROM") ) { 220 | // SELECT * FROM 221 | token = token2 ; 222 | break; 223 | } else { 224 | System.out.println( "sql["+sql+"] invalid" ); 225 | return -22; 226 | } 227 | } else if( token1.equalsIgnoreCase("COUNT") ) { 228 | String token2 = lexicalParser.getSqlToken() ; 229 | if( token2 == null ) { 230 | System.out.println( "sql["+sql+"] invalid" ); 231 | return -221; 232 | } else if( ! token2.equals("(") ) { 233 | System.out.println( "\t" + "*** ERROR : expect '(' after '"+token1+"' on parsing sql["+sql+"]" ); 234 | return -222; 235 | } 236 | 237 | String token3 = lexicalParser.getSqlToken() ; 238 | if( token3 == null ) { 239 | System.out.println( "\t" + "*** ERROR : expect something after '"+token1+token2+"' on parsing sql["+sql+"]" ); 240 | return -223; 241 | } 242 | 243 | String token4 = lexicalParser.getSqlToken() ; 244 | if( token4 == null ) { 245 | System.out.println( "sql["+sql+"] invalid" ); 246 | return -224; 247 | } else if( ! token4.equals(")") ) { 248 | System.out.println( "\t" + "*** ERROR : expect ')' after '"+token1+token2+token3+"' on parsing sql["+sql+"]" ); 249 | return -225; 250 | } 251 | 252 | // 1 234 253 | // COUNT(*) 254 | selectColumnToken = new SqlActionSelectColumnToken() ; 255 | selectColumnToken.tableName = table.tableName ; 256 | selectColumnToken.table = table ; 257 | selectColumnToken.columnName = SqlActionGencode.SQL_COUNT_ ; 258 | selectColumnTokenList.add(selectColumnToken); 259 | 260 | String token5 = lexicalParser.getSqlToken() ; 261 | if( token5 == null ) { 262 | System.out.println( "sql["+sql+"] invalid" ); 263 | return -226; 264 | } 265 | if( token5.equals(",") ) { 266 | continue; 267 | } else if( token5.equalsIgnoreCase("FROM") ) { 268 | token = token5 ; 269 | break; 270 | } else { 271 | System.out.println( "\t" + "*** ERROR : expect something after '"+token1+token2+token3+token4+"' on parsing sql["+sql+"]" ); 272 | return -227; 273 | } 274 | } 275 | 276 | String token2 = lexicalParser.getSqlToken() ; 277 | if( token2 == null ) { 278 | // 1 2 279 | // SELECT column\0 280 | selectColumnToken = new SqlActionSelectColumnToken() ; 281 | selectColumnToken.tableName = table.tableName ; 282 | selectColumnToken.table = table ; 283 | selectColumnToken.columnName = token1 ; 284 | selectColumnToken.column = SqlActionColumn.findColumn( selectColumnToken.table.columnList, selectColumnToken.columnName ) ; 285 | if( selectColumnToken.column == null ) { 286 | System.out.println( "\t" + "*** ERROR : column["+selectColumnToken.columnName+"] not found in table["+table.tableName+"] on parsing sql["+sql+"]" ); 287 | return -23; 288 | } 289 | selectColumnTokenList.add(selectColumnToken); 290 | 291 | token = null ; 292 | break; 293 | } 294 | if( token2.equals(",") ) { 295 | // 1 2 296 | // SELECT column, 297 | selectColumnToken = new SqlActionSelectColumnToken() ; 298 | selectColumnToken.tableName = table.tableName ; 299 | selectColumnToken.table = table ; 300 | selectColumnToken.columnName = token1 ; 301 | selectColumnToken.column = SqlActionColumn.findColumn( selectColumnToken.table.columnList, selectColumnToken.columnName ) ; 302 | if( selectColumnToken.column == null ) { 303 | System.out.println( "\t" + "*** ERROR : column["+selectColumnToken.columnName+"] not found in table["+table.tableName+"] on parsing sql["+sql+"]" ); 304 | return -24; 305 | } 306 | selectColumnTokenList.add(selectColumnToken); 307 | 308 | continue; 309 | } else if( token2.equalsIgnoreCase("FROM") ) { 310 | // 1 2 311 | // SELECT column FROM 312 | selectColumnToken = new SqlActionSelectColumnToken() ; 313 | selectColumnToken.tableName = table.tableName ; 314 | selectColumnToken.table = table ; 315 | selectColumnToken.columnName = token1 ; 316 | selectColumnToken.column = SqlActionColumn.findColumn( selectColumnToken.table.columnList, selectColumnToken.columnName ) ; 317 | if( selectColumnToken.column == null ) { 318 | System.out.println( "\t" + "*** ERROR : column["+selectColumnToken.columnName+"] not found in table["+table.tableName+"] on parsing sql["+sql+"]" ); 319 | return -25; 320 | } 321 | selectColumnTokenList.add(selectColumnToken); 322 | 323 | token = token2 ; 324 | break; 325 | } else if( token2.equalsIgnoreCase(".") ) { 326 | // 1 2 327 | // SELECT table. 328 | String token3 = lexicalParser.getSqlToken() ; 329 | if( token3 == null ) { 330 | // 1 23 331 | // SELECT table.\0 332 | System.out.println( "sql["+sql+"] invalid" ); 333 | return -261; 334 | } else { 335 | if( token3.equals("*") ) { 336 | // 1 23 337 | // SELECT table.* 338 | SqlActionTable t = SqlActionFromTableToken.findTable( fromTableTokenList , token1 ) ; 339 | if( t == null ) { 340 | System.out.println( "\t" + "*** ERROR : table["+token1+"] not found in database["+database.databaseName+"] on parsing sql["+sql+"]" ); 341 | return -2621; 342 | } 343 | 344 | for( SqlActionColumn c : t.columnList ) { 345 | SqlActionSelectColumnToken ct = new SqlActionSelectColumnToken() ; 346 | ct.tableName = t.tableName ; 347 | ct.table = t ; 348 | ct.columnName = c.columnName ; 349 | ct.column = c ; 350 | selectColumnTokenList.add( ct ); 351 | } 352 | } else { 353 | // 1 23 354 | // SELECT table.coumn 355 | selectColumnToken = new SqlActionSelectColumnToken() ; 356 | selectColumnToken.tableName = token1 ; 357 | selectColumnToken.table = SqlActionFromTableToken.findTable( fromTableTokenList , selectColumnToken.tableName ) ; 358 | if( selectColumnToken.table == null ) { 359 | System.out.println( "\t" + "*** ERROR : table["+selectColumnToken.tableName+"] not found in database["+database.databaseName+"] on parsing sql["+sql+"]" ); 360 | return -2622; 361 | } 362 | selectColumnToken.columnName = token3 ; 363 | selectColumnToken.column = SqlActionColumn.findColumn( selectColumnToken.table.columnList, selectColumnToken.columnName ) ; 364 | if( selectColumnToken.column == null ) { 365 | System.out.println( "\t" + "*** ERROR : column["+selectColumnToken.columnName+"] not found in table["+selectColumnToken.tableName+"] on parsing sql["+sql+"]" ); 366 | return -2623; 367 | } 368 | selectColumnTokenList.add(selectColumnToken); 369 | } 370 | 371 | String token4 = lexicalParser.getSqlToken() ; 372 | if( token4 == null ) { 373 | // 1 23 4 374 | // SELECT table.column\0 375 | System.out.println( "sql["+sql+"] invalid" ); 376 | return -264; 377 | } else if( token4.equals(",") ) { 378 | // 1 23 4 379 | // SELECT table.column, 380 | 381 | continue; 382 | } else if( token4.equalsIgnoreCase("FROM") ) { 383 | // 1 23 4 384 | // SELECT table.column FROM 385 | 386 | token = token4 ; 387 | break; 388 | } else { 389 | System.out.println( "sql["+sql+"] invalid" ); 390 | return -267; 391 | } 392 | } 393 | } 394 | } 395 | } else if( token.equalsIgnoreCase("INSERT") ) { 396 | if( sqlPredicate == SqlActionPredicateEnum.SQLACTION_PREDICATE_NONE ) 397 | sqlPredicate = SqlActionPredicateEnum.SQLACTION_PREDICATE_INSERT ; 398 | 399 | String token1 = lexicalParser.getSqlToken() ; 400 | if( token1 == null ) { 401 | System.out.println( "sql["+sql+"] invalid" ); 402 | return -31; 403 | } 404 | if( ! token1.equalsIgnoreCase("INTO") ) { 405 | System.out.println( "sql["+sql+"] invalid" ); 406 | return -52; 407 | } else { 408 | token = token1 ; 409 | } 410 | 411 | String token2 = lexicalParser.getSqlToken() ; 412 | if( token2 == null ) { 413 | System.out.println( "sql["+sql+"] invalid" ); 414 | return -33; 415 | } else { 416 | insertTableName = token2 ; 417 | } 418 | 419 | String token3 = lexicalParser.getSqlToken() ; 420 | if( token3 == null ) { 421 | token = null ; 422 | break; 423 | } else { 424 | System.out.println( "sql["+sql+"] invalid" ); 425 | return -34; 426 | } 427 | } else if( token.equalsIgnoreCase("UPDATE") ) { 428 | if( sqlPredicate == SqlActionPredicateEnum.SQLACTION_PREDICATE_NONE ) 429 | sqlPredicate = SqlActionPredicateEnum.SQLACTION_PREDICATE_UPDATE ; 430 | 431 | String token1 = lexicalParser.getSqlToken() ; 432 | if( token1 == null ) { 433 | System.out.println( "sql["+sql+"] invalid" ); 434 | return -31; 435 | } 436 | 437 | String token2 = lexicalParser.getSqlToken() ; 438 | if( token2 == null ) { 439 | // 1 2 440 | // UPDATE table\0 441 | System.out.println( "sql["+sql+"] invalid" ); 442 | return -32; 443 | } 444 | if( token2.equalsIgnoreCase("SET") ) { 445 | // 1 2 446 | // UPDATE table SET 447 | updateTableName = token1 ; 448 | token = token2 ; 449 | } else { 450 | System.out.println( "sql["+sql+"] invalid" ); 451 | return -33; 452 | } 453 | } else if( token.equalsIgnoreCase("DELETE") ) { 454 | if( sqlPredicate == SqlActionPredicateEnum.SQLACTION_PREDICATE_NONE ) 455 | sqlPredicate = SqlActionPredicateEnum.SQLACTION_PREDICATE_DELETE ; 456 | 457 | String token1 = lexicalParser.getSqlToken() ; 458 | if( token1 == null ) { 459 | // 1 460 | // DELETE \0 461 | System.out.println( "sql["+sql+"] invalid" ); 462 | return -41; 463 | } 464 | if( ! token1.equalsIgnoreCase("FROM") ) { 465 | // 1 466 | // DELETE !FROM 467 | System.out.println( "sql["+sql+"] invalid" ); 468 | return -42; 469 | } 470 | 471 | String token2 = lexicalParser.getSqlToken() ; 472 | if( token2 == null ) { 473 | // 1 2 474 | // DELETE FROM\0 475 | System.out.println( "sql["+sql+"] invalid" ); 476 | return -43; 477 | } 478 | 479 | deleteTableName = token2 ; 480 | 481 | String token3 = lexicalParser.getSqlToken() ; 482 | token = token3 ; 483 | } else if( token.equalsIgnoreCase("SET") ) { 484 | while(true) { 485 | String token1 = lexicalParser.getSqlToken() ; 486 | if( token1 == null ) { 487 | System.out.println( "sql["+sql+"] invalid" ); 488 | return -51; 489 | } 490 | 491 | String token2 = lexicalParser.getSqlToken() ; 492 | if( token2 == null ) { 493 | System.out.println( "sql["+sql+"] invalid" ); 494 | return -52; 495 | } 496 | 497 | String token3 = lexicalParser.getSqlToken() ; 498 | if( token3 == null ) { 499 | System.out.println( "sql["+sql+"] invalid" ); 500 | return -53; 501 | } 502 | 503 | // 1 23 504 | // SET column=? 505 | if( token3.equals("?") ) { 506 | setColumnToken = new SqlActionSetColumnToken() ; 507 | setColumnToken.tableName = table.tableName ; 508 | setColumnToken.table = table ; 509 | setColumnToken.columnName = token1 ; 510 | setColumnToken.column = SqlActionColumn.findColumn( setColumnToken.table.columnList, setColumnToken.columnName ) ; 511 | if( setColumnToken.column == null ) { 512 | System.out.println( "\t" + "*** ERROR : column["+setColumnToken.columnName+"] not found in table["+setColumnToken.tableName+"] on parsing sql["+sql+"]" ); 513 | return -552; 514 | } 515 | setColumnToken.columnValue = token3 ; 516 | setColumnTokenList.add(setColumnToken); 517 | } 518 | 519 | String token6 = lexicalParser.getSqlToken() ; 520 | if( token6 == null ) { 521 | // 1 236 522 | // SET column=?\0 523 | token = null ; 524 | break; 525 | } 526 | if( token6.equals(",") ) { 527 | // 1 23 6 528 | // SET column=?, 529 | ; 530 | } else if( token6.equalsIgnoreCase("WHERE") ) { 531 | // 1 23 6 532 | // SET column=? WHERE 533 | token = token6 ; 534 | break; 535 | } else { 536 | System.out.println( "sql["+sql+"] invalid" ); 537 | return -56; 538 | } 539 | } 540 | } else if( token.equalsIgnoreCase("FROM") ) { 541 | while(true) { 542 | String token1 = lexicalParser.getSqlToken() ; 543 | if( token1 == null ) { 544 | token = null ; 545 | break; 546 | } else if( token1.equalsIgnoreCase("WHERE") || token1.equalsIgnoreCase("GROUP") || token1.equalsIgnoreCase("ORDER") || token1.equalsIgnoreCase("HAVING") ) { 547 | token = token1 ; 548 | break; 549 | } 550 | } 551 | } else if( token.equalsIgnoreCase("WHERE") ) { 552 | hasWhereStatement = true ; 553 | 554 | while(true) { 555 | String token1 = lexicalParser.getSqlToken() ; 556 | if( token1 == null ) { 557 | System.out.println( "sql["+sql+"] invalid" ); 558 | return -61; 559 | } 560 | 561 | String token2 = lexicalParser.getSqlToken() ; 562 | if( token2 == null ) { 563 | System.out.println( "sql["+sql+"] invalid" ); 564 | return -62; 565 | } 566 | 567 | String token3 = lexicalParser.getSqlToken() ; 568 | if( token3 == null ) { 569 | System.out.println( "sql["+sql+"] invalid" ); 570 | return -63; 571 | } 572 | 573 | if( token2.equals(".") ) { 574 | // 1 23 575 | // WHERE table.column 576 | String token4 = lexicalParser.getSqlToken() ; 577 | if( token4 == null ) { 578 | System.out.println( "sql["+sql+"] invalid" ); 579 | return -641; 580 | } 581 | 582 | String token5 = lexicalParser.getSqlToken() ; 583 | if( token5 == null ) { 584 | System.out.println( "sql["+sql+"] invalid" ); 585 | return -642; 586 | } 587 | 588 | String token6 = lexicalParser.getSqlToken() ; 589 | if( token6 == null ) { 590 | System.out.println( "sql["+sql+"] invalid" ); 591 | return -642; 592 | } 593 | 594 | if( token6.equals(".") ) { 595 | String token7 = lexicalParser.getSqlToken() ; 596 | if( token7 == null ) { 597 | System.out.println( "sql["+sql+"] invalid" ); 598 | return -6431; 599 | } 600 | 601 | token9 = lexicalParser.getSqlToken() ; 602 | if( token9 == null ) { 603 | token = null ; 604 | break; 605 | } 606 | 607 | } else { 608 | // 1 23 45 609 | // WHERE table.column=column2 610 | if( token5.equals("?") ) { 611 | whereColumnToken = new SqlActionWhereColumnToken() ; 612 | whereColumnToken.operator = token4 ; 613 | whereColumnToken.tableName = token1 ; 614 | whereColumnToken.table = SqlActionFromTableToken.findTable( fromTableTokenList , whereColumnToken.tableName ) ; 615 | if( whereColumnToken.table == null ) { 616 | System.out.println( "\t" + "*** ERROR : table["+whereColumnToken.tableName+"] not found in database["+database.databaseName+"] on parsing sql["+sql+"]" ); 617 | return -6441; 618 | } 619 | whereColumnToken.columnName = token3 ; 620 | whereColumnToken.column = SqlActionColumn.findColumn( whereColumnToken.table.columnList, whereColumnToken.columnName ) ; 621 | if( whereColumnToken.column == null ) { 622 | System.out.println( "\t" + "*** ERROR : column["+whereColumnToken.columnName+"] not found in table["+whereColumnToken.tableName+"] on parsing sql["+sql+"]" ); 623 | return -6442; 624 | } 625 | whereColumnTokenList.add(whereColumnToken); 626 | } 627 | 628 | token9 = token6 ; 629 | } 630 | } else { 631 | // 1 23 632 | // WHERE column=column2 633 | 634 | String token4 = lexicalParser.getSqlToken() ; 635 | if( token4 == null ) { 636 | // 1 23 4 637 | // WHERE column=column2\0 638 | if( token1.equals("?") ) { 639 | whereColumnToken = new SqlActionWhereColumnToken() ; 640 | whereColumnToken.operator = token2 ; 641 | whereColumnToken.tableName = table.tableName ; 642 | whereColumnToken.table = table ; 643 | whereColumnToken.columnName = token3 ; 644 | whereColumnToken.column = SqlActionColumn.findColumn( whereColumnToken.table.columnList, whereColumnToken.columnName ) ; 645 | if( whereColumnToken.column == null ) { 646 | System.out.println( "\t" + "*** ERROR : column["+whereColumnToken.columnName+"] not found in table["+whereColumnToken.tableName+"] on parsing sql["+sql+"]" ); 647 | return -654; 648 | } 649 | whereColumnTokenList.add(whereColumnToken); 650 | } else if( token3.equals("?") ) { 651 | whereColumnToken = new SqlActionWhereColumnToken() ; 652 | whereColumnToken.tableName = table.tableName ; 653 | whereColumnToken.table = table ; 654 | whereColumnToken.columnName = token1 ; 655 | whereColumnToken.column = SqlActionColumn.findColumn( whereColumnToken.table.columnList, whereColumnToken.columnName ) ; 656 | if( whereColumnToken.column == null ) { 657 | System.out.println( "\t" + "*** ERROR : column["+whereColumnToken.columnName+"] not found in table["+whereColumnToken.tableName+"] on parsing sql["+sql+"]" ); 658 | return -656; 659 | } 660 | whereColumnToken.operator = token2 ; 661 | whereColumnTokenList.add(whereColumnToken); 662 | } 663 | 664 | token = null ; 665 | break; 666 | } 667 | 668 | if( token4.equals(".") ) { 669 | // 1 23 45 670 | // WHERE column1=table2.column2 671 | String token5 = lexicalParser.getSqlToken() ; 672 | if( token5 == null ) { 673 | System.out.println( "sql["+sql+"] invalid" ); 674 | return -661; 675 | } 676 | 677 | if( token1.equals("?") ) { 678 | whereColumnToken = new SqlActionWhereColumnToken() ; 679 | whereColumnToken.operator = token2 ; 680 | whereColumnToken.tableName = token3 ; 681 | whereColumnToken.table = SqlActionFromTableToken.findTable( fromTableTokenList , whereColumnToken.tableName ) ; 682 | if( whereColumnToken.table == null ) { 683 | System.out.println( "\t" + "*** ERROR : table["+whereColumnToken.tableName+"] not found in database["+database.databaseName+"] on parsing sql["+sql+"]" ); 684 | return -664; 685 | } 686 | whereColumnToken.columnName = token5 ; 687 | whereColumnToken.column = SqlActionColumn.findColumn( whereColumnToken.table.columnList, whereColumnToken.columnName ) ; 688 | if( whereColumnToken.column == null ) { 689 | System.out.println( "\t" + "*** ERROR : column["+whereColumnToken.columnName+"] not found in table["+whereColumnToken.tableName+"] on parsing sql["+sql+"]" ); 690 | return -665; 691 | } 692 | whereColumnTokenList.add(whereColumnToken); 693 | } 694 | 695 | token9 = lexicalParser.getSqlToken() ; 696 | if( token9 == null ) { 697 | token = null ; 698 | break; 699 | } 700 | } else { 701 | // 1 23 4 702 | // WHERE column1=column2 703 | if( token1.equals("?") ) { 704 | whereColumnToken = new SqlActionWhereColumnToken() ; 705 | whereColumnToken.operator = token2 ; 706 | whereColumnToken.tableName = table.tableName ; 707 | whereColumnToken.table = table ; 708 | whereColumnToken.columnName = token3 ; 709 | whereColumnToken.column = SqlActionColumn.findColumn( whereColumnToken.table.columnList, whereColumnToken.columnName ) ; 710 | if( whereColumnToken.column == null ) { 711 | System.out.println( "\t" + "*** ERROR : column["+whereColumnToken.columnName+"] not found in table["+whereColumnToken.tableName+"] on parsing sql["+sql+"]" ); 712 | return -671; 713 | } 714 | whereColumnTokenList.add(whereColumnToken); 715 | } else if( token3.equals("?") ) { 716 | whereColumnToken = new SqlActionWhereColumnToken() ; 717 | whereColumnToken.tableName = table.tableName ; 718 | whereColumnToken.table = table ; 719 | whereColumnToken.columnName = token1 ; 720 | whereColumnToken.column = SqlActionColumn.findColumn( whereColumnToken.table.columnList, whereColumnToken.columnName ) ; 721 | if( whereColumnToken.column == null ) { 722 | System.out.println( "\t" + "*** ERROR : column["+whereColumnToken.columnName+"] not found in table["+whereColumnToken.tableName+"] on parsing sql["+sql+"]" ); 723 | return -672; 724 | } 725 | whereColumnToken.operator = token2 ; 726 | whereColumnTokenList.add(whereColumnToken); 727 | } 728 | 729 | token9 = token4 ; 730 | } 731 | } 732 | 733 | if( token9.equalsIgnoreCase("AND") || token9.equalsIgnoreCase("OR") ) { 734 | ; 735 | } else { 736 | // WHERE ... others 737 | token = token9 ; 738 | break; 739 | } 740 | } 741 | } else if( token.equalsIgnoreCase("GROUP") || token.equalsIgnoreCase("ORDER") || token.equalsIgnoreCase("HAVING") ) { 742 | otherTokens = " " + token + lexicalParser.getRemainSqlTokens() ; 743 | token = null ; 744 | break; 745 | } else { 746 | System.out.println( "token["+token+"] invalid" ); 747 | return -9; 748 | } 749 | } 750 | 751 | return 0; 752 | } 753 | 754 | public int parseStatementSyntaxForAdvancedMode_FROM( DbServerConf dbserverConf, SqlActionConf sqlactionConf, Connection conn, SqlActionDatabase database, SqlActionTable table ) throws Exception { 755 | SqlActionFromTableTokenForAdvancedMode fromTableTokenForAdvancedMode = null ; 756 | SqlActionOtherClassTokenForAdvancedMode otherClassTokenForAdvancedMode = null ; 757 | SqlActionStatementEnum sqlStatement = SqlActionStatementEnum.SQLACTION_STATEMENT_NONE ; 758 | 759 | SqlActionLexicalParser lexicalParser = new SqlActionLexicalParser() ; 760 | lexicalParser.setSqlString(sql); 761 | 762 | while(true) { 763 | String token = lexicalParser.getSqlToken() ; 764 | if( token == null ) 765 | break; 766 | 767 | if( token.equalsIgnoreCase("SELECT") ) { 768 | sqlStatement = SqlActionStatementEnum.SQLACTION_STATEMENT_SELECT ; 769 | } else if( token.equalsIgnoreCase("INSERT") ) { 770 | sqlStatement = SqlActionStatementEnum.SQLACTION_STATEMENT_INSERT ; 771 | } else if( token.equalsIgnoreCase("UPDATE") ) { 772 | sqlStatement = SqlActionStatementEnum.SQLACTION_STATEMENT_UPDATE ; 773 | } else if( token.equalsIgnoreCase("DELETE") ) { 774 | sqlStatement = SqlActionStatementEnum.SQLACTION_STATEMENT_DELETE ; 775 | } else if( token.equalsIgnoreCase("FROM") ) { 776 | sqlStatement = SqlActionStatementEnum.SQLACTION_STATEMENT_FROM ; 777 | } else if( token.equalsIgnoreCase("SET") ) { 778 | sqlStatement = SqlActionStatementEnum.SQLACTION_STATEMENT_SET ; 779 | } else if( token.equalsIgnoreCase("WHERE") ) { 780 | sqlStatement = SqlActionStatementEnum.SQLACTION_STATEMENT_WHERE ; 781 | } else if( token.equalsIgnoreCase("GROUP") ) { 782 | sqlStatement = SqlActionStatementEnum.SQLACTION_STATEMENT_GROUP ; 783 | } else if( token.equalsIgnoreCase("ORDER") ) { 784 | sqlStatement = SqlActionStatementEnum.SQLACTION_STATEMENT_ORDER ; 785 | } else if( token.equalsIgnoreCase("JAVING") ) { 786 | sqlStatement = SqlActionStatementEnum.SQLACTION_STATEMENT_HAVING ; 787 | } else if( token.equalsIgnoreCase("OFFSET") ) { 788 | sqlStatement = SqlActionStatementEnum.SQLACTION_STATEMENT_OFFSET ; 789 | } else if( token.equalsIgnoreCase("LIMIT") ) { 790 | sqlStatement = SqlActionStatementEnum.SQLACTION_STATEMENT_LIMIT ; 791 | } else { 792 | if( sqlStatement == SqlActionStatementEnum.SQLACTION_STATEMENT_FROM || sqlStatement == SqlActionStatementEnum.SQLACTION_STATEMENT_UPDATE ) { 793 | int beginPos = token.indexOf("#{") ; 794 | if( beginPos >= 0 ) { 795 | int endPos = token.indexOf("}") ; 796 | if( endPos < 0 ) { 797 | System.out.println( "expect '}' in '"+token+"'" ); 798 | return -101; 799 | } 800 | 801 | String tableName = token.substring( beginPos+2, endPos ) ; 802 | 803 | fromTableTokenForAdvancedMode = new SqlActionFromTableTokenForAdvancedMode() ; 804 | fromTableTokenForAdvancedMode.table = SqlActionTable.fetchTableMetadataInDatabase( dbserverConf, sqlactionConf, conn, database, table, tableName ) ; 805 | if( fromTableTokenForAdvancedMode.table == null ) { 806 | System.out.println( "\t" + "*** ERROR : tableName["+tableName+"] not found in database["+database.databaseName+"]" ); 807 | return -102; 808 | } 809 | fromTableTokenForAdvancedModeList.add(fromTableTokenForAdvancedMode); 810 | } 811 | } 812 | } 813 | } 814 | 815 | return 0; 816 | } 817 | 818 | public int parseStatementSyntaxForAdvancedMode_ExceptFROM( DbServerConf dbserverConf, SqlActionConf sqlactionConf, Connection conn, SqlActionDatabase database, SqlActionTable table ) throws Exception { 819 | SqlActionSelectColumnTokenForAdvancedMode selectColumnTokenForAdvancedMode = null ; 820 | SqlActionWhereColumnTokenForAdvancedMode whereColumnTokenForAdvancedMode = null ; 821 | SqlActionStatementEnum sqlStatement = SqlActionStatementEnum.SQLACTION_STATEMENT_NONE ; 822 | 823 | SqlActionLexicalParser lexicalParser = new SqlActionLexicalParser() ; 824 | lexicalParser.setSqlString(sql); 825 | 826 | sqlPredicate = SqlActionPredicateEnum.SQLACTION_PREDICATE_NONE ; 827 | 828 | while(true) { 829 | String token = lexicalParser.getSqlToken() ; 830 | if( token == null ) 831 | break; 832 | 833 | if( token.equalsIgnoreCase("SELECT") ) { 834 | if( sqlPredicate == SqlActionPredicateEnum.SQLACTION_PREDICATE_NONE ) 835 | sqlPredicate = SqlActionPredicateEnum.SQLACTION_PREDICATE_SELECT ; 836 | sqlStatement = SqlActionStatementEnum.SQLACTION_STATEMENT_SELECT ; 837 | } else if( token.equalsIgnoreCase("INSERT") ) { 838 | if( sqlPredicate == SqlActionPredicateEnum.SQLACTION_PREDICATE_NONE ) 839 | sqlPredicate = SqlActionPredicateEnum.SQLACTION_PREDICATE_INSERT ; 840 | sqlStatement = SqlActionStatementEnum.SQLACTION_STATEMENT_INSERT ; 841 | } else if( token.equalsIgnoreCase("UPDATE") ) { 842 | if( sqlPredicate == SqlActionPredicateEnum.SQLACTION_PREDICATE_NONE ) 843 | sqlPredicate = SqlActionPredicateEnum.SQLACTION_PREDICATE_UPDATE ; 844 | sqlStatement = SqlActionStatementEnum.SQLACTION_STATEMENT_UPDATE ; 845 | } else if( token.equalsIgnoreCase("DELETE") ) { 846 | if( sqlPredicate == SqlActionPredicateEnum.SQLACTION_PREDICATE_NONE ) 847 | sqlPredicate = SqlActionPredicateEnum.SQLACTION_PREDICATE_DELETE ; 848 | sqlStatement = SqlActionStatementEnum.SQLACTION_STATEMENT_DELETE ; 849 | } else if( token.equalsIgnoreCase("FROM") ) { 850 | sqlStatement = SqlActionStatementEnum.SQLACTION_STATEMENT_FROM ; 851 | } else if( token.equalsIgnoreCase("SET") ) { 852 | sqlStatement = SqlActionStatementEnum.SQLACTION_STATEMENT_SET ; 853 | } else if( token.equalsIgnoreCase("WHERE") ) { 854 | sqlStatement = SqlActionStatementEnum.SQLACTION_STATEMENT_WHERE ; 855 | } else if( token.equalsIgnoreCase("GROUP") ) { 856 | sqlStatement = SqlActionStatementEnum.SQLACTION_STATEMENT_GROUP ; 857 | } else if( token.equalsIgnoreCase("ORDER") ) { 858 | sqlStatement = SqlActionStatementEnum.SQLACTION_STATEMENT_ORDER ; 859 | } else if( token.equalsIgnoreCase("JAVING") ) { 860 | sqlStatement = SqlActionStatementEnum.SQLACTION_STATEMENT_HAVING ; 861 | } else if( token.equalsIgnoreCase("OFFSET") ) { 862 | sqlStatement = SqlActionStatementEnum.SQLACTION_STATEMENT_OFFSET ; 863 | } else if( token.equalsIgnoreCase("LIMIT") ) { 864 | sqlStatement = SqlActionStatementEnum.SQLACTION_STATEMENT_LIMIT ; 865 | } else { 866 | if( sqlStatement == SqlActionStatementEnum.SQLACTION_STATEMENT_SELECT ) { 867 | int beginPos = token.indexOf("#{") ; 868 | if( beginPos >= 0 ) { 869 | String javaSauClassName ; 870 | String javaPropertyName ; 871 | String javaPropertyType ; 872 | 873 | int endPos = token.indexOf( "}", beginPos+2 ) ; 874 | if( endPos < 0 ) { 875 | System.out.println( "expect '}' in '"+token+"'" ); 876 | return -101; 877 | } 878 | 879 | int dotPos = token.indexOf( ".", beginPos+2 ) ; 880 | if( dotPos < 0 ) { 881 | System.out.println( "expect '.' in '"+token+"'" ); 882 | return -102; 883 | } 884 | 885 | int colonPos = token.indexOf( ":", dotPos+1 ) ; 886 | 887 | javaSauClassName = token.substring( beginPos+2, dotPos ) ; 888 | if( colonPos >= 0 ) { 889 | javaPropertyName = token.substring( dotPos+1, colonPos ) ; 890 | javaPropertyType = token.substring( colonPos+1, endPos ) ; 891 | } else { 892 | javaPropertyName = token.substring( dotPos+1, endPos ) ; 893 | javaPropertyType = null ; 894 | } 895 | 896 | if( javaPropertyType == null ) { 897 | if( javaPropertyName.equals("*") ) { 898 | SqlActionTable t = SqlActionTable.findTableByJavaSauClassName( database.tableList, javaSauClassName ) ; 899 | if( t == null ) { 900 | System.out.println( "\t" + "*** ERROR : javaSauClassName["+javaSauClassName+"] not found" ); 901 | return -111; 902 | } 903 | 904 | for( SqlActionColumn c : t.columnList ) { 905 | selectColumnTokenForAdvancedMode = new SqlActionSelectColumnTokenForAdvancedMode() ; 906 | selectColumnTokenForAdvancedMode.table = t ; 907 | selectColumnTokenForAdvancedMode.columnName = c.columnName ; 908 | selectColumnTokenForAdvancedMode.column = c ; 909 | selectColumnTokenForAdvancedModeList.add(selectColumnTokenForAdvancedMode); 910 | } 911 | } else { 912 | selectColumnTokenForAdvancedMode = new SqlActionSelectColumnTokenForAdvancedMode() ; 913 | selectColumnTokenForAdvancedMode.table = SqlActionTable.findTableByJavaSauClassName( database.tableList, javaSauClassName ) ; 914 | if( selectColumnTokenForAdvancedMode.table == null ) { 915 | System.out.println( "\t" + "*** ERROR : javaSauClassName["+javaSauClassName+"] not found" ); 916 | return -112; 917 | } 918 | selectColumnTokenForAdvancedMode.columnName = javaPropertyName ; 919 | if( selectColumnTokenForAdvancedMode.columnName.equals(SqlActionGencode.SAO_PROPERTY_COUNT_) ) { 920 | selectColumnTokenForAdvancedMode.column = null ; 921 | } else { 922 | selectColumnTokenForAdvancedMode.column = SqlActionColumn.findColumnByJavaPropertyName( selectColumnTokenForAdvancedMode.table.columnList, javaPropertyName ) ; 923 | if( selectColumnTokenForAdvancedMode.column == null ) { 924 | System.out.println( "\t" + "*** ERROR : javaPropertyName["+javaPropertyName+"] not found in javaSaoClassName["+javaSauClassName+"]" ); 925 | return -113; 926 | } 927 | } 928 | selectColumnTokenForAdvancedModeList.add(selectColumnTokenForAdvancedMode); 929 | } 930 | } else { 931 | selectColumnTokenForAdvancedMode = new SqlActionSelectColumnTokenForAdvancedMode() ; 932 | selectColumnTokenForAdvancedMode.javaClassName = javaSauClassName ; 933 | selectColumnTokenForAdvancedMode.javaObjectName = javaSauClassName.substring(0,1).toLowerCase(Locale.getDefault()) + javaSauClassName.substring(1) ; 934 | selectColumnTokenForAdvancedMode.javaPropertyName = javaPropertyName ; 935 | selectColumnTokenForAdvancedMode.javaPropertyType = javaPropertyType.substring(0,1).toUpperCase(Locale.getDefault()) + javaPropertyType.substring(1) ; 936 | selectColumnTokenForAdvancedModeList.add(selectColumnTokenForAdvancedMode); 937 | 938 | boolean needAdd = true ; 939 | for( SqlActionOtherClassTokenForAdvancedMode oc : otherClassTokenForAdvancedModeList ) { 940 | if( oc.javaClassName.equals(selectColumnTokenForAdvancedMode.javaClassName) ) { 941 | needAdd = false ; 942 | break; 943 | } 944 | } 945 | if( needAdd ) { 946 | SqlActionOtherClassTokenForAdvancedMode otherClassTokenForAdvancedMode = new SqlActionOtherClassTokenForAdvancedMode() ; 947 | otherClassTokenForAdvancedMode.javaClassName = selectColumnTokenForAdvancedMode.javaClassName ; 948 | otherClassTokenForAdvancedMode.javaObjectName = selectColumnTokenForAdvancedMode.javaObjectName ; 949 | otherClassTokenForAdvancedModeList.add(otherClassTokenForAdvancedMode); } 950 | } 951 | } 952 | } else if( sqlStatement == SqlActionStatementEnum.SQLACTION_STATEMENT_WHERE || sqlStatement == SqlActionStatementEnum.SQLACTION_STATEMENT_SET ) { 953 | int beginPos = token.indexOf("#{") ; 954 | if( beginPos >= 0 ) { 955 | int endPos = token.indexOf("}") ; 956 | if( endPos < 0 ) { 957 | System.out.println( "expect '}' in '"+token+"'" ); 958 | return -121; 959 | } 960 | 961 | int dotPos = token.indexOf(".",beginPos+2) ; 962 | if( dotPos < 0 ) { 963 | System.out.println( "expect '}' in '"+token+"'" ); 964 | return -122; 965 | } 966 | 967 | whereColumnTokenForAdvancedMode = new SqlActionWhereColumnTokenForAdvancedMode() ; 968 | String javaSauClassName = token.substring( beginPos+2, dotPos ) ; 969 | String javaPropertyName = token.substring( dotPos+1, endPos ) ; 970 | whereColumnTokenForAdvancedMode.table = SqlActionTable.findTableByJavaSauClassName( database.tableList, javaSauClassName ) ; 971 | if( whereColumnTokenForAdvancedMode.table == null ) { 972 | System.out.println( "\t" + "*** ERROR : javaSauClassName["+javaSauClassName+"] not found" ); 973 | return -123; 974 | } 975 | whereColumnTokenForAdvancedMode.column = SqlActionColumn.findColumnByJavaPropertyName( whereColumnTokenForAdvancedMode.table.columnList, javaPropertyName ) ; 976 | if( whereColumnTokenForAdvancedMode.column == null ) { 977 | System.out.println( "\t" + "*** ERROR : javaPropertyName["+javaPropertyName+"] not found in javaSaoClassName["+javaSauClassName+"]" ); 978 | return -124; 979 | } 980 | whereColumnTokenForAdvancedModeList.add(whereColumnTokenForAdvancedMode); 981 | } 982 | } 983 | } 984 | } 985 | 986 | return 0; 987 | } 988 | } 989 | -------------------------------------------------------------------------------- /src/main/java/xyz/calvinwilliams/sqlaction/SqlActionTable.java: -------------------------------------------------------------------------------- 1 | /* 2 | * sqlaction - SQL action object auto-gencode tool based JDBC for Java 3 | * author : calvin 4 | * email : calvinwilliams@163.com 5 | * 6 | * See the file LICENSE in base directory. 7 | */ 8 | 9 | package xyz.calvinwilliams.sqlaction; 10 | 11 | import java.sql.*; 12 | import java.util.*; 13 | 14 | public class SqlActionTable { 15 | String tableName ; 16 | List columnList ; 17 | SqlActionColumn primaryKey ; 18 | List indexList ; 19 | 20 | String javaSaoClassName ; 21 | String javaSauClassName ; 22 | String javaSaoFileName ; 23 | String javaSauFileName ; 24 | String javaObjectName ; 25 | 26 | public static SqlActionTable fetchTableMetadataInDatabase( DbServerConf dbserverConf, SqlActionConf sqlactionConf, Connection conn, SqlActionDatabase database, SqlActionTable tableCache, String tableName ) throws Exception { 27 | SqlActionTable table ; 28 | PreparedStatement prestmt = null ; 29 | ResultSet rs ; 30 | String tableType ; 31 | int nret = 0 ; 32 | 33 | if( tableCache != null ) { 34 | if( tableName.equalsIgnoreCase(tableCache.tableName) ) 35 | return tableCache; 36 | } 37 | 38 | table = findTable( database.tableList, tableName ) ; 39 | if( table != null ) 40 | return table; 41 | 42 | if( dbserverConf.dbms == SqlActionDatabase.DBMS_MYSQL ) { 43 | prestmt = conn.prepareStatement("SELECT table_name,table_type FROM information_schema.TABLES WHERE table_schema=? AND table_name=?") ; 44 | prestmt.setString( 1, database.databaseName ); 45 | prestmt.setString( 2, tableName ); 46 | } else if( dbserverConf.dbms == SqlActionDatabase.DBMS_POSTGRESQL ) { 47 | prestmt = conn.prepareStatement("SELECT table_name,table_type FROM information_schema.TABLES WHERE table_catalog=? AND table_name=?") ; 48 | prestmt.setString( 1, database.databaseName ); 49 | prestmt.setString( 2, tableName ); 50 | } else if( dbserverConf.dbms == SqlActionDatabase.DBMS_ORACLE ) { 51 | prestmt = conn.prepareStatement("SELECT table_name FROM user_tables WHERE table_name=?") ; 52 | prestmt.setString( 1, tableName ); 53 | } else if( dbserverConf.dbms == SqlActionDatabase.DBMS_SQLITE ) { 54 | prestmt = conn.prepareStatement("SELECT name,type FROM sqlite_master WHERE name=?") ; 55 | prestmt.setString( 1, tableName ); 56 | } else if( dbserverConf.dbms == SqlActionDatabase.DBMS_SQLSERVER ) { 57 | prestmt = conn.prepareStatement("SELECT table_name,table_type FROM INFORMATION_SCHEMA.TABLES WHERE table_catalog=? AND table_name=?") ; 58 | prestmt.setString( 1, database.databaseName ); 59 | prestmt.setString( 2, tableName ); 60 | } 61 | rs = prestmt.executeQuery() ; 62 | if( dbserverConf.dbms == SqlActionDatabase.DBMS_MYSQL ) { 63 | } else if( dbserverConf.dbms == SqlActionDatabase.DBMS_POSTGRESQL ) { 64 | } else if( dbserverConf.dbms == SqlActionDatabase.DBMS_ORACLE ) { 65 | if( rs.getRow() < 1 ) { 66 | System.out.println( "*** ERROR : GetAllColumnsInTable table not found , database["+database.databaseName+"] table["+tableName+"]" ); 67 | return null; 68 | } 69 | } else if( dbserverConf.dbms == SqlActionDatabase.DBMS_SQLITE ) { 70 | } else if( dbserverConf.dbms == SqlActionDatabase.DBMS_SQLSERVER ) { 71 | } 72 | rs.next(); 73 | 74 | table = new SqlActionTable() ; 75 | table.tableName = rs.getString(1) ; 76 | if( dbserverConf.dbms == SqlActionDatabase.DBMS_MYSQL ) { 77 | tableType = rs.getString(2) ; 78 | if( ! tableType.equalsIgnoreCase("BASE TABLE") ) 79 | return null; 80 | } else if( dbserverConf.dbms == SqlActionDatabase.DBMS_POSTGRESQL ) { 81 | tableType = rs.getString(2) ; 82 | if( ! tableType.equalsIgnoreCase("BASE TABLE") ) 83 | return null; 84 | } else if( dbserverConf.dbms == SqlActionDatabase.DBMS_ORACLE ) { 85 | ; 86 | } else if( dbserverConf.dbms == SqlActionDatabase.DBMS_SQLITE ) { 87 | tableType = rs.getString(2) ; 88 | if( ! tableType.equalsIgnoreCase("table") ) 89 | return null; 90 | } else if( dbserverConf.dbms == SqlActionDatabase.DBMS_SQLSERVER ) { 91 | tableType = rs.getString(2) ; 92 | if( ! tableType.equalsIgnoreCase("BASE TABLE") ) 93 | return null; 94 | } 95 | database.tableList.add( table ); 96 | 97 | rs.close(); 98 | 99 | nret = SqlActionColumn.fetchAllColumnsMetadataInTable( dbserverConf, sqlactionConf, conn, database, table ) ; 100 | if( nret != 0 ) { 101 | System.out.println( "GetAllColumnsInTable failed["+nret+"] , database["+database.databaseName+"] table["+table.tableName+"]" ); 102 | return null; 103 | } 104 | 105 | nret = SqlActionIndex.fetchAllIndexesMetadataInTable( dbserverConf, sqlactionConf, conn, database, table ) ; 106 | if( nret != 0 ) { 107 | System.out.println( "GetAllIndexesInTable failed["+nret+"] , database["+database.databaseName+"] table["+table.tableName+"]" ); 108 | return null; 109 | } 110 | 111 | String[] sa = table.tableName.split( "_" ) ; 112 | StringBuilder sb = new StringBuilder() ; 113 | for( String s : sa ) { 114 | sb.append( s.substring(0,1).toUpperCase(Locale.getDefault()) + s.substring(1) ); 115 | } 116 | table.javaSaoClassName = sb.toString() + "SAO" ; 117 | table.javaSauClassName = sb.toString() + "SAU" ; 118 | table.javaSaoFileName = table.javaSaoClassName + ".java" ; 119 | table.javaSauFileName = table.javaSauClassName + ".java" ; 120 | table.javaObjectName = sb.toString().substring(0,1).toLowerCase(Locale.getDefault()) + sb.toString().substring(1) ; 121 | 122 | travelTable( dbserverConf, sqlactionConf, database, tableName, 1 ); 123 | 124 | return table; 125 | } 126 | 127 | public static int travelTable( DbServerConf dbserverConf, SqlActionConf sqlactionConf, SqlActionDatabase database, String tableName, int depth ) { 128 | for( SqlActionTable t : database.tableList ) { 129 | if( ! t.tableName.equalsIgnoreCase(tableName) ) 130 | continue; 131 | 132 | for( int n = 0 ; n < depth ; n++ ) 133 | System.out.print( "\t" ); 134 | System.out.println( "tableName["+t.tableName+"] primaryKey["+(t.primaryKey==null?"null":t.primaryKey.columnName)+"] javaObjectName["+t.javaObjectName+"]" ); 135 | 136 | SqlActionColumn.travelAllColumnsMetadata( dbserverConf, sqlactionConf, t.columnList, depth+1 ); 137 | 138 | SqlActionIndex.travelAllIndexesMetadata( dbserverConf, sqlactionConf, t.indexList, depth+1 ); 139 | } 140 | 141 | return 0; 142 | } 143 | 144 | public static SqlActionTable findTable( List sqlactionTableList, String tableName ) { 145 | for( SqlActionTable t : sqlactionTableList ) { 146 | if( t.tableName.equalsIgnoreCase(tableName) ) 147 | return t; 148 | } 149 | 150 | return null; 151 | } 152 | 153 | public static SqlActionTable findTableByJavaSaoClassName( List sqlactionTableList, String javaSaoClassName ) { 154 | for( SqlActionTable t : sqlactionTableList ) { 155 | if( t.javaSaoClassName.equalsIgnoreCase(javaSaoClassName) ) 156 | return t; 157 | } 158 | 159 | return null; 160 | } 161 | 162 | public static SqlActionTable findTableByJavaSauClassName( List sqlactionTableList, String javaSauClassName ) { 163 | for( SqlActionTable t : sqlactionTableList ) { 164 | if( t.javaSauClassName.equalsIgnoreCase(javaSauClassName) ) 165 | return t; 166 | } 167 | 168 | return null; 169 | } 170 | } 171 | -------------------------------------------------------------------------------- /src/main/java/xyz/calvinwilliams/sqlaction/SqlActionUtil.java: -------------------------------------------------------------------------------- 1 | /* 2 | * sqlaction - SQL action object auto-gencode tool based JDBC for Java 3 | * author : calvin 4 | * email : calvinwilliams@163.com 5 | * 6 | * See the file LICENSE in base directory. 7 | */ 8 | 9 | package xyz.calvinwilliams.sqlaction; 10 | 11 | public class SqlActionUtil { 12 | 13 | final static char[] _8tabsArray = "\t\t\t\t\t\t\t\t".toCharArray() ; 14 | 15 | private static int wildcardMatchMultiChar( char[] wildcard, int wildcardOffset, int wildcardLength, char[] str, int strOffset, int strLength ) { 16 | int matchDestOffset = strOffset ; 17 | int nret = 0 ; 18 | 19 | while( matchDestOffset < strLength ) { 20 | if( str[matchDestOffset] == wildcard[wildcardOffset] ) { 21 | nret = wildcardMatchChar( wildcard, wildcardOffset, wildcardLength, str, matchDestOffset, strLength ) ; 22 | if( nret == 0 ) 23 | return nret; 24 | } 25 | 26 | matchDestOffset++; 27 | } 28 | 29 | return 1; 30 | } 31 | 32 | private static int wildcardMatchChar( char[] wildcard, int wildcardOffset, int wildcardLength, char[] str, int strOffset, int strLength ) { 33 | while(true) { 34 | if( wildcardOffset == wildcardLength && strOffset == strLength ) 35 | return 0; 36 | if( wildcardOffset == wildcardLength ) 37 | return 1; 38 | 39 | if( wildcard[wildcardOffset] == '*' ) { 40 | wildcardOffset++; 41 | while( wildcardOffset < wildcardLength && ( wildcard[wildcardOffset] == '*' || wildcard[wildcardOffset] == '?' ) && strOffset < strLength ) { 42 | wildcardOffset++; 43 | } 44 | 45 | if( wildcardOffset == wildcardLength ) 46 | return 0; 47 | 48 | return wildcardMatchMultiChar( wildcard, wildcardOffset, wildcardLength, str, strOffset, strLength ); 49 | } else if( wildcard[wildcardOffset] == '?' ) { 50 | wildcardOffset++; 51 | strOffset++; 52 | while( wildcardOffset < wildcardLength && wildcard[wildcardOffset] == '?' && strOffset < strLength ) { 53 | wildcardOffset++; 54 | strOffset++; 55 | } 56 | } else { 57 | if( wildcard[wildcardOffset] != str[strOffset] ) 58 | return 1; 59 | wildcardOffset++; 60 | strOffset++; 61 | } 62 | } 63 | } 64 | 65 | public static int wildcardMatch( String wildcard, String str ) { 66 | return wildcardMatchChar( wildcard.toCharArray(), 0, wildcard.length(), str.toCharArray(), 0, str.length() ); 67 | } 68 | 69 | public static String sqlConvertToMethodName( String sql ) { 70 | sql = sql.replaceAll( "<>", "_NE_" ) ; 71 | sql = sql.replaceAll( ">=", "_GE_" ) ; 72 | sql = sql.replaceAll( "<=", "_LE_" ) ; 73 | sql = sql.replaceAll( ">", "_GT_" ) ; 74 | sql = sql.replaceAll( "<", "_LT_" ) ; 75 | sql = sql.replaceAll( "=", "_E_" ) ; 76 | 77 | sql = sql.replaceAll( "\\/\\*", "_HT_" ) ; 78 | sql = sql.replaceAll( "\\*\\/", "_TH_" ) ; 79 | sql = sql.replaceAll( "\\*", "_ALL_" ) ; 80 | sql = sql.replaceAll( "\\.", "_O_" ) ; 81 | sql = sql.replaceAll( ",", "_j_" ) ; 82 | 83 | char[] charArray = sql.toCharArray() ; 84 | int strLength = sql.length() ; 85 | for( int i = 0 ; i < strLength ; i++ ) { 86 | if( ! Character.isLetterOrDigit(charArray[i]) ) { 87 | charArray[i] = '_' ; 88 | } 89 | } 90 | sql = new String( charArray ); 91 | 92 | while(true) { 93 | String sql2 = sql.replaceAll( "_+", "_" ) ; 94 | if( sql2.length() == sql.length() ) { 95 | sql = sql2 ; 96 | break; 97 | } else { 98 | sql = sql2 ; 99 | } 100 | } 101 | 102 | return sql; 103 | } 104 | 105 | public static int indexOfWord( String str, String word ) { 106 | int offset = 0 ; 107 | int pos ; 108 | int pos2 ; 109 | 110 | while(true) { 111 | pos = str.indexOf( word, offset ) ; 112 | if( pos == -1 ) 113 | return -1; 114 | pos2 = pos + word.length() - 1 ; 115 | if( 116 | ( pos == 0 || ( pos > 0 && " \t\r\n".indexOf(str.charAt(pos-1))>=0 ) ) 117 | && 118 | ( pos2 == str.length()-1 || ( pos2 < str.length()-1 && " \t\r\n".indexOf(str.charAt(pos2+1))>=0 ) ) 119 | ) 120 | return pos; 121 | else 122 | offset = pos + 1 ; 123 | } 124 | } 125 | } 126 | -------------------------------------------------------------------------------- /src/main/java/xyz/calvinwilliams/sqlaction/SqlActionWhereColumnToken.java: -------------------------------------------------------------------------------- 1 | /* 2 | * sqlaction - SQL action object auto-gencode tool based JDBC for Java 3 | * author : calvin 4 | * email : calvinwilliams@163.com 5 | * 6 | * See the file LICENSE in base directory. 7 | */ 8 | 9 | package xyz.calvinwilliams.sqlaction; 10 | 11 | public class SqlActionWhereColumnToken { 12 | 13 | public String operator = null ; 14 | public String tableName = null ; 15 | public SqlActionTable table = null ; 16 | public String columnName = null ; 17 | public SqlActionColumn column = null ; 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/xyz/calvinwilliams/sqlaction/SqlActionWhereColumnTokenForAdvancedMode.java: -------------------------------------------------------------------------------- 1 | package xyz.calvinwilliams.sqlaction; 2 | 3 | public class SqlActionWhereColumnTokenForAdvancedMode { 4 | 5 | public SqlActionTable table ; 6 | public SqlActionColumn column ; 7 | } 8 | -------------------------------------------------------------------------------- /src/test/java/dbserver(mysql).conf.json: -------------------------------------------------------------------------------- 1 | { 2 | "driver" : "com.mysql.jdbc.Driver" , 3 | "url" : "jdbc:mysql://127.0.0.1:3306/calvindb?serverTimezone=GMT" , 4 | "user" : "root" , 5 | "pwd" : "root" , 6 | "userDefineDataTypes" : [ 7 | { "source":"decimal,*,12,2" , "redefine":"double,*,14,*" } 8 | ] 9 | } 10 | -------------------------------------------------------------------------------- /src/test/java/dbserver(oracle).conf.json: -------------------------------------------------------------------------------- 1 | { 2 | "driver" : "oracle.jdbc.driver.OracleDriver" , 3 | "url" : "jdbc:oracle:thin:@//127.0.0.1:1521/calvindb" , 4 | "user" : "calvin" , 5 | "pwd" : "calvin" , 6 | "userDefineDataTypes" : [ 7 | { "source":"numeric,*,12,2" , "redefine":"double precision,*,14,*" } 8 | ] 9 | } 10 | -------------------------------------------------------------------------------- /src/test/java/dbserver(postgresql).conf.json: -------------------------------------------------------------------------------- 1 | { 2 | "driver" : "org.postgresql.Driver" , 3 | "url" : "jdbc:postgresql://127.0.0.1:5432/calvindb" , 4 | "user" : "postgres" , 5 | "pwd" : "postgres" , 6 | "userDefineDataTypes" : [ 7 | { "source":"numeric,*,12,2" , "redefine":"double precision,*,14,*" } 8 | ] 9 | } 10 | -------------------------------------------------------------------------------- /src/test/java/dbserver(sqlite).conf.json: -------------------------------------------------------------------------------- 1 | { 2 | "driver" : "org.sqlite.JDBC" , 3 | "url" : "jdbc:sqlite:D:\\Work\\sqlite-3.28-win-x64\\test\\test.db" , 4 | "user" : "root" , 5 | "pwd" : "root" , 6 | "userDefineDataTypes" : [ 7 | { "source":"NUMERIC,*,12,2" , "redefine":"REAL,*,14,*" } 8 | ] 9 | } 10 | -------------------------------------------------------------------------------- /src/test/java/dbserver(sqlserver).conf.json: -------------------------------------------------------------------------------- 1 | { 2 | "driver" : "com.microsoft.sqlserver.jdbc.SQLServerDriver" , 3 | "url" : "jdbc:sqlserver://localhost:1433;DatabaseName=calvindb" , 4 | "user" : "calvin" , 5 | "pwd" : "calvin" , 6 | "userDefineDataTypes" : [ 7 | { "source":"numeric,*,12,2" , "redefine":"float,*,14,*" } 8 | ] 9 | } 10 | -------------------------------------------------------------------------------- /src/test/java/dbserver.conf.json: -------------------------------------------------------------------------------- 1 | { 2 | "driver" : "com.mysql.jdbc.Driver" , 3 | "url" : "jdbc:mysql://127.0.0.1:3306/calvindb?serverTimezone=GMT" , 4 | "user" : "root" , 5 | "pwd" : "root" , 6 | "userDefineDataTypes" : [ 7 | { "source":"decimal,*,12,2" , "redefine":"double,*,14,*" } 8 | ] 9 | } 10 | -------------------------------------------------------------------------------- /src/test/java/xyz/calvinwilliams/test/SqlActionTest.java: -------------------------------------------------------------------------------- 1 | /* 2 | * sqlaction - SQL action object auto-gencode tool based JDBC for Java 3 | * author : calvin 4 | * email : calvinwilliams@163.com 5 | * 6 | * See the file LICENSE in base directory. 7 | */ 8 | 9 | package xyz.calvinwilliams.test; 10 | 11 | import java.sql.Connection; 12 | import java.sql.DriverManager; 13 | import java.sql.SQLException; 14 | import java.util.*; 15 | 16 | import xyz.calvinwilliams.okjson.OKJSON; 17 | 18 | //INSERT INTO user_order VALUES(1,1,"item_name1",100,10000); 19 | //INSERT INTO user_order VALUES(2,1,"item_name2",100,10000); 20 | //INSERT INTO user_order VALUES(3,1,"item_name3",100,10000); 21 | //INSERT INTO user_order VALUES(4,1,"item_name4",100,10000); 22 | //INSERT INTO user_order VALUES(5,1,"item_name5",100,10000); 23 | //INSERT INTO user_order VALUES(6,1,"item_name6",100,10000); 24 | //INSERT INTO user_order VALUES(7,1,"item_name7",100,10000); 25 | //INSERT INTO user_order VALUES(8,1,"item_name8",100,10000); 26 | //INSERT INTO user_order VALUES(9,1,"item_name9",100,10000); 27 | //INSERT INTO user_order VALUES(10,1,"item_name10",100,10000); 28 | 29 | public class SqlActionTest { 30 | 31 | double minTotalPrice ; 32 | double maxTotalPrice ; 33 | 34 | public static int testSelectTable( Connection conn ) { 35 | 36 | List userList = null ; 37 | List userListForSelectOutput = null ; 38 | List userOrderListForSelectOutput = null ; 39 | int nret = 0 ; 40 | 41 | try { 42 | userList = new LinkedList() ; 43 | nret = UserBaseSAU.SELECT_ALL_FROM_user_base( conn, userList ) ; 44 | if( nret < 0 ) { 45 | System.out.println( "\t" + "SELECT_ALL_FROM_user_base failed["+nret+"]" ); 46 | return -11; 47 | } else { 48 | System.out.println( "\t" + "SELECT_ALL_FROM_user_base ok , ["+userList.size()+"]records" ); 49 | } 50 | 51 | for( UserBaseSAU u : userList ) { 52 | System.out.println( "\t\t" + "id["+u.id+"] name["+u.name+"] gender["+u.gender+"] age["+u.age+"] address["+u.address+"] lvl["+u.lvl+"]" ); 53 | } 54 | 55 | userList = new LinkedList() ; 56 | nret = UserBaseSAU.SELECT_ALL_FROM_user_base_WHERE_name_E_( conn, userList, "Calvin" ) ; 57 | if( nret < 0 ) { 58 | System.out.println( "\t" + "SELECT_ALL_FROM_user_base_WHERE_name_E_ failed["+nret+"]" ); 59 | return -12; 60 | } else { 61 | System.out.println( "\t" + "SELECT_ALL_FROM_user_base_WHERE_name_E_ ok , ["+userList.size()+"]records" ); 62 | } 63 | 64 | for( UserBaseSAU u : userList ) { 65 | System.out.println( "\t\t" + "id["+u.id+"] name["+u.name+"] gender["+u.gender+"] age["+u.age+"] address["+u.address+"] lvl["+u.lvl+"]" ); 66 | } 67 | 68 | userList = new LinkedList() ; 69 | nret = UserBaseSAU.SELECT_name_j_address_FROM_user_base_WHERE_age_LE_AND_gender_E_( conn, userList, (short)3, "M" ) ; 70 | if( nret < 0 ) { 71 | System.out.println( "\t" + "SELECT_name_j_address_FROM_user_base_WHERE_age_LE_AND_gender_E_ failed["+nret+"]" ); 72 | return -13; 73 | } else { 74 | System.out.println( "\t" + "SELECT_name_j_address_FROM_user_base_WHERE_age_LE_AND_gender_E_ ok , ["+userList.size()+"]records" ); 75 | } 76 | 77 | for( UserBaseSAU u : userList ) { 78 | System.out.println( "\t\t" + "id["+u.id+"] name["+u.name+"] gender["+u.gender+"] age["+u.age+"] address["+u.address+"] lvl["+u.lvl+"]" ); 79 | } 80 | 81 | userList = new LinkedList() ; 82 | nret = UserBaseSAU.SELECT_ALL_FROM_user_base_ORDER_BY_name_DESC( conn, userList ) ; 83 | if( nret < 0 ) { 84 | System.out.println( "\t" + "SELECT_ALL_FROM_user_base_ORDER_BY_name_DESC failed["+nret+"]" ); 85 | return -14; 86 | } else { 87 | System.out.println( "\t" + "SELECT_ALL_FROM_user_base_ORDER_BY_name_DESC ok , ["+userList.size()+"]records" ); 88 | } 89 | 90 | for( UserBaseSAU u : userList ) { 91 | System.out.println( "\t\t" + "id["+u.id+"] name["+u.name+"] gender["+u.gender+"] age["+u.age+"] address["+u.address+"] lvl["+u.lvl+"] _count_["+u._count_+"]" ); 92 | } 93 | 94 | userList = new LinkedList() ; 95 | nret = UserBaseSAU.SELECT_gender_j_count_ALL_FROM_user_base_GROUP_BY_gender( conn, userList ) ; 96 | if( nret < 0 ) { 97 | System.out.println( "\t" + "SELECT_gender_j_count_ALL_FROM_user_base_GROUP_BY_gender failed["+nret+"]" ); 98 | return -14; 99 | } else { 100 | System.out.println( "\t" + "SELECT_gender_j_count_ALL_FROM_user_base_GROUP_BY_gender ok , ["+userList.size()+"]records" ); 101 | } 102 | 103 | for( UserBaseSAU u : userList ) { 104 | System.out.println( "\t\t" + "id["+u.id+"] name["+u.name+"] gender["+u.gender+"] age["+u.age+"] address["+u.address+"] lvl["+u.lvl+"] _count_["+u._count_+"]" ); 105 | } 106 | 107 | userListForSelectOutput = new LinkedList() ; 108 | userOrderListForSelectOutput = new LinkedList() ; 109 | nret = UserOrderSAU.queryUserAndOrderByName( conn, userListForSelectOutput, userOrderListForSelectOutput, "Calvin" ) ; 110 | if( nret < 0 ) { 111 | System.out.println( "\t" + "queryUserAndOrderByName failed["+nret+"]" ); 112 | return -21; 113 | } else { 114 | System.out.println( "\t" + "queryUserAndOrderByName ok , ["+userListForSelectOutput.size()+"]records" ); 115 | } 116 | 117 | for( UserBaseSAU u : userListForSelectOutput ) { 118 | System.out.println( "\t\t" + "id["+u.id+"] name["+u.name+"] gender["+u.gender+"] age["+u.age+"] address["+u.address+"] lvl["+u.lvl+"]" ); 119 | } 120 | for( UserOrderSAU o : userOrderListForSelectOutput ) { 121 | System.out.println( "\t\t" + "id["+o.id+"] userId["+o.userId+"] itemName["+o.itemName+"] amount["+o.amount+"] totalPrice["+o.totalPrice+"]" ); 122 | } 123 | 124 | userListForSelectOutput = new LinkedList() ; 125 | userOrderListForSelectOutput = new LinkedList() ; 126 | nret = UserOrderSAU.SELECT_u_O_name_j_u_O_address_j_o_O_ALL_FROM_user_base_u_j_user_order_o_WHERE_u_O_name_E_AND_u_O_id_E_o_O_user_id( conn, userListForSelectOutput, userOrderListForSelectOutput, "Calvin" ) ; 127 | if( nret < 0 ) { 128 | System.out.println( "\t" + "SELECT_u_O_name_j_u_O_address_j_o_O_ALL_FROM_user_base_u_j_user_order_o_WHERE_u_O_name_E_AND_u_O_id_E_o_O_user_id failed["+nret+"]" ); 129 | return -22; 130 | } else { 131 | System.out.println( "\t" + "SELECT_u_O_name_j_u_O_address_j_o_O_ALL_FROM_user_base_u_j_user_order_o_WHERE_u_O_name_E_AND_u_O_id_E_o_O_user_id ok , ["+userListForSelectOutput.size()+"]records" ); 132 | } 133 | 134 | for( UserBaseSAU u : userListForSelectOutput ) { 135 | System.out.println( "\t\t" + "id["+u.id+"] name["+u.name+"] gender["+u.gender+"] age["+u.age+"] address["+u.address+"] lvl["+u.lvl+"]" ); 136 | } 137 | for( UserOrderSAU o : userOrderListForSelectOutput ) { 138 | System.out.println( "\t\t" + "id["+o.id+"] userId["+o.userId+"] itemName["+o.itemName+"] amount["+o.amount+"] totalPrice["+o.totalPrice+"]" ); 139 | } 140 | 141 | userOrderListForSelectOutput = new LinkedList() ; 142 | List sqlActionTestListForSelectOutput = new LinkedList() ; 143 | nret = UserOrderSAU.SELECT_MIN_total_price_j_MAX_total_price_j_COUNT_ALL_FROM_user_order( conn, userOrderListForSelectOutput, sqlActionTestListForSelectOutput ) ; 144 | if( nret < 0 ) { 145 | System.out.println( "\t" + "SELECT_MIN_total_price_j_MAX_total_price_j_COUNT_ALL_FROM_user_order failed["+nret+"]" ); 146 | return -22; 147 | } else { 148 | System.out.println( "\t" + "SELECT_MIN_total_price_j_MAX_total_price_j_COUNT_ALL_FROM_user_order ok , ["+userOrderListForSelectOutput.size()+"]records" ); 149 | } 150 | 151 | for( UserOrderSAU o : userOrderListForSelectOutput ) { 152 | System.out.println( "\t\t" + "_count_["+o._count_+"]" ); 153 | } 154 | for( SqlActionTest t : sqlActionTestListForSelectOutput ) { 155 | System.out.println( "\t\t" + "minTotalPrice["+t.minTotalPrice+"] maxTotalPrice["+t.maxTotalPrice+"]" ); 156 | } 157 | 158 | userListForSelectOutput = new LinkedList() ; 159 | userOrderListForSelectOutput = new LinkedList() ; 160 | nret = UserOrderSAU.statUsersAmountAndTotalPrice( conn, userListForSelectOutput, userOrderListForSelectOutput, 0 ) ; 161 | if( nret < 0 ) { 162 | System.out.println( "\t" + "statUsersAmountAndTotalPrice failed["+nret+"]" ); 163 | return -22; 164 | } else { 165 | System.out.println( "\t" + "statUsersAmountAndTotalPrice ok , ["+userListForSelectOutput.size()+"]records" ); 166 | } 167 | 168 | for( UserBaseSAU u : userListForSelectOutput ) { 169 | System.out.println( "\t\t" + "id["+u.id+"] name["+u.name+"] gender["+u.gender+"] age["+u.age+"] address["+u.address+"] lvl["+u.lvl+"]" ); 170 | } 171 | for( UserOrderSAU o : userOrderListForSelectOutput ) { 172 | System.out.println( "\t\t" + "id["+o.id+"] userId["+o.userId+"] itemName["+o.itemName+"] amount["+o.amount+"] totalPrice["+o.totalPrice+"]" ); 173 | } 174 | 175 | for( int pageNum=1 ; ; pageNum++ ) { 176 | userOrderListForSelectOutput = new LinkedList() ; 177 | nret = UserOrderSAU.SELECT_ALL_FROM_user_order_PAGEKEY_id( conn, userOrderListForSelectOutput, 3, pageNum ) ; 178 | if( nret < 0 ) { 179 | System.out.println( "\t" + "SELECT_ALL_FROM_user_order_PAGEKEY_id failed["+nret+"]" ); 180 | return -23; 181 | } else { 182 | System.out.println( "\t" + "SELECT_ALL_FROM_user_order_PAGEKEY_id ok , ["+userOrderListForSelectOutput.size()+"]records" ); 183 | if( userOrderListForSelectOutput.size() == 0 ) 184 | break; 185 | for( UserOrderSAU o : userOrderListForSelectOutput ) { 186 | System.out.println( "\t\t" + "id["+o.id+"] userId["+o.userId+"] itemName["+o.itemName+"] amount["+o.amount+"] totalPrice["+o.totalPrice+"]" ); 187 | } 188 | } 189 | } 190 | 191 | for( int pageNum=1 ; ; pageNum++ ) { 192 | userOrderListForSelectOutput = new LinkedList() ; 193 | nret = UserOrderSAU.SELECT_ALL_FROM_user_order_WHERE_item_name_NE__PAGEKEY_id( conn, userOrderListForSelectOutput, 3, pageNum ) ; 194 | if( nret < 0 ) { 195 | System.out.println( "\t" + "SELECT_ALL_FROM_user_order_WHERE_item_name_NE__PAGEKEY_id failed["+nret+"]" ); 196 | return -24; 197 | } else { 198 | System.out.println( "\t" + "SELECT_ALL_FROM_user_order_WHERE_item_name_NE__PAGEKEY_id ok , ["+userOrderListForSelectOutput.size()+"]records" ); 199 | if( userOrderListForSelectOutput.size() == 0 ) 200 | break; 201 | for( UserOrderSAU o : userOrderListForSelectOutput ) { 202 | System.out.println( "\t\t" + "id["+o.id+"] userId["+o.userId+"] itemName["+o.itemName+"] amount["+o.amount+"] totalPrice["+o.totalPrice+"]" ); 203 | } 204 | } 205 | } 206 | } catch (Exception e) { 207 | e.printStackTrace(); 208 | return -1; 209 | } 210 | 211 | return 0; 212 | } 213 | 214 | public static int testInsertTable( Connection conn ) { 215 | 216 | UserBaseSAU user = null ; 217 | List userList = null ; 218 | UserOrderSAU userOrder = null ; 219 | int nret = 0 ; 220 | 221 | try { 222 | user = new UserBaseSAU() ; 223 | user.name = "Calvin" ; 224 | user.gender = "M" ; 225 | user.age = 30 ; 226 | user.address = "Calvin address" ; 227 | user.lvl = 8 ; 228 | nret = UserBaseSAU.INSERT_INTO_user_base( conn, user ) ; 229 | if( nret <= 0 ) { 230 | System.out.println( "\t" + "INSERT_INTO_user_base failed["+nret+"]" ); 231 | return -11; 232 | } else { 233 | System.out.println( "\t" + "INSERT_INTO_user_base ok , rows["+nret+"] effected , id["+user.id+"]" ); 234 | } 235 | 236 | user = new UserBaseSAU() ; 237 | user.name = "Dozimoyi" ; 238 | user.gender = "F" ; 239 | user.age = 20 ; 240 | user.address = "Dozimoyi address" ; 241 | user.lvl = 7 ; 242 | nret = UserBaseSAU.INSERT_INTO_user_base( conn, user ) ; 243 | if( nret <= 0 ) { 244 | System.out.println( "\t" + "INSERT_INTO_user_base failed["+nret+"]" ); 245 | return -12; 246 | } else { 247 | System.out.println( "\t" + "INSERT_INTO_user_base ok , rows["+nret+"] effected , id["+user.id+"]" ); 248 | } 249 | 250 | user = new UserBaseSAU() ; 251 | user.name = "Mark" ; 252 | user.gender = "M" ; 253 | user.age = 3 ; 254 | user.address = "Mark address" ; 255 | user.lvl = 2 ; 256 | nret = UserBaseSAU.INSERT_INTO_user_base( conn, user ) ; 257 | if( nret <= 0 ) { 258 | System.out.println( "\t" + "INSERT_INTO_user_base failed["+nret+"]" ); 259 | return -13; 260 | } else { 261 | System.out.println( "\t" + "INSERT_INTO_user_base ok , rows["+nret+"] effected , id["+user.id+"]" ); 262 | } 263 | 264 | userList = new LinkedList() ; 265 | nret = UserBaseSAU.SELECT_ALL_FROM_user_base_WHERE_name_E_( conn, userList, "Calvin" ) ; 266 | if( nret <= 0 ) { 267 | System.out.println( "\t" + "SELECT_ALL_FROM_user_base_WHERE_name_E_ failed["+nret+"]" ); 268 | return -14; 269 | } else { 270 | System.out.println( "\t" + "SELECT_ALL_FROM_user_base_WHERE_name_E_ ok , count["+nret+"]" ); 271 | } 272 | 273 | if( userList.size() < 1 ) { 274 | System.out.println("*** ERROR : Record not found about 'Calvin'"); 275 | return -1; 276 | } 277 | 278 | for( int i=0 ; i<10 ; i++ ) { 279 | userOrder = new UserOrderSAU() ; 280 | userOrder.userId = userList.get(0).id ; 281 | userOrder.itemName = "我的商品"+i ; 282 | userOrder.amount = 100+i ; 283 | userOrder.totalPrice = 1000.00+i*10 ; 284 | nret = UserOrderSAU.INSERT_INTO_user_order( conn, userOrder ) ; 285 | if( nret <= 0 ) { 286 | System.out.println( "\t" + "INSERT_INTO_user_order failed["+nret+"]" ); 287 | return -21; 288 | } else { 289 | System.out.println( "\t" + "INSERT_INTO_user_order ok , rows["+nret+"] effected , id["+userOrder.id+"]" ); 290 | } 291 | } 292 | 293 | conn.commit(); 294 | } catch (Exception e) { 295 | e.printStackTrace(); 296 | try { 297 | conn.rollback(); 298 | } catch (Exception e2) { 299 | return -2; 300 | } 301 | return -1; 302 | } 303 | 304 | return 0; 305 | } 306 | 307 | public static int testUpdateTable( Connection conn ) { 308 | 309 | List userList = null ; 310 | int nret = 0 ; 311 | 312 | try { 313 | nret = UserBaseSAU.UPDATE_user_base_SET_lvl_E_( conn, 6 ) ; 314 | if( nret < 0 ) { 315 | System.out.println( "\t" + "UPDATE_user_base_SET_lvl_E_ failed["+nret+"]" ); 316 | return -11; 317 | } else { 318 | System.out.println( "\t" + "UPDATE_user_base_SET_lvl_E_ ok , rows["+nret+"] effected" ); 319 | } 320 | 321 | nret = UserBaseSAU.UPDATE_user_base_SET_address_E_calvin_address_j_lvl_E_10_WHERE_name_E_Calvin_( conn ) ; 322 | if( nret < 0 ) { 323 | System.out.println( "\t" + "UPDATE_user_base_SET_address_E_calvin_address_j_lvl_E_10_WHERE_name_E_Calvin_ failed["+nret+"]" ); 324 | return -12; 325 | } else { 326 | System.out.println( "\t" + "UPDATE_user_base_SET_address_E_calvin_address_j_lvl_E_10_WHERE_name_E_Calvin_ ok , rows["+nret+"] effected" ); 327 | } 328 | 329 | nret = UserBaseSAU.UPDATE_user_base_SET_lvl_E_WHERE_age_GT_AND_gender_E_( conn, 8, (short)19, "F" ) ; 330 | if( nret < 0 ) { 331 | System.out.println( "\t" + "UPDATE_user_base_SET_lvl_E_WHERE_age_GT_AND_gender_E_ failed["+nret+"]" ); 332 | return -21; 333 | } else { 334 | System.out.println( "\t" + "UPDATE_user_base_SET_lvl_E_WHERE_age_GT_AND_gender_E_ ok , rows["+nret+"] effected" ); 335 | } 336 | 337 | userList = new LinkedList() ; 338 | nret = UserBaseSAU.SELECT_ALL_FROM_user_base_WHERE_name_E_( conn, userList, "Calvin" ) ; 339 | if( nret < 0 ) { 340 | System.out.println( "\t" + "SELECT_ALL_FROM_user_base_WHERE_name_E_ failed["+nret+"]" ); 341 | return -22; 342 | } else { 343 | System.out.println( "\t" + "SELECT_ALL_FROM_user_base_WHERE_name_E_ ok , ["+nret+"]records" ); 344 | } 345 | 346 | if( userList.size() < 1 ) { 347 | System.out.println("*** ERROR : Record not found about 'Calvin'"); 348 | return -1; 349 | } 350 | 351 | nret = UserOrderSAU.UPDATE_user_order_SET_total_price_E_WHERE_user_id_E_( conn, 10000.00, userList.get(0).id ) ; 352 | if( nret < 0 ) { 353 | System.out.println( "\t" + "UPDATE_user_order_SET_total_price_E_WHERE_user_id_E_ failed["+nret+"]" ); 354 | return -23; 355 | } else { 356 | System.out.println( "\t" + "UPDATE_user_order_SET_total_price_E_WHERE_user_id_E_ ok , rows["+nret+"] effected" ); 357 | } 358 | 359 | conn.commit(); 360 | } catch (Exception e) { 361 | e.printStackTrace(); 362 | try { 363 | conn.rollback(); 364 | } catch (Exception e2) { 365 | return -2; 366 | } 367 | return -1; 368 | } 369 | 370 | return 0; 371 | } 372 | 373 | public static int testDeleteTable1( Connection conn ) { 374 | 375 | int nret = 0 ; 376 | 377 | try { 378 | nret = UserBaseSAU.DELETE_FROM_user_base_WHERE_name_E_Calvin_( conn ) ; 379 | if( nret < 0 ) { 380 | System.out.println( "\t" + "DELETE_FROM_user_base_WHERE_name_E_Calvin_ failed["+nret+"]" ); 381 | return -11; 382 | } else { 383 | System.out.println( "\t" + "DELETE_FROM_user_base_WHERE_name_E_Calvin_ ok , rows["+nret+"] effected" ); 384 | } 385 | 386 | nret = UserBaseSAU.DELETE_FROM_user_base_WHERE_age_NE_AND_gender_NE_( conn, (short)3, "M" ) ; 387 | if( nret < 0 ) { 388 | System.out.println( "\t" + "DELETE_FROM_user_base_WHERE_age_NE_AND_gender_NE_ failed["+nret+"]" ); 389 | return -12; 390 | } else { 391 | System.out.println( "\t" + "DELETE_FROM_user_base_WHERE_age_NE_AND_gender_NE_ ok , rows["+nret+"] effected" ); 392 | } 393 | 394 | conn.commit(); 395 | } catch (Exception e) { 396 | e.printStackTrace(); 397 | try { 398 | conn.rollback(); 399 | } catch (Exception e2) { 400 | return -2; 401 | } 402 | return -1; 403 | } 404 | 405 | return 0; 406 | } 407 | 408 | public static int testDeleteTable2( Connection conn ) { 409 | 410 | int nret = 0 ; 411 | 412 | try { 413 | nret = UserBaseSAU.DELETE_FROM_user_base( conn ) ; 414 | if( nret < 0 ) { 415 | System.out.println( "\t" + "DELETE_FROM_user_base failed["+nret+"]" ); 416 | return -11; 417 | } else { 418 | System.out.println( "\t" + "DELETE_FROM_user_base ok , rows["+nret+"] effected" ); 419 | } 420 | 421 | nret = UserOrderSAU.DELETE_FROM_user_order( conn ) ; 422 | if( nret < 0 ) { 423 | System.out.println( "\t" + "DELETE_FROM_user_order failed["+nret+"]" ); 424 | return -21; 425 | } else { 426 | System.out.println( "\t" + "DELETE_FROM_user_order ok , rows["+nret+"] effected" ); 427 | } 428 | 429 | conn.commit(); 430 | } catch (Exception e) { 431 | e.printStackTrace(); 432 | try { 433 | conn.rollback(); 434 | } catch (Exception e2) { 435 | return -2; 436 | } 437 | return -1; 438 | } 439 | 440 | return 0; 441 | } 442 | 443 | public static void main(String[] args) { 444 | SqlActionTestConf dbserverConf ; 445 | Connection conn = null ; 446 | 447 | int nret = 0 ; 448 | 449 | // connect to database 450 | dbserverConf = OKJSON.fileToObject( "../../../dbserver.conf.json", SqlActionTestConf.class, OKJSON.OPTIONS_DIRECT_ACCESS_PROPERTY_ENABLE ) ; 451 | if( dbserverConf == null ) { 452 | System.out.println("dbserver.conf.json not found or content invalid"); 453 | return; 454 | } 455 | 456 | try { 457 | Class.forName( dbserverConf.driver ); 458 | conn = DriverManager.getConnection( dbserverConf.url, dbserverConf.user, dbserverConf.pwd ) ; 459 | } catch (ClassNotFoundException e1) { 460 | e1.printStackTrace(); 461 | } catch (SQLException e) { 462 | e.printStackTrace(); 463 | } 464 | 465 | // test all cases 466 | try { 467 | conn.setAutoCommit(false); 468 | } catch (SQLException e) { 469 | e.printStackTrace(); 470 | } 471 | 472 | System.out.println( "TestDeleteTable2 ..." ); 473 | nret = testDeleteTable2( conn ) ; 474 | if( nret != 0 ) { 475 | System.out.println( "TestDeleteTable2 failed" ); 476 | return; 477 | } else { 478 | System.out.println( "TestDeleteTable2 ok" ); 479 | } 480 | 481 | System.out.println( "TestSelectTable ..." ); 482 | nret = testSelectTable( conn ) ; 483 | if( nret != 0 ) { 484 | System.out.println( "TestSelectTable failed["+nret+"]" ); 485 | return; 486 | } else { 487 | System.out.println( "TestSelectTable ok" ); 488 | } 489 | 490 | System.out.println( "TestInsertTable ..." ); 491 | nret = testInsertTable( conn ) ; 492 | if( nret != 0 ) { 493 | System.out.println( "TestInsertTable failed["+nret+"]" ); 494 | return; 495 | } else { 496 | System.out.println( "TestInsertTable ok" ); 497 | } 498 | 499 | System.out.println( "TestSelectTable ..." ); 500 | nret = testSelectTable( conn ) ; 501 | if( nret != 0 ) { 502 | System.out.println( "TestSelectTable failed["+nret+"]" ); 503 | return; 504 | } else { 505 | System.out.println( "TestSelectTable ok" ); 506 | } 507 | 508 | System.out.println( "TestUpdateTable ..." ); 509 | nret = testUpdateTable( conn ) ; 510 | if( nret != 0 ) { 511 | System.out.println( "TestUpdateTable failed["+nret+"]" ); 512 | return; 513 | } else { 514 | System.out.println( "TestUpdateTable ok" ); 515 | } 516 | 517 | System.out.println( "TestSelectTable ..." ); 518 | nret = testSelectTable( conn ) ; 519 | if( nret != 0 ) { 520 | System.out.println( "TestSelectTable failed["+nret+"]" ); 521 | return; 522 | } else { 523 | System.out.println( "TestSelectTable ok" ); 524 | } 525 | 526 | System.out.println( "TestDeleteTable ..." ); 527 | nret = testDeleteTable1( conn ) ; 528 | if( nret != 0 ) { 529 | System.out.println( "TestDeleteTable1 failed["+nret+"]" ); 530 | return; 531 | } else { 532 | System.out.println( "TestDeleteTable1 ok" ); 533 | } 534 | 535 | System.out.println( "TestSelectTable ..." ); 536 | nret = testSelectTable( conn ) ; 537 | if( nret != 0 ) { 538 | System.out.println( "TestSelectTable failed["+nret+"]" ); 539 | return; 540 | } else { 541 | System.out.println( "TestSelectTable ok" ); 542 | } 543 | 544 | System.out.println( "TestDeleteTable2 ..." ); 545 | nret = testDeleteTable2( conn ) ; 546 | if( nret != 0 ) { 547 | System.out.println( "TestDeleteTable2 failed["+nret+"]" ); 548 | return; 549 | } else { 550 | System.out.println( "TestDeleteTable2 ok" ); 551 | } 552 | 553 | System.out.println( "TestSelectTable ..." ); 554 | nret = testSelectTable( conn ) ; 555 | if( nret != 0 ) { 556 | System.out.println( "TestSelectTable failed["+nret+"]" ); 557 | return; 558 | } else { 559 | System.out.println( "TestSelectTable ok" ); 560 | } 561 | 562 | return; 563 | } 564 | } 565 | 566 | -------------------------------------------------------------------------------- /src/test/java/xyz/calvinwilliams/test/SqlActionTestConf.java: -------------------------------------------------------------------------------- 1 | package xyz.calvinwilliams.test; 2 | 3 | public class SqlActionTestConf { 4 | public String driver ; 5 | public String url ; 6 | public String user ; 7 | public String pwd ; 8 | } 9 | -------------------------------------------------------------------------------- /src/test/java/xyz/calvinwilliams/test/UserBaseSAO.java: -------------------------------------------------------------------------------- 1 | // This file generated by sqlaction v0.2.9.0 2 | // WARN : DON'T MODIFY THIS FILE 3 | 4 | package xyz.calvinwilliams.test; 5 | 6 | import java.math.*; 7 | import java.util.*; 8 | import java.sql.Time; 9 | import java.sql.Timestamp; 10 | import java.sql.Connection; 11 | import java.sql.Statement; 12 | import java.sql.PreparedStatement; 13 | import java.sql.ResultSet; 14 | 15 | public class UserBaseSAO { 16 | 17 | int id ; // 编号 // PRIMARY KEY 18 | String name ; // 名字 19 | String gender ; // 性别 20 | short age ; // 年龄 21 | String address ; // 地址 22 | int lvl ; // 级别 23 | 24 | int _count_ ; // defining for 'SELECT COUNT(*)' 25 | 26 | // SELECT * FROM user_base 27 | public static int SELECT_ALL_FROM_user_base( Connection conn, List userBaseListForSelectOutput ) throws Exception { 28 | Statement stmt = conn.createStatement() ; 29 | ResultSet rs = stmt.executeQuery( "SELECT * FROM user_base" ) ; 30 | while( rs.next() ) { 31 | UserBaseSAU userBase = new UserBaseSAU() ; 32 | userBase.id = rs.getInt( 1 ) ; 33 | userBase.name = rs.getString( 2 ) ; 34 | userBase.gender = rs.getString( 3 ) ; 35 | userBase.age = rs.getShort( 4 ) ; 36 | userBase.address = rs.getString( 5 ) ; 37 | userBase.lvl = rs.getInt( 6 ) ; 38 | userBaseListForSelectOutput.add(userBase) ; 39 | } 40 | rs.close(); 41 | stmt.close(); 42 | return userBaseListForSelectOutput.size(); 43 | } 44 | 45 | // SELECT * FROM user_base WHERE name=? 46 | public static int SELECT_ALL_FROM_user_base_WHERE_name_E_( Connection conn, List userBaseListForSelectOutput, String _1_UserBaseSAU_name ) throws Exception { 47 | PreparedStatement prestmt = conn.prepareStatement( "SELECT * FROM user_base WHERE name=?" ) ; 48 | prestmt.setString( 1, _1_UserBaseSAU_name ); 49 | ResultSet rs = prestmt.executeQuery() ; 50 | while( rs.next() ) { 51 | UserBaseSAU userBase = new UserBaseSAU() ; 52 | userBase.id = rs.getInt( 1 ) ; 53 | userBase.name = rs.getString( 2 ) ; 54 | userBase.gender = rs.getString( 3 ) ; 55 | userBase.age = rs.getShort( 4 ) ; 56 | userBase.address = rs.getString( 5 ) ; 57 | userBase.lvl = rs.getInt( 6 ) ; 58 | userBaseListForSelectOutput.add(userBase) ; 59 | } 60 | rs.close(); 61 | prestmt.close(); 62 | return userBaseListForSelectOutput.size(); 63 | } 64 | 65 | // SELECT name,address FROM user_base WHERE age<=? AND gender=? 66 | public static int SELECT_name_j_address_FROM_user_base_WHERE_age_LE_AND_gender_E_( Connection conn, List userBaseListForSelectOutput, short _1_UserBaseSAU_age, String _2_UserBaseSAU_gender ) throws Exception { 67 | PreparedStatement prestmt = conn.prepareStatement( "SELECT name,address FROM user_base WHERE age<=? AND gender=?" ) ; 68 | prestmt.setShort( 1, _1_UserBaseSAU_age ); 69 | prestmt.setString( 2, _2_UserBaseSAU_gender ); 70 | ResultSet rs = prestmt.executeQuery() ; 71 | while( rs.next() ) { 72 | UserBaseSAU userBase = new UserBaseSAU() ; 73 | userBase.name = rs.getString( 1 ) ; 74 | userBase.address = rs.getString( 2 ) ; 75 | userBaseListForSelectOutput.add(userBase) ; 76 | } 77 | rs.close(); 78 | prestmt.close(); 79 | return userBaseListForSelectOutput.size(); 80 | } 81 | 82 | // SELECT * FROM user_base ORDER BY name DESC 83 | public static int SELECT_ALL_FROM_user_base_ORDER_BY_name_DESC( Connection conn, List userBaseListForSelectOutput ) throws Exception { 84 | Statement stmt = conn.createStatement() ; 85 | ResultSet rs = stmt.executeQuery( "SELECT * FROM user_base ORDER BY name DESC" ) ; 86 | while( rs.next() ) { 87 | UserBaseSAU userBase = new UserBaseSAU() ; 88 | userBase.id = rs.getInt( 1 ) ; 89 | userBase.name = rs.getString( 2 ) ; 90 | userBase.gender = rs.getString( 3 ) ; 91 | userBase.age = rs.getShort( 4 ) ; 92 | userBase.address = rs.getString( 5 ) ; 93 | userBase.lvl = rs.getInt( 6 ) ; 94 | userBaseListForSelectOutput.add(userBase) ; 95 | } 96 | rs.close(); 97 | stmt.close(); 98 | return userBaseListForSelectOutput.size(); 99 | } 100 | 101 | // SELECT gender,count(*) FROM user_base GROUP BY gender 102 | public static int SELECT_gender_j_count_ALL_FROM_user_base_GROUP_BY_gender( Connection conn, List userBaseListForSelectOutput ) throws Exception { 103 | Statement stmt = conn.createStatement() ; 104 | ResultSet rs = stmt.executeQuery( "SELECT gender,count(*) FROM user_base GROUP BY gender" ) ; 105 | while( rs.next() ) { 106 | UserBaseSAU userBase = new UserBaseSAU() ; 107 | userBase.gender = rs.getString( 1 ) ; 108 | userBase._count_ = rs.getInt( 2 ) ; 109 | userBaseListForSelectOutput.add(userBase) ; 110 | } 111 | rs.close(); 112 | stmt.close(); 113 | return userBaseListForSelectOutput.size(); 114 | } 115 | 116 | // INSERT INTO user_base @@SELECTSEQ(user_base_seq_id) @@SELECTKEY(id) 117 | public static int INSERT_INTO_user_base( Connection conn, UserBaseSAU userBase ) throws Exception { 118 | PreparedStatement prestmt ; 119 | Statement stmt ; 120 | ResultSet rs ; 121 | prestmt = conn.prepareStatement( "INSERT INTO user_base (name,gender,age,address,lvl) VALUES (?,?,?,?,?)" ) ; 122 | prestmt.setString( 1, userBase.name ); 123 | prestmt.setString( 2, userBase.gender ); 124 | prestmt.setShort( 3, userBase.age ); 125 | prestmt.setString( 4, userBase.address ); 126 | prestmt.setInt( 5, userBase.lvl ); 127 | int count = prestmt.executeUpdate() ; 128 | prestmt.close(); 129 | if( count != 1 ) 130 | return count; 131 | 132 | stmt = conn.createStatement() ; 133 | rs = stmt.executeQuery( "SELECT LAST_INSERT_ID()" ) ; 134 | rs.next(); 135 | userBase.id = rs.getInt( 1 ) ; 136 | rs.close(); 137 | stmt.close(); 138 | 139 | return count; 140 | } 141 | 142 | // UPDATE user_base SET lvl=? 143 | public static int UPDATE_user_base_SET_lvl_E_( Connection conn, int _1_lvl_ForSetInput ) throws Exception { 144 | PreparedStatement prestmt = conn.prepareStatement( "UPDATE user_base SET lvl=?" ) ; 145 | prestmt.setInt( 1, _1_lvl_ForSetInput ); 146 | int count = prestmt.executeUpdate() ; 147 | prestmt.close(); 148 | return count; 149 | } 150 | 151 | // UPDATE user_base SET address='calvin address',lvl=10 WHERE name='Calvin' 152 | public static int UPDATE_user_base_SET_address_E_calvin_address_j_lvl_E_10_WHERE_name_E_Calvin_( Connection conn ) throws Exception { 153 | PreparedStatement prestmt = conn.prepareStatement( "UPDATE user_base SET address='calvin address',lvl=10 WHERE name='Calvin'" ) ; 154 | int count = prestmt.executeUpdate() ; 155 | prestmt.close(); 156 | return count; 157 | } 158 | 159 | // UPDATE user_base SET lvl=? WHERE age>? AND gender=? 160 | public static int UPDATE_user_base_SET_lvl_E_WHERE_age_GT_AND_gender_E_( Connection conn, int _1_lvl_ForSetInput, short _1_age_ForWhereInput, String _2_gender_ForWhereInput ) throws Exception { 161 | PreparedStatement prestmt = conn.prepareStatement( "UPDATE user_base SET lvl=? WHERE age>? AND gender=?" ) ; 162 | prestmt.setInt( 1, _1_lvl_ForSetInput ); 163 | prestmt.setShort( 2, _1_age_ForWhereInput ); 164 | prestmt.setString( 3, _2_gender_ForWhereInput ); 165 | int count = prestmt.executeUpdate() ; 166 | prestmt.close(); 167 | return count; 168 | } 169 | 170 | // DELETE FROM user_base 171 | public static int DELETE_FROM_user_base( Connection conn ) throws Exception { 172 | PreparedStatement prestmt = conn.prepareStatement( "DELETE FROM user_base" ) ; 173 | int count = prestmt.executeUpdate() ; 174 | prestmt.close(); 175 | return count; 176 | } 177 | 178 | // DELETE FROM user_base WHERE name='Calvin' 179 | public static int DELETE_FROM_user_base_WHERE_name_E_Calvin_( Connection conn ) throws Exception { 180 | PreparedStatement prestmt = conn.prepareStatement( "DELETE FROM user_base WHERE name='Calvin'" ) ; 181 | int count = prestmt.executeUpdate() ; 182 | prestmt.close(); 183 | return count; 184 | } 185 | 186 | // DELETE FROM user_base WHERE age<>? AND gender<>? 187 | public static int DELETE_FROM_user_base_WHERE_age_NE_AND_gender_NE_( Connection conn, short _1_age, String _2_gender ) throws Exception { 188 | PreparedStatement prestmt = conn.prepareStatement( "DELETE FROM user_base WHERE age<>? AND gender<>?" ) ; 189 | prestmt.setShort( 1, _1_age ); 190 | prestmt.setString( 2, _2_gender ); 191 | int count = prestmt.executeUpdate() ; 192 | prestmt.close(); 193 | return count; 194 | } 195 | 196 | } 197 | -------------------------------------------------------------------------------- /src/test/java/xyz/calvinwilliams/test/UserBaseSAU.java: -------------------------------------------------------------------------------- 1 | // This file generated by sqlaction v0.2.7.0 2 | 3 | package xyz.calvinwilliams.test; 4 | 5 | import java.math.*; 6 | import java.util.*; 7 | import java.sql.Time; 8 | import java.sql.Timestamp; 9 | import java.sql.Connection; 10 | import java.sql.Statement; 11 | import java.sql.PreparedStatement; 12 | import java.sql.ResultSet; 13 | 14 | public class UserBaseSAU extends UserBaseSAO { 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/test/java/xyz/calvinwilliams/test/UserOrderSAO.java: -------------------------------------------------------------------------------- 1 | // This file generated by sqlaction v0.2.9.0 2 | // WARN : DON'T MODIFY THIS FILE 3 | 4 | package xyz.calvinwilliams.test; 5 | 6 | import java.math.*; 7 | import java.util.*; 8 | import java.sql.Time; 9 | import java.sql.Timestamp; 10 | import java.sql.Connection; 11 | import java.sql.Statement; 12 | import java.sql.PreparedStatement; 13 | import java.sql.ResultSet; 14 | 15 | public class UserOrderSAO { 16 | 17 | int id ; // 编号 // PRIMARY KEY 18 | int userId ; // 用户编号 19 | String itemName ; // 商品名称 20 | int amount ; // 数量 21 | double totalPrice ; 22 | 23 | int _count_ ; // defining for 'SELECT COUNT(*)' 24 | 25 | // SELECT /* blablabla~ */ * FROM user_order @@STATEMENT_INTERCEPTOR() 26 | /* 27 | public static String STATEMENT_INTERCEPTOR_for_SELECT_HT_blablabla_TH_ALL_FROM_user_order( String statementSql ) { 28 | 29 | return statementSql; 30 | } 31 | */ 32 | public static int SELECT_HT_blablabla_TH_ALL_FROM_user_order( Connection conn, List userOrderListForSelectOutput ) throws Exception { 33 | Statement stmt = conn.createStatement() ; 34 | ResultSet rs = stmt.executeQuery( UserOrderSAU.STATEMENT_INTERCEPTOR_for_SELECT_HT_blablabla_TH_ALL_FROM_user_order("SELECT /* blablabla~ */ * FROM user_order") ) ; 35 | while( rs.next() ) { 36 | UserOrderSAU userOrder = new UserOrderSAU() ; 37 | userOrder.id = rs.getInt( 1 ) ; 38 | userOrder.userId = rs.getInt( 2 ) ; 39 | userOrder.itemName = rs.getString( 3 ) ; 40 | userOrder.amount = rs.getInt( 4 ) ; 41 | userOrder.totalPrice = rs.getDouble( 5 ) ; 42 | userOrderListForSelectOutput.add(userOrder) ; 43 | } 44 | rs.close(); 45 | stmt.close(); 46 | return userOrderListForSelectOutput.size(); 47 | } 48 | 49 | // SELECT * FROM user_order WHERE user_id=? 50 | public static int SELECT_ALL_FROM_user_order_WHERE_user_id_E_( Connection conn, List userOrderListForSelectOutput, int _1_UserOrderSAU_userId ) throws Exception { 51 | PreparedStatement prestmt = conn.prepareStatement( "SELECT * FROM user_order WHERE user_id=?" ) ; 52 | prestmt.setInt( 1, _1_UserOrderSAU_userId ); 53 | ResultSet rs = prestmt.executeQuery() ; 54 | while( rs.next() ) { 55 | UserOrderSAU userOrder = new UserOrderSAU() ; 56 | userOrder.id = rs.getInt( 1 ) ; 57 | userOrder.userId = rs.getInt( 2 ) ; 58 | userOrder.itemName = rs.getString( 3 ) ; 59 | userOrder.amount = rs.getInt( 4 ) ; 60 | userOrder.totalPrice = rs.getDouble( 5 ) ; 61 | userOrderListForSelectOutput.add(userOrder) ; 62 | } 63 | rs.close(); 64 | prestmt.close(); 65 | return userOrderListForSelectOutput.size(); 66 | } 67 | 68 | // SELECT * FROM user_order @@PAGEKEY(id) 69 | public static int SELECT_ALL_FROM_user_order_PAGEKEY_id( Connection conn, List userOrderListForSelectOutput, int _1_pageSize, int _2_pageNum ) throws Exception { 70 | PreparedStatement prestmt = conn.prepareStatement( "SELECT * FROM user_order WHERE id>=(SELECT id FROM user_order ORDER BY id LIMIT ?,1) ORDER BY id LIMIT ?" ) ; 71 | prestmt.setInt( 1, _1_pageSize*(_2_pageNum-1) ); 72 | prestmt.setInt( 2, _1_pageSize ); 73 | ResultSet rs = prestmt.executeQuery() ; 74 | while( rs.next() ) { 75 | UserOrderSAU userOrder = new UserOrderSAU() ; 76 | userOrder.id = rs.getInt( 1 ) ; 77 | userOrder.userId = rs.getInt( 2 ) ; 78 | userOrder.itemName = rs.getString( 3 ) ; 79 | userOrder.amount = rs.getInt( 4 ) ; 80 | userOrder.totalPrice = rs.getDouble( 5 ) ; 81 | userOrderListForSelectOutput.add(userOrder) ; 82 | } 83 | rs.close(); 84 | prestmt.close(); 85 | return userOrderListForSelectOutput.size(); 86 | } 87 | 88 | // SELECT * FROM user_order WHERE item_name<>'' @@PAGEKEY(id) @@PAGESORT(DESC) 89 | public static int SELECT_ALL_FROM_user_order_WHERE_item_name_NE__PAGEKEY_id( Connection conn, List userOrderListForSelectOutput, int _1_pageSize, int _2_pageNum ) throws Exception { 90 | PreparedStatement prestmt = conn.prepareStatement( "SELECT * FROM user_order WHERE id<=(SELECT id FROM user_order ORDER BY id DESC LIMIT ?,1) AND item_name<>'' ORDER BY id DESC LIMIT ?" ) ; 91 | prestmt.setInt( 1, _1_pageSize*(_2_pageNum-1) ); 92 | prestmt.setInt( 2, _1_pageSize ); 93 | ResultSet rs = prestmt.executeQuery() ; 94 | while( rs.next() ) { 95 | UserOrderSAU userOrder = new UserOrderSAU() ; 96 | userOrder.id = rs.getInt( 1 ) ; 97 | userOrder.userId = rs.getInt( 2 ) ; 98 | userOrder.itemName = rs.getString( 3 ) ; 99 | userOrder.amount = rs.getInt( 4 ) ; 100 | userOrder.totalPrice = rs.getDouble( 5 ) ; 101 | userOrderListForSelectOutput.add(userOrder) ; 102 | } 103 | rs.close(); 104 | prestmt.close(); 105 | return userOrderListForSelectOutput.size(); 106 | } 107 | 108 | // SELECT user_base.name,user_base.address,user_order.item_name,user_order.amount,user_order.total_price 109 | // FROM user_base,user_order 110 | // WHERE user_base.name=? AND user_base.id=user_order.user_id 111 | // @@METHOD(queryUserAndOrderByName) 112 | public static int queryUserAndOrderByName( Connection conn, List userBaseListForSelectOutput, List userOrderListForSelectOutput, String _1_UserBaseSAU_name ) throws Exception { 113 | PreparedStatement prestmt = conn.prepareStatement( "SELECT user_base.name,user_base.address,user_order.item_name,user_order.amount,user_order.total_price FROM user_base,user_order WHERE user_base.name=? AND user_base.id=user_order.user_id" ) ; 114 | prestmt.setString( 1, _1_UserBaseSAU_name ); 115 | ResultSet rs = prestmt.executeQuery() ; 116 | while( rs.next() ) { 117 | UserBaseSAU userBase = new UserBaseSAU() ; 118 | UserOrderSAU userOrder = new UserOrderSAU() ; 119 | userBase.name = rs.getString( 1 ) ; 120 | userBase.address = rs.getString( 2 ) ; 121 | userOrder.itemName = rs.getString( 3 ) ; 122 | userOrder.amount = rs.getInt( 4 ) ; 123 | userOrder.totalPrice = rs.getDouble( 5 ) ; 124 | userBaseListForSelectOutput.add(userBase) ; 125 | userOrderListForSelectOutput.add(userOrder) ; 126 | } 127 | rs.close(); 128 | prestmt.close(); 129 | return userBaseListForSelectOutput.size(); 130 | } 131 | 132 | // SELECT u.name,u.address,o.* FROM user_base u,user_order o WHERE u.name=? AND u.id=o.user_id @@STATEMENT_INTERCEPTOR(statementInterceptorForQueryUserAndOrderByName) 133 | /* 134 | public static String statementInterceptorForQueryUserAndOrderByName( String statementSql, String _1_UserBaseSAU_name ) { 135 | 136 | return statementSql; 137 | } 138 | */ 139 | public static int SELECT_u_O_name_j_u_O_address_j_o_O_ALL_FROM_user_base_u_j_user_order_o_WHERE_u_O_name_E_AND_u_O_id_E_o_O_user_id( Connection conn, List userBaseListForSelectOutput, List userOrderListForSelectOutput, String _1_UserBaseSAU_name ) throws Exception { 140 | PreparedStatement prestmt = conn.prepareStatement( UserOrderSAU.statementInterceptorForQueryUserAndOrderByName("SELECT u.name,u.address,o.* FROM user_base u,user_order o WHERE u.name=? AND u.id=o.user_id", _1_UserBaseSAU_name) ) ; 141 | prestmt.setString( 1, _1_UserBaseSAU_name ); 142 | ResultSet rs = prestmt.executeQuery() ; 143 | while( rs.next() ) { 144 | UserBaseSAU userBase = new UserBaseSAU() ; 145 | UserOrderSAU userOrder = new UserOrderSAU() ; 146 | userBase.name = rs.getString( 1 ) ; 147 | userBase.address = rs.getString( 2 ) ; 148 | userOrder.id = rs.getInt( 3 ) ; 149 | userOrder.userId = rs.getInt( 4 ) ; 150 | userOrder.itemName = rs.getString( 5 ) ; 151 | userOrder.amount = rs.getInt( 6 ) ; 152 | userOrder.totalPrice = rs.getDouble( 7 ) ; 153 | userBaseListForSelectOutput.add(userBase) ; 154 | userOrderListForSelectOutput.add(userOrder) ; 155 | } 156 | rs.close(); 157 | prestmt.close(); 158 | return userBaseListForSelectOutput.size(); 159 | } 160 | 161 | // SELECT o.* #{UserOrderSAU.*} FROM user_order o #{user_order} @@ADVANCEDMODE 162 | public static int SELECT_o_O_ALL_FROM_user_order_o( Connection conn, List userOrderListForSelectOutput ) throws Exception { 163 | Statement stmt = conn.createStatement() ; 164 | ResultSet rs = stmt.executeQuery( "SELECT o.* FROM user_order o" ) ; 165 | while( rs.next() ) { 166 | UserOrderSAU userOrder = new UserOrderSAU() ; 167 | userOrder.id = rs.getInt( 1 ) ; 168 | userOrder.userId = rs.getInt( 2 ) ; 169 | userOrder.itemName = rs.getString( 3 ) ; 170 | userOrder.amount = rs.getInt( 4 ) ; 171 | userOrder.totalPrice = rs.getDouble( 5 ) ; 172 | userOrderListForSelectOutput.add(userOrder) ; 173 | } 174 | rs.close(); 175 | stmt.close(); 176 | return userOrderListForSelectOutput.size(); 177 | } 178 | 179 | // SELECT MIN(total_price) #{SqlActionTest.minTotalPrice:double}, MAX(total_price) #{SqlActionTest.maxTotalPrice:double}, COUNT(*) #{UserOrderSAU._count_} 180 | // FROM user_order #{user_order} 181 | // @@ADVANCEDMODE 182 | public static int SELECT_MIN_total_price_j_MAX_total_price_j_COUNT_ALL_FROM_user_order( Connection conn, List userOrderListForSelectOutput, List sqlActionTestListForSelectOutput ) throws Exception { 183 | Statement stmt = conn.createStatement() ; 184 | ResultSet rs = stmt.executeQuery( "SELECT MIN(total_price) , MAX(total_price) , COUNT(*) FROM user_order" ) ; 185 | while( rs.next() ) { 186 | UserOrderSAU userOrder = new UserOrderSAU() ; 187 | SqlActionTest sqlActionTest = new SqlActionTest() ; 188 | sqlActionTest.minTotalPrice = rs.getDouble( 1 ) ; 189 | sqlActionTest.maxTotalPrice = rs.getDouble( 2 ) ; 190 | userOrder._count_ = rs.getInt( 3 ) ; 191 | userOrderListForSelectOutput.add(userOrder) ; 192 | sqlActionTestListForSelectOutput.add(sqlActionTest) ; 193 | } 194 | rs.close(); 195 | stmt.close(); 196 | return userOrderListForSelectOutput.size(); 197 | } 198 | 199 | // SELECT user_base.name #{UserBaseSAU.name} 200 | // ,user_order.item_name #{UserOrderSAU.itemName} 201 | // ,SUM(user_order.amount) #{UserOrderSAU.amount} 202 | // ,SUM(user_order.total_price) #{UserOrderSAU.totalPrice} 203 | // FROM user_base #{user_base} 204 | // ,user_order #{user_order} 205 | // WHERE user_order.user_id IN ( 206 | // SELECT id 207 | // FROM user_base 208 | // WHERE id>=? #{UserOrderSAU.id} 209 | // ) 210 | // AND user_order.user_id=user_base.id 211 | // GROUP BY user_base.name 212 | // ORDER BY user_base.name 213 | // @@ADVANCEDMODE @@METHOD(statUsersAmountAndTotalPrice) 214 | public static int statUsersAmountAndTotalPrice( Connection conn, List userBaseListForSelectOutput, List userOrderListForSelectOutput, int _1_UserOrderSAU_id ) throws Exception { 215 | PreparedStatement prestmt = conn.prepareStatement( "SELECT user_base.name ,user_order.item_name ,SUM(user_order.amount) ,SUM(user_order.total_price) FROM user_base ,user_order WHERE user_order.user_id IN ( SELECT id FROM user_base WHERE id>=? ) AND user_order.user_id=user_base.id GROUP BY user_base.name ORDER BY user_base.name" ) ; 216 | prestmt.setInt( 1, _1_UserOrderSAU_id ); 217 | ResultSet rs = prestmt.executeQuery() ; 218 | while( rs.next() ) { 219 | UserBaseSAU userBase = new UserBaseSAU() ; 220 | UserOrderSAU userOrder = new UserOrderSAU() ; 221 | userBase.name = rs.getString( 1 ) ; 222 | userOrder.itemName = rs.getString( 2 ) ; 223 | userOrder.amount = rs.getInt( 3 ) ; 224 | userOrder.totalPrice = rs.getDouble( 4 ) ; 225 | userBaseListForSelectOutput.add(userBase) ; 226 | userOrderListForSelectOutput.add(userOrder) ; 227 | } 228 | rs.close(); 229 | prestmt.close(); 230 | return userBaseListForSelectOutput.size(); 231 | } 232 | 233 | // INSERT INTO user_order @@SELECTSEQ(user_order_seq_id) @@SELECTKEY(id) 234 | public static int INSERT_INTO_user_order( Connection conn, UserOrderSAU userOrder ) throws Exception { 235 | PreparedStatement prestmt ; 236 | Statement stmt ; 237 | ResultSet rs ; 238 | prestmt = conn.prepareStatement( "INSERT INTO user_order (user_id,item_name,amount,total_price) VALUES (?,?,?,?)" ) ; 239 | prestmt.setInt( 1, userOrder.userId ); 240 | prestmt.setString( 2, userOrder.itemName ); 241 | prestmt.setInt( 3, userOrder.amount ); 242 | prestmt.setDouble( 4, userOrder.totalPrice ); 243 | int count = prestmt.executeUpdate() ; 244 | prestmt.close(); 245 | if( count != 1 ) 246 | return count; 247 | 248 | stmt = conn.createStatement() ; 249 | rs = stmt.executeQuery( "SELECT LAST_INSERT_ID()" ) ; 250 | rs.next(); 251 | userOrder.id = rs.getInt( 1 ) ; 252 | rs.close(); 253 | stmt.close(); 254 | 255 | return count; 256 | } 257 | 258 | // UPDATE user_order SET total_price=? WHERE user_id=? 259 | public static int UPDATE_user_order_SET_total_price_E_WHERE_user_id_E_( Connection conn, double _1_totalPrice_ForSetInput, int _1_userId_ForWhereInput ) throws Exception { 260 | PreparedStatement prestmt = conn.prepareStatement( "UPDATE user_order SET total_price=? WHERE user_id=?" ) ; 261 | prestmt.setDouble( 1, _1_totalPrice_ForSetInput ); 262 | prestmt.setInt( 2, _1_userId_ForWhereInput ); 263 | int count = prestmt.executeUpdate() ; 264 | prestmt.close(); 265 | return count; 266 | } 267 | 268 | // DELETE FROM user_order 269 | public static int DELETE_FROM_user_order( Connection conn ) throws Exception { 270 | PreparedStatement prestmt = conn.prepareStatement( "DELETE FROM user_order" ) ; 271 | int count = prestmt.executeUpdate() ; 272 | prestmt.close(); 273 | return count; 274 | } 275 | 276 | // DELETE FROM user_order WHERE user_id=? #{UserOrderSAU.userId} @@ADVANCEDMODE @@METHOD(removeUserOrder) 277 | public static int removeUserOrder( Connection conn, int _1_userId ) throws Exception { 278 | PreparedStatement prestmt = conn.prepareStatement( "DELETE FROM user_order WHERE user_id=?" ) ; 279 | prestmt.setInt( 1, _1_userId ); 280 | int count = prestmt.executeUpdate() ; 281 | prestmt.close(); 282 | return count; 283 | } 284 | 285 | } 286 | -------------------------------------------------------------------------------- /src/test/java/xyz/calvinwilliams/test/UserOrderSAU.java: -------------------------------------------------------------------------------- 1 | // This file generated by sqlaction v0.2.7.0 2 | 3 | package xyz.calvinwilliams.test; 4 | 5 | import java.math.*; 6 | import java.util.*; 7 | import java.sql.Time; 8 | import java.sql.Timestamp; 9 | import java.sql.Connection; 10 | import java.sql.Statement; 11 | import java.sql.PreparedStatement; 12 | import java.sql.ResultSet; 13 | 14 | public class UserOrderSAU extends UserOrderSAO { 15 | 16 | // SELECT /* blablabla~ */ * FROM user_order @@STATEMENT_INTERCEPTOR() 17 | public static String STATEMENT_INTERCEPTOR_for_SELECT_HT_blablabla_TH_ALL_FROM_user_order( String statementSql ) { 18 | 19 | return statementSql; 20 | } 21 | 22 | // SELECT u.name,u.address,o.item_name,o.amount,o.total_price FROM user_base u,user_order o WHERE u.name=? AND u.id=o.user_id @@STATEMENT_INTERCEPTOR(statementInterceptorForQueryUserAndOrderByName) 23 | public static String statementInterceptorForQueryUserAndOrderByName( String statementSql, String _1_UserBaseSAU_name ) { 24 | 25 | return statementSql; 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /src/test/java/xyz/calvinwilliams/test/ddl_mysql.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE `user_base` ( 2 | `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '编号', 3 | `name` varchar(45) COLLATE utf8mb4_bin NOT NULL COMMENT '名字', 4 | `gender` varchar(3) COLLATE utf8mb4_bin NOT NULL COMMENT '性别', 5 | `age` smallint(6) NOT NULL COMMENT '年龄', 6 | `address` varchar(100) COLLATE utf8mb4_bin NOT NULL COMMENT '地址', 7 | `lvl` int(11) NOT NULL COMMENT '级别', 8 | PRIMARY KEY (`id`), 9 | UNIQUE KEY `user_base_idx1` (`name`) 10 | ) ENGINE=InnoDB AUTO_INCREMENT=46 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin 11 | 12 | CREATE TABLE `user_order` ( 13 | `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '编号', 14 | `user_id` int(11) NOT NULL COMMENT '用户编号', 15 | `item_name` varchar(45) COLLATE utf8mb4_bin NOT NULL COMMENT '商品名称', 16 | `amount` int(11) NOT NULL COMMENT '数量', 17 | `total_price` decimal(12,2) NOT NULL, 18 | PRIMARY KEY (`id`), 19 | KEY `order_idx1` (`user_id`) 20 | ) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin 21 | -------------------------------------------------------------------------------- /src/test/java/xyz/calvinwilliams/test/ddl_oracle.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE "CALVIN"."USER_BASE" 2 | ( "ID" NUMBER(*,0) NOT NULL ENABLE, 3 | "NAME" VARCHAR2(45 BYTE) NOT NULL ENABLE, 4 | "GENDER" VARCHAR2(3 BYTE) NOT NULL ENABLE, 5 | "AGE" NUMBER(*,0) NOT NULL ENABLE, 6 | "ADDRESS" VARCHAR2(100 BYTE) NOT NULL ENABLE, 7 | "LVL" NUMBER(*,0) NOT NULL ENABLE 8 | ) SEGMENT CREATION DEFERRED 9 | PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 10 | NOCOMPRESS LOGGING 11 | TABLESPACE "USERS" ; 12 | 13 | COMMENT ON COLUMN "CALVIN"."USER_BASE"."ID" IS '编号'; 14 | COMMENT ON COLUMN "CALVIN"."USER_BASE"."NAME" IS '名字'; 15 | COMMENT ON COLUMN "CALVIN"."USER_BASE"."GENDER" IS '性别'; 16 | COMMENT ON COLUMN "CALVIN"."USER_BASE"."AGE" IS '年龄'; 17 | COMMENT ON COLUMN "CALVIN"."USER_BASE"."ADDRESS" IS '地址'; 18 | COMMENT ON COLUMN "CALVIN"."USER_BASE"."LVL" IS '级别'; 19 | 20 | CREATE INDEX "CALVIN"."USER_BASE_IDX1" ON "CALVIN"."USER_BASE" ("ID") 21 | PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 22 | TABLESPACE "USERS" ; 23 | 24 | 25 | 26 | 27 | CREATE TABLE "CALVIN"."USER_ORDER" 28 | ( "ID" NUMBER(*,0) NOT NULL ENABLE, 29 | "USER_ID" NUMBER(*,0) NOT NULL ENABLE, 30 | "ITEM_NAME" VARCHAR2(45 BYTE) NOT NULL ENABLE, 31 | "AMOUNT" NUMBER(*,0) NOT NULL ENABLE, 32 | "TOTAL_PRICE" NUMBER(12,2) NOT NULL ENABLE 33 | ) SEGMENT CREATION DEFERRED 34 | PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 35 | NOCOMPRESS LOGGING 36 | TABLESPACE "USERS" ; 37 | 38 | COMMENT ON COLUMN "CALVIN"."USER_ORDER"."ID" IS '编号'; 39 | COMMENT ON COLUMN "CALVIN"."USER_ORDER"."USER_ID" IS '用户编号'; 40 | COMMENT ON COLUMN "CALVIN"."USER_ORDER"."ITEM_NAME" IS '商品名称'; 41 | COMMENT ON COLUMN "CALVIN"."USER_ORDER"."AMOUNT" IS '数量'; 42 | 43 | CREATE INDEX "CALVIN"."USER_ORDER_IDX1" ON "CALVIN"."USER_ORDER" ("ID") 44 | PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 45 | TABLESPACE "USERS" ; -------------------------------------------------------------------------------- /src/test/java/xyz/calvinwilliams/test/ddl_postgresql.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE "user_base" 2 | ( 3 | id integer NOT NULL, 4 | name character varying(45) NOT NULL, 5 | gender character varying(3) NOT NULL, 6 | age smallint NOT NULL, 7 | address character varying(100) NOT NULL, 8 | lvl integer NOT NULL, 9 | CONSTRAINT user_base_pkey PRIMARY KEY (id) 10 | ); 11 | CREATE INDEX user_base_idx1 ON "user_base" USING btree (name) ; 12 | CREATE SEQUENCE user_base_seq_id ; 13 | 14 | CREATE TABLE "user_order" 15 | ( 16 | id integer NOT NULL, 17 | user_id integer NOT NULL, 18 | item_name character varying(45) NOT NULL, 19 | amount INTEGER NOT NULL, 20 | total_price numeric(12,2) NOT NULL, 21 | CONSTRAINT user_order_pkey PRIMARY KEY (id) 22 | ); 23 | CREATE INDEX user_order_idx1 ON user_order USING btree (user_id) ; 24 | CREATE SEQUENCE user_order_seq_id ; 25 | -------------------------------------------------------------------------------- /src/test/java/xyz/calvinwilliams/test/ddl_sqlite.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE user_base ( 2 | id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 3 | name VARCHAR(45) NOT NULL, 4 | gender VARCHAR(3) NOT NULL, 5 | age INTEGER NOT NULL, 6 | address VARCHAR(100) NOT NULL, 7 | lvl INTEGER NOT NULL 8 | ) 9 | 10 | CREATE TABLE user_order ( 11 | id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 12 | user_id INTEGER NOT NULL, 13 | item_name VARCHAR(45) NOT NULL, 14 | amount INTEGER NOT NULL, 15 | total_price NUMERIC(12,2) NOT NULL 16 | ) 17 | -------------------------------------------------------------------------------- /src/test/java/xyz/calvinwilliams/test/ddl_sqlserver.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE user_base 2 | ( 3 | id INTEGER NOT NULL PRIMARY KEY, 4 | name VARCHAR(45) NOT NULL, 5 | gender VARCHAR(3) NOT NULL, 6 | age INTEGER NOT NULL, 7 | address VARCHAR(100) NOT NULL, 8 | lvl INTEGER NOT NULL 9 | ); 10 | CREATE INDEX user_base_idx1 ON user_base ( id ) ; 11 | CREATE SEQUENCE user_base_seq_id ; 12 | 13 | CREATE TABLE user_order 14 | ( 15 | id INTEGER NOT NULL PRIMARY KEY, 16 | user_id INTEGER NOT NULL, 17 | item_name VARCHAR(45) NOT NULL, 18 | amount INTEGER NOT NULL, 19 | total_price NUMERIC(12,2) NOT NULL 20 | ); 21 | CREATE INDEX user_order_idx1 ON user_order ( id ) ; 22 | CREATE SEQUENCE user_order_seq_id ; 23 | -------------------------------------------------------------------------------- /src/test/java/xyz/calvinwilliams/test/pp.bat: -------------------------------------------------------------------------------- 1 | java -Dfile.encoding=UTF-8 -classpath "D:\Work\mysql-connector-java-8.0.15\mysql-connector-java-8.0.15.jar;%USERPROFILE%\.m2\repository\xyz\calvinwilliams\okjson\0.0.9.0\okjson-0.0.9.0.jar;%USERPROFILE%\.m2\repository\xyz\calvinwilliams\sqlaction\0.2.0.0\sqlaction-0.2.0.0.jar" xyz.calvinwilliams.sqlaction.SqlActionGencode 2 | pause 3 | -------------------------------------------------------------------------------- /src/test/java/xyz/calvinwilliams/test/sqlaction.conf.json: -------------------------------------------------------------------------------- 1 | { 2 | "database" : "calvindb" , 3 | "tables" : [ 4 | { 5 | "table" : "user_base" , 6 | "sqlactions" : [ 7 | "SELECT * FROM user_base" , 8 | "SELECT * FROM user_base WHERE name=?" , 9 | "SELECT name,address FROM user_base WHERE age<=? AND gender=?" , 10 | "SELECT * FROM user_base ORDER BY name DESC" , 11 | "SELECT gender,count(*) FROM user_base GROUP BY gender" , 12 | "INSERT INTO user_base @@SELECTSEQ(user_base_seq_id) @@SELECTKEY(id)" , 13 | "UPDATE user_base SET lvl=?" , 14 | "UPDATE user_base SET address='calvin address',lvl=10 WHERE name='Calvin'" , 15 | "UPDATE user_base SET lvl=? WHERE age>? AND gender=?" , 16 | "DELETE FROM user_base" , 17 | "DELETE FROM user_base WHERE name='Calvin'" , 18 | "DELETE FROM user_base WHERE age<>? AND gender<>?" 19 | ] 20 | } , 21 | { 22 | "table" : "user_order" , 23 | "sqlactions" : [ 24 | "SELECT /* blablabla~ */ * FROM user_order @@STATEMENT_INTERCEPTOR()" , 25 | "SELECT * FROM user_order WHERE user_id=?" , 26 | "SELECT * FROM user_order @@PAGEKEY(id)" , 27 | "SELECT * FROM user_order WHERE item_name<>'' @@PAGEKEY(id) @@PAGESORT(DESC)" , 28 | "SELECT user_base.name,user_base.address,user_order.item_name,user_order.amount,user_order.total_price 29 | FROM user_base,user_order 30 | WHERE user_base.name=? AND user_base.id=user_order.user_id 31 | @@METHOD(queryUserAndOrderByName)" , 32 | "SELECT u.name,u.address,o.* FROM user_base u,user_order o WHERE u.name=? AND u.id=o.user_id @@STATEMENT_INTERCEPTOR(statementInterceptorForQueryUserAndOrderByName)" , 33 | "SELECT o.* #{UserOrderSAU.*} FROM user_order o #{user_order} @@ADVANCEDMODE" , 34 | "SELECT MIN(total_price) #{SqlActionTest.minTotalPrice:double}, MAX(total_price) #{SqlActionTest.maxTotalPrice:double}, COUNT(*) #{UserOrderSAU._count_} 35 | FROM user_order #{user_order} 36 | @@ADVANCEDMODE" , 37 | "SELECT user_base.name #{UserBaseSAU.name} 38 | ,user_order.item_name #{UserOrderSAU.itemName} 39 | ,SUM(user_order.amount) #{UserOrderSAU.amount} 40 | ,SUM(user_order.total_price) #{UserOrderSAU.totalPrice} 41 | FROM user_base #{user_base} 42 | ,user_order #{user_order} 43 | WHERE user_order.user_id IN ( 44 | SELECT id 45 | FROM user_base 46 | WHERE id>=? #{UserOrderSAU.id} 47 | ) 48 | AND user_order.user_id=user_base.id 49 | GROUP BY user_base.name 50 | ORDER BY user_base.name 51 | @@ADVANCEDMODE @@METHOD(statUsersAmountAndTotalPrice)" , 52 | "INSERT INTO user_order @@SELECTSEQ(user_order_seq_id) @@SELECTKEY(id)" , 53 | "UPDATE user_order SET total_price=? WHERE user_id=?" , 54 | "DELETE FROM user_order" , 55 | "DELETE FROM user_order WHERE user_id=? #{UserOrderSAU.userId} @@ADVANCEDMODE @@METHOD(removeUserOrder)" 56 | ] 57 | } 58 | ] , 59 | "javaPackage" : "xyz.calvinwilliams.test" 60 | } 61 | -------------------------------------------------------------------------------- /src/test/java/xyz/calvinwilliams/test/sqlaction.conf.json.bak: -------------------------------------------------------------------------------- 1 | { 2 | "database" : "calvindb" , 3 | "tables" : [ 4 | { 5 | "table" : "user" , 6 | "sqlactions" : [ 7 | "SELECT * FROM user" , 8 | "SELECT * FROM user WHERE name=?" , 9 | "SELECT name,address FROM user WHERE age<=? AND gender=?" , 10 | "SELECT * FROM user ORDER BY name DESC" , 11 | "SELECT gender,count(*) FROM user GROUP BY gender" , 12 | "INSERT INTO user @@SELECTKEY(user_seq_id)" , 13 | "UPDATE user SET level=?" , 14 | "UPDATE user SET address='calvin address',level=10 WHERE name='Calvin'" , 15 | "UPDATE user SET level=? WHERE age>? AND gender=?" , 16 | "DELETE FROM user" , 17 | "DELETE FROM user WHERE name='Calvin'" , 18 | "DELETE FROM user WHERE age<>? AND gender<>?" 19 | ] 20 | } , 21 | { 22 | "table" : "user_order" , 23 | "sqlactions" : [ 24 | "SELECT /* blablabla~ */ * FROM user_order @@STATEMENT_INTERCEPTOR()" , 25 | "SELECT * FROM user_order WHERE user_id=?" , 26 | "SELECT * FROM user_order @@PAGEKEY(id)" , 27 | "SELECT * FROM user_order WHERE item_name<>'' @@PAGEKEY(id)" , 28 | "SELECT user.name,user.address,user_order.item_name,user_order.amount,user_order.total_price 29 | FROM user,user_order 30 | WHERE user.name=? AND user.id=user_order.user_id 31 | @@METHOD(queryUserAndOrderByName)" , 32 | "SELECT u.name,u.address,o.item_name,o.amount,o.total_price FROM user u,user_order o WHERE u.name=? AND u.id=o.user_id @@STATEMENT_INTERCEPTOR(statementInterceptorForQueryUserAndOrderByName)" , 33 | "INSERT INTO user_order" , 34 | "UPDATE user_order SET total_price=? WHERE user_id=?" , 35 | "DELETE FROM user_order" 36 | ] 37 | } 38 | ] , 39 | "javaPackage" : "xyz.calvinwilliams.sqlaction" 40 | } 41 | --------------------------------------------------------------------------------