فهرست منبع

select拆分为select-list和select-one

mxd 5 سال پیش
والد
کامیت
4427407544

+ 1 - 1
src/main/java/com/ssssssss/enums/SqlMode.java

@@ -1,5 +1,5 @@
 package com.ssssssss.enums;
 
 public enum SqlMode {
-    SELECT_LIST,SELECT_ONE,SELECT_NUMBER,UPDATE,INSERT,DELETE
+    SELECT_LIST,SELECT_ONE,UPDATE,INSERT,DELETE
 }

+ 19 - 37
src/main/java/com/ssssssss/executor/SqlExecutor.java

@@ -33,11 +33,13 @@ public class SqlExecutor {
         if (SqlMode.SELECT_LIST == mode) {
             return queryForList(sql, parameters, returnType == null ? Map.class : returnType);
         } else if (SqlMode.UPDATE == mode || SqlMode.INSERT == mode || SqlMode.DELETE == mode) {
-            return update(sql, parameters);
+            int value = update(sql, parameters);
+            if(returnType == Boolean.class){
+                return value > 0;
+            }
+            return value;
         } else if (SqlMode.SELECT_ONE == mode) {
             return queryForOne(sql, parameters, returnType);
-        } else if (SqlMode.SELECT_NUMBER == mode) {
-            return queryForNumber(sql, parameters, returnType);
         } else {
             throw new S8Exception("暂时不支持[" + mode + "]模式");
         }
@@ -68,22 +70,17 @@ public class SqlExecutor {
         }
     }
 
-    private <T> T queryForNumber(String sql, List<Object> params, Class<T> returnType) throws SQLException {
-        Connection conn = getConnection();
-        try {
-            return queryForNumber(conn, sql, params, returnType);
-        } finally {
-            closeConnection(conn);
-        }
-    }
-
-    public <T> T queryForNumber(Connection connection, String sql, List<Object> params, Class<T> returnType) throws SQLException {
+    public <T> T queryForOne(Connection connection, String sql, List<Object> params, Class<T> returnType) throws SQLException {
         PreparedStatement stmt = null;
         ResultSet rs = null;
         try {
             stmt = createPreparedStatement(connection, sql, params);
             rs = stmt.executeQuery();
-            if (rs.next()) {
+            if (returnType == null || returnType == Map.class) {
+                if (rs.next()) {
+                    return (T) fetchResultSet(rs);
+                }
+            } else if (rs.next()) {
                 return rs.getObject(1, returnType);
             }
         } finally {
@@ -93,28 +90,13 @@ public class SqlExecutor {
         return null;
     }
 
-    private Object queryForOne(String sql, List<Object> params, Class<?> returnType) throws SQLException {
+    private <T> T queryForOne(String sql, List<Object> params, Class<T> returnType) throws SQLException {
         Connection connection = getConnection();
-        PreparedStatement stmt = null;
-        ResultSet rs = null;
         try {
-            stmt = createPreparedStatement(connection, sql, params);
-            rs = stmt.executeQuery();
-            if (returnType == null || returnType == Map.class) {
-                ResultSetMetaData rsd = rs.getMetaData();
-                int columnCount = rsd.getColumnCount();
-                if (rs.next()) {
-                    return fetchResultSet(rs);
-                }
-            } else if (rs.next()) {
-                return rs.getObject(1, returnType);
-            }
+            return queryForOne(connection, sql, params, returnType);
         } finally {
-            closeResultSet(rs);
-            closeStatement(stmt);
             closeConnection(connection);
         }
-        return null;
     }
 
     public List<Object> queryForList(Connection connection, String sql, List<Object> params, Class<?> returnType) throws SQLException {
@@ -140,18 +122,18 @@ public class SqlExecutor {
         }
     }
 
-    private Map<String,Object> fetchResultSet(ResultSet rs) throws SQLException {
+    private Map<String, Object> fetchResultSet(ResultSet rs) throws SQLException {
         ResultSetMetaData rsd = rs.getMetaData();
         int columnCount = rsd.getColumnCount();
-        Map<String,Object> row = new HashMap<>(columnCount);
+        Map<String, Object> row = new HashMap<>(columnCount);
         for (int i = 1; i <= columnCount; i++) {
             row.put(underscoreToCamelCase(rsd.getColumnName(i)), rs.getObject(i));
         }
         return row;
     }
 
-    private String underscoreToCamelCase(String columnName){
-        if(mapUnderscoreToCamelCase){
+    private String underscoreToCamelCase(String columnName) {
+        if (mapUnderscoreToCamelCase) {
             columnName = columnName.toLowerCase();
             boolean upperCase = false;
             StringBuilder sb = new StringBuilder();
@@ -182,14 +164,14 @@ public class SqlExecutor {
 
     private PreparedStatement createPreparedStatement(Connection conn, String sql, List<Object> params) throws SQLException {
         PreparedStatement stmt = conn.prepareStatement(sql);
-        logger.debug("执行SQL:{}",sql);
+        logger.debug("执行SQL:{}", sql);
         setStatementParams(stmt, params);
         return stmt;
     }
 
     private void setStatementParams(PreparedStatement stmt, List<Object> params) throws SQLException {
         if (params != null) {
-            logger.debug("sql参数:{}",params);
+            logger.debug("sql参数:{}", params);
             for (int i = 0; i < params.size(); i++) {
                 Object val = params.get(i);
                 if (val instanceof Date) {

+ 5 - 5
src/main/java/com/ssssssss/executor/StatementExecutor.java

@@ -23,22 +23,22 @@ public class StatementExecutor {
 
     public Object execute(SqlStatement sqlStatement, RequestContext context) throws SQLException {
         String sql = sqlStatement.getSqlNode().getSql(context).trim();
-        if(sqlStatement.isPagination()){
+        if (sqlStatement.isPagination()) {
             Page page = pageProvider.getPage(context.getRequest());
             return sqlExecutor.doInConnection(connection -> {
                 PageResult<Object> pageResult = new PageResult<>();
                 Dialect dialect = DialectUtils.getDialectFromUrl(connection.getMetaData().getURL());
-                long total = sqlExecutor.queryForNumber(connection,dialect.getCountSql(sql),context.getParameters(),Long.class);
+                long total = sqlExecutor.queryForOne(connection, dialect.getCountSql(sql), context.getParameters(), Long.class);
                 pageResult.setTotal(total);
-                if(total > 0){
+                if (total > 0) {
                     String pageSql = dialect.getPageSql(sql, page.getOffset(), page.getLimit());
                     context.addParameter(page.getLimit());
                     context.addParameter(page.getOffset());
-                    pageResult.setList(sqlExecutor.queryForList(connection,pageSql,context.getParameters(),sqlStatement.getReturnType()));
+                    pageResult.setList(sqlExecutor.queryForList(connection, pageSql, context.getParameters(), sqlStatement.getReturnType()));
                 }
                 return pageResult;
             });
-        }else{
+        } else {
             return sqlExecutor.execute(sqlStatement.getSqlMode(), sql, context.getParameters(), sqlStatement.getReturnType());
         }
     }

+ 12 - 4
src/main/java/com/ssssssss/utils/Assert.java

@@ -1,5 +1,6 @@
 package com.ssssssss.utils;
 
+import com.ssssssss.enums.SqlMode;
 import com.ssssssss.exception.S8Exception;
 import org.apache.commons.lang3.StringUtils;
 
@@ -7,8 +8,6 @@ public class Assert {
 
     /**
      * 断言值不能为空
-     * @param value
-     * @param message
      */
     public static void isNotNull(Object value,String message){
         if(value == null){
@@ -19,12 +18,21 @@ public class Assert {
 
     /**
      * 断言值不能为空字符串
-     * @param value
-     * @param message
      */
     public static void isNotBlank(String value,String message){
         if(StringUtils.isBlank(value)){
             throw new S8Exception(message);
         }
     }
+
+    /**
+     * 断言值在枚举中
+     */
+    public static <T extends Enum<T>> void isExistsEnum(Class<T> enumType, String name, String message){
+        try {
+            Enum.valueOf(enumType,name);
+        } catch (Exception e) {
+            throw new S8Exception(message);
+        }
+    }
 }

+ 18 - 15
src/main/java/com/ssssssss/utils/S8XMLFileParser.java

@@ -22,6 +22,7 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Map;
 
 /**
  * xml文件解析
@@ -30,7 +31,7 @@ public class S8XMLFileParser {
 
     private static Logger logger = LoggerFactory.getLogger(S8XMLFileParser.class);
 
-    private static final List<String> TAG_NAMES = Arrays.asList("select", "insert", "update", "delete");
+    private static final List<String> TAG_NAMES = Arrays.asList("select-list", "select-one", "insert", "update", "delete");
 
     /**
      * 解析xml文件
@@ -70,30 +71,32 @@ public class S8XMLFileParser {
             Node item = nodeList.item(i);
             SqlStatement sqlStatement = new SqlStatement();
             sqlStatement.setXmlStatement(xmlStatement);
+            // 设置SqlMode
+            sqlStatement.setSqlMode(SqlMode.valueOf(item.getNodeName().toUpperCase().replace("-", "_")));
+
             String requestMapping = getNodeAttributeValue(item, "request-mapping");
-            Assert.isNotBlank(requestMapping,"请求方法不能为空!");
+            Assert.isNotBlank(requestMapping, "请求方法不能为空!");
             // 设置请求路径
             sqlStatement.setRequestMapping(StringUtils.defaultString(xmlStatement.getRequestMapping()) + requestMapping);
             // 设置请求方法
             sqlStatement.setRequestMethod(getNodeAttributeValue(item, "request-method"));
             String returnType = getNodeAttributeValue(item, "return-type");
-            if("int".equalsIgnoreCase(returnType)){
+            if ("int".equalsIgnoreCase(returnType)) {
                 sqlStatement.setReturnType(Integer.class);
-                sqlStatement.setSqlMode(SqlMode.SELECT_NUMBER);
-            }else if("double".equalsIgnoreCase(returnType)){
-                sqlStatement.setSqlMode(SqlMode.SELECT_NUMBER);
+            } else if ("double".equalsIgnoreCase(returnType)) {
                 sqlStatement.setReturnType(Double.class);
-            }else if("long".equalsIgnoreCase(returnType)){
-                sqlStatement.setSqlMode(SqlMode.SELECT_NUMBER);
+            } else if ("long".equalsIgnoreCase(returnType)) {
                 sqlStatement.setReturnType(Long.class);
-            }else if("string".equalsIgnoreCase(returnType)){
+            } else if ("string".equalsIgnoreCase(returnType)) {
                 sqlStatement.setReturnType(String.class);
-            }else if("map".equalsIgnoreCase(returnType)){
-                sqlStatement.setSqlMode(SqlMode.SELECT_ONE);
-            }else{
-                sqlStatement.setSqlMode(SqlMode.SELECT_LIST);
+            } else if ("boolean".equalsIgnoreCase(returnType)) {
+                sqlStatement.setReturnType(Boolean.class);
+            } else {
+                sqlStatement.setReturnType(Map.class);
+            }
+            if (SqlMode.SELECT_LIST == sqlStatement.getSqlMode()) {
                 //设置是否是分页
-                sqlStatement.setPagination("true".equalsIgnoreCase(getNodeAttributeValue(item,"page")));
+                sqlStatement.setPagination("true".equalsIgnoreCase(getNodeAttributeValue(item, "page")));
             }
             SqlNode root = new TextSqlNode("");
             // 解析sql语句
@@ -112,7 +115,7 @@ public class S8XMLFileParser {
             Node node = nodeList.item(i);
             if (node.getNodeType() == Node.TEXT_NODE) {
                 sqlNode.addChildNode(new TextSqlNode(node.getNodeValue().trim()));
-            } else if(node.getNodeType() != Node.COMMENT_NODE){
+            } else if (node.getNodeType() != Node.COMMENT_NODE) {
                 String nodeName = node.getNodeName();
                 SqlNode childNode = null;
                 if ("foreach".equals(nodeName)) {

+ 10 - 64
src/main/resources/ssssssss/role/test.xml

@@ -1,71 +1,17 @@
 <?xml version="1.0" encoding="utf-8" ?>
 <ssssssss request-mapping="/user" >
     <!-- select/update/insert/delete -->
-    <select request-mapping="/list" request-method="get" page="true">
-        select name from sys_role where name in (
-        <foreach collection="names.split(',')" item="item" separator=",">
-            #{item}
-        </foreach>
-        )
-    </select>
-    <select request-mapping="/one" request-method="get" return-type="map">
-        select name from sys_role
+    <select-list request-mapping="/list" request-method="get" page="true">
+        select username from sys_user
+    </select-list>
+    <insert request-mapping="/add" return-type="boolean">
+        insert into sys_user(username,password,role_id) values(#{username},#{password},#{roleId})
+    </insert>
+    <select-one request-mapping="/one" request-method="get" return-type="map">
+        select username from sys_user
         <if test="name != null and name.length() > 0">
-            where name like concat('%','${name}','%')
+            where username like concat('%','${name}','%')
         </if>
         limit 1
-    </select>
-    <select request-mapping="/test" page="true">
-        select
-        u.id,
-        u.name,
-        u.login_name,
-        u.unit_name,
-        u.user_type,
-        u.email,
-        u.phone,
-        u.mobile,
-        u.car_id,
-        u.USER_REGISTER_TYPE,
-        o.name office_name
-        from sys_user u
-        left join sys_office o on o.id = u.office_id
-        where u.del_flag = 0
-        <if test="officeId != null and officeId !='' and officeId != '0'.toString()">
-            and find_in_set(u.office_id,getOfficeChildList(#{officeId}))
-        </if>
-        <if test="name != null and name !=''">
-            and u.name like concat('%',#{name},'%')
-        </if>
-        <if test="unitName != null and unitName !=''">
-            and u.unit_name like concat('%',#{unitName},'%')
-        </if>
-        <if test="userRegisterType != null and userRegisterType !=''">
-            and u.user_register_type = #{userRegisterType}
-        </if>
-        <if test="loginName != null and loginName !=''">
-            and u.login_name like concat('%',#{loginName},'%')
-        </if>
-        <if test="carId != null and carId !=''">
-            and u.car_id like concat('%',#{carId},'%')
-        </if>
-        <if test="createBy != null and createBy !=''">
-            and u.create_by = #{createBy}
-        </if>
-        <if test="isRegisterFinish != null and isRegisterFinish != ''">
-            and u.is_register_finish = #{isRegisterFinish}
-        </if>
-        <if test="examineState != null and examineState != ''">
-            and u.EXAMINE_STATE = #{examineState}
-        </if>
-        <if test="roleIds != null and roleIds.length() > 0">
-            and u.id in (
-            select user_id from sys_user_role where role_id in
-            <foreach collection="roleIds.split(',')" item="roleId" open="(" separator="," close=")">
-                #{roleId}
-            </foreach>
-            )
-        </if>
-        order by u.create_date desc
-    </select>
+    </select-one>
 </ssssssss>