diff --git a/.classpath b/.classpath deleted file mode 100644 index 61f3bb9..0000000 --- a/.classpath +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 8bb3334..0000000 --- a/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -build -classes -*.class -/target/ - -target/ \ No newline at end of file diff --git a/.project b/.project deleted file mode 100644 index 1ed596f..0000000 --- a/.project +++ /dev/null @@ -1,23 +0,0 @@ - - - ModelSQL - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.m2e.core.maven2Builder - - - - - - org.eclipse.jdt.core.javanature - org.eclipse.m2e.core.maven2Nature - - diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index f9fe345..0000000 --- a/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,4 +0,0 @@ -eclipse.preferences.version=1 -encoding//src/main/java=UTF-8 -encoding//src/test/java=UTF-8 -encoding/=UTF-8 diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 529ef07..0000000 --- a/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,13 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs deleted file mode 100644 index 14b697b..0000000 --- a/.settings/org.eclipse.m2e.core.prefs +++ /dev/null @@ -1,4 +0,0 @@ -activeProfiles= -eclipse.preferences.version=1 -resolveWorkspaceProjects=true -version=1 diff --git a/ModelSQL.jar b/ModelSQL.jar new file mode 100644 index 0000000..60fab89 Binary files /dev/null and b/ModelSQL.jar differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..c421945 --- /dev/null +++ b/index.html @@ -0,0 +1,167 @@ + + + + + + ModelSQL by ithander + + + + + + + +
+
+

ModelSQL

+

根据实体Bean生成常用SQL

+ +

在GitHub中查看项目 ithander/ModelSQL

+ + + +
+
+

+欢迎使用ModelSQL

+ +

欢迎使用ModelSQL!
+ ModelSQL的作用是帮助开发人员生成常用的SQL语句,以摆脱对Mybatis的依赖,及繁琐的文件配置。
+ ModelSQL无依赖任何第三方Jar。

+ +

+快速上手

+ + +

+生成 Insert SQL

+ + + +

例如:我们有一个User实体类,其内有id,uname,age,email 等字段信息。我们来用ModelSQL来生成相关的Insert SQL

+ ModelSQL ms=new ModelSQL(User.class); + ms.insertSQL(false); +

返回字符串:
insert into sys_user_info(id,uname,age,email) values (?,?,?,?)

+ ms.insertSQL(true); +

返回字符串:
insert into sys_user_info(id,uname,age,email) values (:id,:uname,:age,:email)

+

其中User所对应的表是用注解@Table来标示的

+ +
+ User u=new User();
+ u.setId(123546);
+ u.setAge(25);
+ u.setEmail("abc@yeah.net");
+ u.setUname("sandy");
+ ms.insertSQL(u);
+

返回字符串:
insert into sys_user_info(id,uname,age,email) values (123546,'sandy',25,'abc@yeah.net')

+ + +
+ Map u=new HashMap();
+ u.put("id",123546);
+ //u.put("age",25);//不存在字段自动过虑
+ u.put("other","good job good boy");//无效字段不会做处理
+ u.put("uname","haha");
+ ms.insertSQL(u);
+

返回字符串:
insert into sys_user_info(id,uname) values (123546,'haha')

+
+ +

+生成 Update SQL

+ + + + ms.updateSQL(false); +

返回字符串:
update sys_user_info set uname=?,age=?,email=? where id=?

+ ms.updateSQL(true); +

返回字符串:
update sys_user_info set uname=:uname,age=:age,email=:email where id=:id

+ +
+ User u=new User();
+ u.setId(123546);
+ u.setAge(25);
+ u.setEmail(null);
+ u.setUname("sandy");
+ ms.updateSQL(u);//如果参数为实体类则全量更新,即使有字段为空
+

返回字符串:
update sys_user_info set uname='sandy',age=0,email=NULL where id=1200

+ + +
+ Map u=new HashMap();
+ u.put("id",13);
+ //u.put("age",25);//不存在字段自动过虑
+ u.put("other","good job good boy");//无效字段不会做处理
+ u.put("uname","haha");
+ ms.insertSQL(u);//如果能数为Map则,更新在Map中存在的字段
+

返回字符串:
update sys_user_info set uname='haha' where id=13

+
+ +

+生成 Delete SQL

+ + + + ms.deleteSQL(false); +

返回字符串:
delete from sys_user_info where id=?

+ ms.deleteSQL(true); +

返回字符串:
delete from sys_user_info where id=:id

+ +
+ + ms.deleteSQL("1","2","3");
+

返回字符串:
delete from sys_user_info where id in (1,2,3)

+ + ms.deleteSQL("1");
+

返回字符串:
delete from sys_user_info where id =1

+ +
+ Map u=new HashMap();
+ u.put("id",13);
+ //u.put("uname","haha");//不存在字段自动过虑
+ u.put("other","good job good boy");//无效字段不会做处理
+ u.put("age",25);
+ ms.deleteSQL(u);//根据条件删除
+

返回字符串:
delete from sys_user_info where id=13 and age=25

+
+ + + +

+生成 Select SQL

+ + ms.select(); +

返回字符串:
select s21.id,s21.uname,s21.age,s21.email from sys_user_info s21

+ ms.listSQL(0,10); +

返回字符串:
select s21.id,s21.uname,s21.age,s21.email from sys_user_info s21 limit 0,10

+ + Map u=new HashMap();
+ u.put("id", "13");
+ u.put("age", 25);
+ ms.listSQL(u); +

返回字符串:
select s21.id,s21.uname,s21.age,s21.email from sys_user_info s21 where s21.id=13 and s21.age=25

+ + ModelSQL mm=new ModelSQL(User.class); + ms.select().leftJoin(mm).on("id", "id","uname","uname"); +

返回字符串:
select s21.id,s21.uname,s21.age,s21.email,s0.id,s0.uname,s0.age,s0.email from sys_user_info s21 left join sys_user_info s0 on s21.id=s0.id and s21.uname=s0.uname

+
+ +

+支持 / 联系

+ +

如果有任何问题可以查看源码 源码 或 与我联系 我会尽力提供帮助!
QQ:3218138121

+
+
+

该项目由 ithang创建并维护

+

Hosted on GitHub Pages — Theme by

+
+
+ + + + diff --git a/javascripts/scale.fix.js b/javascripts/scale.fix.js new file mode 100644 index 0000000..87a40ca --- /dev/null +++ b/javascripts/scale.fix.js @@ -0,0 +1,17 @@ +var metas = document.getElementsByTagName('meta'); +var i; +if (navigator.userAgent.match(/iPhone/i)) { + for (i=0; i` element will link to the contributor’s GitHub Profile. For example: In 2007, Chris Wanstrath (@defunkt), PJ Hyett (@pjhyett), and Tom Preston-Werner (@mojombo) founded GitHub.\r\n\r\n### Support or Contact\r\nHaving trouble with Pages? Check out our [documentation](https://help.github.com/pages) or [contact support](https://github.com/contact) and we’ll help you sort it out.\r\n", + "note": "Don't delete this file! It's used internally to help with page regeneration." +} \ No newline at end of file diff --git a/pom.xml b/pom.xml deleted file mode 100644 index ab5da29..0000000 --- a/pom.xml +++ /dev/null @@ -1,75 +0,0 @@ - - 4.0.0 - - org.ithang - ModelSQL - 1.1 - jar - - ModelSQL - http://maven.apache.org - - - UTF-8 - - - - - log4j - log4j - 1.2.17 - - - com.google.code.gson - gson - 2.8.0 - - - commons-io - commons-io - 2.5 - - - commons-dbutils - commons-dbutils - 1.6 - - - org.freemarker - freemarker - 2.3.25-incubating - - - javax.servlet - javax.servlet-api - 3.1.0 - - - org.springframework - spring-jdbc - 4.3.8.RELEASE - - - junit - junit - 4.12 - test - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 2.3.2 - - 1.8 - 1.8 - - - - - - diff --git a/readme.txt b/readme.txt deleted file mode 100644 index 9038acb..0000000 --- a/readme.txt +++ /dev/null @@ -1,5 +0,0 @@ -ModelSQL -简单的SQL不必配置! -为了消除对MyBatis的依赖 -为了更轻松的搞开发,而诞生的项目。 -ModelSQL+DBUtils \ No newline at end of file diff --git a/src/main/java/org/ithang/Limit.java b/src/main/java/org/ithang/Limit.java deleted file mode 100644 index d9bdc35..0000000 --- a/src/main/java/org/ithang/Limit.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.ithang; - -public class Limit { - - private StringBuilder sb=null; - - public Limit(StringBuilder _sb){ - sb=_sb; - } - /** - * 分页 - * @param from - * @param size - * @return - */ - public String limit(int from,int size){ - sb.append(" limit ").append(from).append(",").append(size); - return sb.toString(); - } - - public String toSQL(){ - return sb.toString(); - } - - @Override - public String toString() { - return sb.toString(); - } - - -} diff --git a/src/main/java/org/ithang/MSQL.java b/src/main/java/org/ithang/MSQL.java deleted file mode 100644 index fb41604..0000000 --- a/src/main/java/org/ithang/MSQL.java +++ /dev/null @@ -1,166 +0,0 @@ -package org.ithang; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -/** - * 主要工具类,功能:根据实体类生成SQL - * @author ithang - * - */ -public class MSQL { - - //private static boolean cache=false;//是否缓存解析实体类信息 (该功能要主用于生产环境,业务实体类不变的情况下,用于提高解析效率) - private static Map modelFields=new ConcurrentHashMap<>(50); - - - public static String select(Class cls,String ...fieldNames){ - StringBuilder sb=new StringBuilder(); - Mod md=getMod(cls); - sb.append("select "); - - if(null!=fieldNames&&fieldNames.length>0){ - int i=0; - for(String fieldName:fieldNames){ - if(i>0){ - sb.append(" , "); - } - sb.append(md.getColumnName(fieldName)); - i++; - } - }else{ - String[] columnNames=md.getColumnNames(); - if(null!=columnNames){ - int i=0; - for(String cm:columnNames){ - if(i>0){ - sb.append(","); - } - sb.append(cm); - i++; - } - } - } - sb.append(" from ").append(md.getTableName()); - return sb.toString(); - } - - public static String insert(Class cls){ - StringBuilder sb=new StringBuilder(); - Mod md=getMod(cls); - sb.append("insert into ").append(md.getTableName()); - String[] columnNames=md.getColumnNames(); - String[] fieldNames=md.getFieldNames(); - if(null!=columnNames){ - int i=0; - sb.append("("); - for(String cm:columnNames){ - if(i>0){ - sb.append(","); - } - sb.append(cm); - i++; - } - sb.append(")"); - } - sb.append("values"); - if(null!=fieldNames){ - int i=0; - sb.append("("); - for(String cm:fieldNames){ - if(i>0){ - sb.append(","); - } - sb.append(":").append(cm); - i++; - } - sb.append(")"); - } - return sb.toString(); - } - - public static String update(Class cls,String ...fieldNames){ - StringBuilder sb=new StringBuilder(); - Mod md=getMod(cls); - String[] primaryFieldNames=md.getPrimaryFieldNames(); - sb.append("update ").append(md.getTableName()); - if(null==fieldNames){ - fieldNames=md.getFieldNames(); - } - int i=0; - sb.append(" set "); - for(String fieldName:fieldNames){ - - for(String pfn:primaryFieldNames){ - if(fieldName==pfn){ - continue; - } - } - - if(i>0){ - sb.append(" , "); - } - sb.append(md.getColumnName(fieldName)).append("=:").append(fieldName); - i++; - } - - sb.append(" where "); - i=0; - boolean named=primaryFieldNames.length>2?true:false; - for(String fieldName:primaryFieldNames){ - if(i>0){ - sb.append(" and "); - } - sb.append(fieldName); - if(named){ - sb.append("=:").append(md.getColumnName(fieldName)); - }else{ - sb.append("=?"); - } - i++; - } - return sb.toString(); - } - - public static String delete(Class cls){ - StringBuilder sb=new StringBuilder(); - Mod md=getMod(cls); - String[] primaryFieldNames=md.getPrimaryFieldNames(); - - sb.append("delete from ").append(md.getTableName()); - - if(null!=primaryFieldNames&&primaryFieldNames.length>0){ - sb.append(" where "); - boolean named=primaryFieldNames.length>1?true:false; - int i=0; - for(String fieldName:primaryFieldNames){ - if(i>0){ - sb.append(" and "); - } - sb.append(md.getColumnName(fieldName)); - if(named){ - sb.append("=:").append(md.getColumnName(fieldName)); - }else{ - sb.append("=?"); - } - i++; - } - } - - return sb.toString(); - } - - private static Mod getMod(Class cls){ - if(null!=modelFields){ - if(modelFields.containsKey(cls.getName())){ - return modelFields.get(cls.getName()); - }else{ - Mod mod=new Mod(cls); - modelFields.put(cls.getName(), mod); - return mod; - } - } - return new Mod(cls); - } - -} diff --git a/src/main/java/org/ithang/Mod.java b/src/main/java/org/ithang/Mod.java deleted file mode 100644 index 56afebc..0000000 --- a/src/main/java/org/ithang/Mod.java +++ /dev/null @@ -1,90 +0,0 @@ -package org.ithang; - -import java.lang.reflect.Field; - -public class Mod { - - private Class cls; - private Field[] fields; - - - private volatile String tableName; - private volatile String[] columnNames; - private volatile String[] fieldNames; - private volatile String[] primaryFieldNames; - - - public Mod(Class cls){ - setCls(cls); - setFields(cls.getDeclaredFields()); - tableName=ModTool.getTableName(this); - fieldNames=ModTool.getFieldNames(this); - columnNames=ModTool.getColumnNames(this); - primaryFieldNames=ModTool.getPrimaryFieldNames(this); - } - - - public String getTableName(){ - if(null==tableName){ - tableName=ModTool.getTableName(this); - } - return tableName; - } - - public String[] getPrimaryFieldNames(){ - if(null==primaryFieldNames||0==primaryFieldNames.length){ - primaryFieldNames=ModTool.getPrimaryFieldNames(this); - } - return primaryFieldNames; - } - - public String[] getFieldNames(){ - if(null==fieldNames||0==fieldNames.length){ - fieldNames=ModTool.getFieldNames(this); - } - return fieldNames; - } - - public String[] getColumnNames(){ - if(null==columnNames||0==columnNames.length){ - columnNames=ModTool.getColumnNames(this); - } - return columnNames; - } - - public String getColumnName(String fieldName){ - if(null!=fieldName&&fieldName.trim().length()>0){ - return ModTool.getColumnName(this, fieldName); - } - return null; - } - - public Field getField(String fieldName) { - if(null!=fields&&fields.length>0){ - for(Field field:fields){ - if(fieldName.equals(field.getName())){ - return field; - } - } - } - return null; - } - - public Field[] getFields() { - return fields; - } - - public void setFields(Field[] fields) { - this.fields = fields; - } - - public Class getCls() { - return cls; - } - - public void setCls(Class cls) { - this.cls = cls; - } - - -} diff --git a/src/main/java/org/ithang/ModTool.java b/src/main/java/org/ithang/ModTool.java deleted file mode 100644 index b5766cc..0000000 --- a/src/main/java/org/ithang/ModTool.java +++ /dev/null @@ -1,101 +0,0 @@ -package org.ithang; - -import java.lang.reflect.Field; -import java.util.Arrays; - -import org.ithang.tools.lang.StrUtils; -import org.ithang.tools.mate.Column; -import org.ithang.tools.mate.Primary; -import org.ithang.tools.mate.Table; - -public class ModTool { - - public static String getTableName(Mod md){ - if(md.getCls().isAnnotationPresent(Table.class)){ - if(md.getCls().isAnnotationPresent(Table.class)){ - return md.getCls().getAnnotation(Table.class).value(); - } - } - return StrUtils.addUnderline(md.getCls().getSimpleName()); - } - - public static String getColumnName(Mod md,String fieldName){ - Field field=md.getField(fieldName); - if(null!=field){ - if(field.isAnnotationPresent(Column.class)){ - return field.getAnnotation(Column.class).value(); - }else{ - StrUtils.addUnderline(field.getName()); - } - } - return StrUtils.addUnderline(fieldName); - } - - public static String[] getColumnNames(Mod md){ - if(null!=md&&null!=md.getFields()&&md.getFields().length>0){ - String[] columnNames=new String[md.getFields().length]; - int i=0; - for(Field field:md.getFields()){ - if(field.isAnnotationPresent(Column.class)){ - columnNames[i++]=field.getAnnotation(Column.class).value(); - }else{ - columnNames[i++]=StrUtils.addUnderline(field.getName()); - } - } - return columnNames; - } - return null; - } - - public static String[] getFieldNames(Mod md){ - if(null!=md&&null!=md.getFields()&&md.getFields().length>0){ - String[] fieldNames=new String[md.getFields().length]; - int i=0; - for(Field field:md.getFields()){ - fieldNames[i++]=field.getName(); - } - return fieldNames; - } - return null; - } - - /** - * 得到主键字段名称 - * @return - */ - public static String[] getPrimaryFieldNames(Mod md){ - if(null!=md&&null!=md.getFields()&&md.getFields().length>0){ - String[] fieldNames=new String[md.getFields().length]; - int i=0; - for(Field field:md.getFields()){ - if(field.isAnnotationPresent(Primary.class)){ - fieldNames[i++]=field.getName(); - } - } - return Arrays.copyOf(fieldNames,i); - } - return null; - } - - /** - * 得到主键字段名称 - * @return - */ - public static String[] getPrimaryColumnNames(Mod md){ - if(null!=md&&null!=md.getFields()&&md.getFields().length>0){ - String[] columnNames=new String[md.getFields().length]; - int i=0; - for(Field field:md.getFields()){ - if(field.isAnnotationPresent(Primary.class)){ - if(field.isAnnotationPresent(Column.class)){ - columnNames[i++]=field.getAnnotation(Column.class).value(); - }else{ - columnNames[i++]=StrUtils.addUnderline(field.getName()); - } - } - } - return columnNames; - } - return null; - } -} diff --git a/src/main/java/org/ithang/Model.java b/src/main/java/org/ithang/Model.java deleted file mode 100644 index 6e2bef3..0000000 --- a/src/main/java/org/ithang/Model.java +++ /dev/null @@ -1,196 +0,0 @@ -package org.ithang; - -import java.lang.reflect.Method; -import java.util.Map; - -import org.ithang.tools.lang.DateUtils; -import org.ithang.tools.lang.StrUtils; - -/** - * - * @author ithang - * 针对实体类每个字段与表中每一列的详细对应关系 - */ -@Deprecated -public class Model { - - private String tableName; - private String tableLabel;//表别名 - - private String fieldName; - private String fieldType; - - private String columnName; - private String columnType; - private int columnLen;//列长度或精度 - private String labelName;//别名 - private String desc;//备注 - private Object value;//列默认值 - private boolean isNULL;//是否允许为空,true可以为空,false不可为空 - private boolean isPrimary; - private boolean autoIncrement;//是否自增 - private String sequence;//采用的sequence,用在oracle中 - - private String type;//列对应的java类型 - - public String getTableName() { - return tableName; - } - public void setTableName(String tableName) { - this.tableName = tableName; - } - - public String getTableLabel() { - return tableLabel; - } - public void setTableLabel(String tableLabel) { - this.tableLabel = tableLabel; - } - public String getFieldName() { - return fieldName; - } - public void setFieldName(String fieldName) { - this.fieldName = fieldName; - } - public String getFieldType() { - return fieldType; - } - public void setFieldType(String fieldType) { - this.fieldType = fieldType; - } - public String getColumnName() { - return columnName; - } - public void setColumnName(String columnName) { - this.columnName = columnName; - } - public String getColumnType() { - return columnType; - } - public void setColumnType(String columnType) { - this.columnType = columnType; - } - public String getLabelName() { - return labelName; - } - public void setLabelName(String labelName) { - this.labelName = labelName; - } - public String getDesc() { - return desc; - } - public void setDesc(String desc) { - this.desc = desc; - } - public Object getValue() { - return value; - } - public void setValue(Object value) { - this.value = value; - } - public boolean isPrimary() { - return isPrimary; - } - public void setPrimary(boolean isPrimary) { - this.isPrimary = isPrimary; - } - - public String getSequence() { - return sequence; - } - public void setSequence(String sequence) { - this.sequence = sequence; - } - /** - * 从实体类里得到值 - * @param bean - * @return - */ - public Object getBeanFieldValue(Object bean){ - Method md=null; - Object r=null; - try{ - if(isPrimary&&null!=sequence&&sequence.trim().length()>0){ - return sequence+".nextVal"; - } - md=bean.getClass().getMethod("get"+StrUtils.headUpper(fieldName)); - if(null!=md){ - r=md.invoke(bean); - } - if(null==r){ - r="NULL"; - }else if("String".equals(fieldType)){ - r="'"+r+"'"; - } - }catch(Exception e){ - e.printStackTrace(); - } - - return r; - } - - /** - * 从实体类里得到值 - * @param bean - * @return - */ - public Object getMapFieldValue(Map values){ - Object r=null; - try{ - //如果是主键,判断是否有sequence存在,如果存在,则调用 - if(isPrimary&&null!=sequence&&sequence.trim().length()>0){ - return sequence+".nextVal"; - } - r=values.get(fieldName); - - if(null!=r){ - if("String".equals(fieldType)){ - r="'"+r+"'"; - } - - if("Date".equals(fieldType)){ - java.util.Date date=null; - if(r instanceof java.sql.Date){ - date=new java.util.Date(((java.sql.Date)r).getTime()); - }else{ - date=(java.util.Date)r; - } - String dateStr=DateUtils.dateToStr(date, DateUtils.YYYY_MM_DD_HH_mm_ss); - r="str_to_date('"+dateStr+"','%Y-%m-%d %H:%i:%s')"; - } - }else{ - r="NULL"; - } - - }catch(Exception e){ - e.printStackTrace(); - } - - return r; - } - public int getColumnLen() { - return columnLen; - } - public void setColumnLen(int columnLen) { - this.columnLen = columnLen; - } - public boolean isNULL() { - return isNULL; - } - public void setNULL(boolean isNULL) { - this.isNULL = isNULL; - } - public boolean isAutoIncrement() { - return autoIncrement; - } - public void setAutoIncrement(boolean autoIncrement) { - this.autoIncrement = autoIncrement; - } - public String getType() { - return type; - } - public void setType(String type) { - this.type = type; - } - -} diff --git a/src/main/java/org/ithang/ModelSQL.java b/src/main/java/org/ithang/ModelSQL.java deleted file mode 100644 index 3265278..0000000 --- a/src/main/java/org/ithang/ModelSQL.java +++ /dev/null @@ -1,733 +0,0 @@ -package org.ithang; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.ithang.tools.ModelTools; -import org.ithang.tools.lang.StrUtils; - -/** - * 用于生成SQL的唯一可用类 - * @author ithang - * - * @param - */ -@Deprecated -public class ModelSQL { - - private String tableName;//表名称 - private String tableLabel;//表别名 在ModelTools中随机出来 - private String[] columnNames;//所有表列名称 - private String[] fieldNames;//所有实体类字段名称 - private String[] columnNames_noid;//所有表列名称,不包括主键 - private String[] fieldNames_noid;//所有实体类字段名称,不包括主键 - - private String columnNameStr;//所有列名称以逗号链接的字符串 - private String fieldNameStr;//所有字段名称以逗号链接的字符串 - private String columnNameStr_noid;//所有列名称以逗号链接的字符串,不包括主键 - private String fieldNameStr_noid;//所有字段名称以逗号链接的字符串,不包括主键 - - private String fieldHodler;//例如 insert into Tab(a,b,c)values([?,?,?]) - private String fieldNameHolder;//例如 insert into Tab(a,b,c)values([:a,:b,:c]) - private String fieldHodler_noid;//例如 insert into Tab(a,b,c)values([?,?,?]),不包括主键 - private String fieldNameHolder_noid;//例如 insert into Tab(a,b,c)values([:a,:b,:c]),不包括主键 - - private String queryColumns;//带前缀的查询列 - - private int fieldNum=0; - private List models; - - private StringBuilder sb=null; //用于构建查询 - private boolean selected=false;//用于标示是否己构建查询 - private Class prototype=null;//封装类型 - private static Map> allTabs=new HashMap>(50); - - public ModelSQL(Class cls){ - setPrototype(cls); - sb=new StringBuilder(); - if(null!=allTabs.get(cls.getSimpleName())){//如果缓存中存在,则用缓存 - models=allTabs.get(cls.getSimpleName()); - }else{//如果缓存中不存在,则解析 - models=ModelTools.parseCls(cls); - allTabs.put(cls.getSimpleName(), models); - } - - if(null!=models&&models.size()>0){ - fieldNum=models.size(); - tableName=models.get(0).getTableName(); - tableLabel=models.get(0).getTableLabel(); - columnNames=new String[fieldNum]; - fieldNames=new String[fieldNum]; - - columnNames_noid=new String[fieldNum]; - fieldNames_noid=new String[fieldNum]; - - int i=0; - int ii=0; - StringBuilder sber=new StringBuilder();//构建占位符字符串 - StringBuilder sber_noid=new StringBuilder();//构建占位符字符串 - - StringBuilder sfer=new StringBuilder();//构建还前缀的查询列 - - for(Model md:models){ - fieldNames[i]=md.getFieldName(); - columnNames[i]=md.getColumnName(); - - if(0!=i++){ - sber.append(","); - sfer.append(","); - } - sber.append("?"); - sfer.append(md.getTableLabel()).append(".").append(md.getColumnName()); - - - if(!md.isPrimary()){ - fieldNames_noid[ii]=md.getFieldName(); - columnNames_noid[ii]=md.getColumnName(); - if(0!=ii++){ - sber_noid.append(","); - } - sber_noid.append("?"); - } - } - fieldNameStr=StrUtils.pkg(fieldNames, ":", ","); - fieldNameStr=fieldNameStr.substring(0,fieldNameStr.length()-1); - - fieldNameStr_noid=StrUtils.pkg(fieldNames_noid, ":", ","); - fieldNameStr_noid=fieldNameStr_noid.substring(0,fieldNameStr_noid.length()-1); - - columnNameStr=StrUtils.pkg(columnNames, "", ","); - columnNameStr=columnNameStr.substring(0,columnNameStr.length()-1); - - columnNameStr_noid=StrUtils.pkg(columnNames_noid, "", ","); - columnNameStr_noid=columnNameStr_noid.substring(0,columnNameStr_noid.length()-1); - - fieldHodler=sber.toString(); - fieldNameHolder=StrUtils.pkg(fieldNames, ":", ","); - fieldNameHolder=fieldNameHolder.substring(0,fieldNameHolder.length()-1); - - fieldHodler_noid=sber.toString(); - fieldNameHolder_noid=StrUtils.pkg(fieldNames_noid, ":", ","); - fieldNameHolder_noid=fieldNameHolder_noid.substring(0,fieldNameHolder_noid.length()-1); - - queryColumns=sfer.toString(); - } - } - - /** - * 生成insertSQL,默认byName=false;includeID=true - * @return - */ - public String insertSQL(){ - return insertSQL(false,true); - } - - /** - * 生成insert sql 不带参数值 - * @param byName 是否字段名做为参数 - * @return - */ - public String insertSQL(boolean byName){ - return insertSQL(byName,true); - } - - /** - * 生成insert语句 - * @param byName 是否能过字段匹配参数,true是,false否 - * @param includeID 是否包括ID字段 - * @return - */ - public String insertSQL(boolean byName,boolean includeID){ - StringBuilder sber=new StringBuilder(); - sber.append("insert into ").append(tableName); - sber.append("("); - if(includeID){ - sber.append(columnNameStr); - }else{ - sber.append(columnNameStr_noid); - } - - sber.append(") values ("); - - if(byName){ - if(includeID){ - sber.append(fieldNameHolder); - }else{ - sber.append(fieldNameHolder_noid); - } - }else{ - if(includeID){ - sber.append(fieldHodler); - }else{ - sber.append(fieldHodler_noid); - } - } - sber.append(")"); - return sber.toString(); - } - - - /** - * 根据实体Bean生成insert sql - * @param bean - * @return - */ - public String insertSQL(T bean){ - StringBuilder sber=new StringBuilder(); - sber.append("insert into ").append(tableName); - sber.append("(").append(columnNameStr).append(") values ("); - - for(int i=0;i map){ - StringBuilder sber=new StringBuilder(); - sber.append("insert into ").append(tableName); - sber.append("("); - int i=0; - for(String fieldName:fieldNames){ - if(map.containsKey(fieldName)){ - if(0!=i++){ - sber.append(","); - } - sber.append(getModel(fieldName).getColumnName()); - } - } - sber.append(") values ("); - i=0; - for(String fieldName:fieldNames){ - if(map.containsKey(fieldName)){ - if(0!=i++){ - sber.append(","); - } - Model m=getModel(fieldName); - sber.append(m.getMapFieldValue(map)); - } - } - sber.append(")"); - return sber.toString(); - } - - - public String insertMapsSQL(List> maps){ - StringBuilder sber=new StringBuilder(); - sber.append("insert into ").append(tableName); - sber.append("(").append(columnNameStr).append(") values "); - - maps.forEach(mp->{ - int i=0; - for(String fieldName:fieldNames){ - if(0!=i++){ - sber.append(","); - }else{ - sber.append("("); - } - Model m=getModel(fieldName); - sber.append(m.getMapFieldValue(mp)); - } - if(fieldNum==i){ - sber.append("),"); - } - }); - return sber.delete(sber.length()-1, sber.length()).toString(); - } - - public String insertBeansSQL(List beans){ - StringBuilder sber=new StringBuilder(); - sber.append("insert into ").append(tableName); - sber.append("(").append(columnNameStr).append(") values "); - - beans.forEach(bean->{ - int i=0; - for(;i0){ - where.append(" and "); - } - where.append(columnNames[i]).append("="); - if(byName){ - where.append(":").append(fieldNames[i]); - }else{ - where.append("?"); - } - }else{ - if(k++>0){ - sber.append(","); - } - sber.append(columnNames[i]).append("="); - if(byName){ - sber.append(":").append(fieldNames[i]); - }else{ - sber.append("?"); - } - } - } - sber.append(where.toString()); - return sber.toString(); - } - - /** - * - * @param bean - * @return - */ - public String updateSQL(Object bean){ - StringBuilder sber=new StringBuilder(); - sber.append("update ").append(tableName).append(" set "); - StringBuilder where=new StringBuilder(" where "); - int k=0; - int f=0; - for(int i=0;i0){ - where.append(" and "); - } - where.append(columnNames[i]).append("=").append(m.getBeanFieldValue(bean)); - }else{ - if(k++>0){ - sber.append(","); - } - sber.append(columnNames[i]).append("=").append(m.getBeanFieldValue(bean)); - } - } - sber.append(where.toString()); - return sber.toString(); - } - - /** - * 根据map生成update sql - * @param values - * @return - */ - public String updateSQL(Map values){ - StringBuilder sber=new StringBuilder(); - sber.append("update ").append(tableName).append(" set "); - StringBuilder where=new StringBuilder(" where "); - int k=0; - int f=0; - for(int i=0;i0){ - where.append(" and "); - } - where.append(columnNames[i]).append("=").append(m.getMapFieldValue(values)); - }else{ - if(k++>0){ - sber.append(","); - } - sber.append(columnNames[i]).append("=").append(m.getMapFieldValue(values)); - } - } - sber.append(where.toString()); - return sber.toString(); - } - - /** - * - * @param byName - * @return - */ - public String deleteSQL(boolean byName){ - StringBuilder sber=new StringBuilder("delete from "); - sber.append(tableName).append(" where "); - Model[] ms=getPrimaryModel(); - int i=0; - for(Model m:ms){ - if(i++>0){ - sber.append(" and "); - } - sber.append(m.getColumnName()).append("="); - if(byName){ - sber.append(":").append(m.getFieldName()); - }else{ - sber.append("?"); - } - } - return sber.toString(); - } - - /** - * 批量删除,适合只有一个主键字段 - * @param ids - * @return - */ - public String deleteSQL(String...ids){ - StringBuilder sber=new StringBuilder("delete from "); - sber.append(tableName).append(" where "); - Model[] ms=getPrimaryModel(); - if(null!=ids&&ids.length>0){ - if(ids.length>1){ - int i=0; - for(Model m:ms){ - if(i++>0){ - sber.append(" and "); - } - sber.append(m.getColumnName()).append(" in ("); - if("String".equals(m.getFieldType())){ - sber.append(StrUtils.pkg(ids,"'","',")); - }else{ - sber.append(StrUtils.pkg(ids,"",",")); - } - sber.delete(sber.length()-1, sber.length()); - sber.append(")"); - } - }else{ - sber.append(ms[0].getColumnName()).append("="); - if("String".equals(ms[0].getFieldType())){ - sber.append("'").append(ids[0]).append("'"); - }else{ - sber.append(ids[0]); - } - } - }else{ - return deleteSQL(false); - } - - return sber.toString(); - } - - /** - * 根据条件删除 - * @param values - * @return - */ - public String deleteSQL(Map values){ - StringBuilder sber=new StringBuilder("delete from "); - sber.append(tableName).append(" where "); - int i=0; - for(Model m:models){ - if(values.containsKey(m.getFieldName())){ - if(i++>0){ - sber.append(" and "); - } - sber.append(m.getColumnName()).append("=").append(m.getMapFieldValue(values)); - } - } - return sber.toString(); - } - - /** - * 查询起步 - * @return modelSQL 在其础上进行灵活配置 - */ - public ModelSQL select(){ - if(selected){//如果己构建则删除,因为可能包含了where join 等子句 - sb.delete(0, sb.length()); - } - sb.append("select "); - sb.append(queryColumns).append(" from ").append(tableName).append(" ").append(tableLabel); - selected=true; - return this; - } - - /** - * 简单分页查询,相当于select+limit - * @param from - * @param size - * @return - */ - public String listSQL(int from,int size){ - return select().limit(from, size); - } - - /** - * 简单综合查询,相当于select+where - * @param values - * @return - */ - public String listSQL(Map values){ - return select().where(values).toString(); - } - - /** - * 直接返回一个新构建的StringBuilder让使用者自己构建where - * @param columnName - * @param columnValue - * @return - */ - public StringBuilder where(String columnName,Object columnValue){ - if(!selected){//如果未生成select语句,则生成 - select(); - } - sb.append(" where ").append(columnName).append("="); - if(columnValue instanceof String){ - sb.append("'").append(columnValue).append("'"); - }else{ - sb.append(columnValue); - } - - return sb; - } - - /** - * 简单综合查询 - * @param values - * @return - */ - public StringBuilder where(Map values){ - if(!selected){//如果未生成select语句,则生成 - select(); - } - if(null!=values&&values.size()>0){ - sb.append(" where "); - int i=0; - for(Model m:models){ - if(values.containsKey(m.getFieldName())){ - if(i++>0){ - sb.append(" and "); - } - sb.append(tableLabel).append(".").append(m.getColumnName()).append("=").append(m.getMapFieldValue(values)); - } - } - if(0==i){ - sb.append(" 1=1"); - } - } - - return sb; - } - - public Limit ascGroupBy(String..._columnNames){ - if(!selected){ - select(); - } - if(null!=_columnNames&&_columnNames.length>0){ - sb.append(" group by "); - for(String cn:_columnNames){ - sb.append(tableLabel).append(".").append(cn).append(","); - } - sb.delete(sb.length()-1, sb.length()); - sb.append(" asc "); - } - return new Limit(sb); - } - - public Limit descGroupBy(String..._columnNames){ - if(!selected){ - select(); - } - if(null!=_columnNames&&_columnNames.length>0){ - sb.append(" group by "); - for(String cn:_columnNames){ - sb.append(tableLabel).append(".").append(cn).append(","); - } - sb.delete(sb.length()-1, sb.length()); - sb.append(" desc "); - } - return new Limit(sb); - } - - /** - * 分页 - * @param from - * @param size - * @return - */ - public String limit(int from,int size){ - if(!selected){ - select(); - } - sb.append(" limit ").append(from).append(",").append(size); - return sb.toString(); - } - - public ModelSQL leftJoin(ModelSQL _ms,String acolumnName,String bcolumnName){ - if(!selected){ - select(); - } - sb.insert(sb.indexOf("from")-1,","+_ms.getQureyColumns()); - sb.append(" left join ").append(_ms.getTableName()).append(" ").append(_ms.getTableLabel()); - sb.append(" on "); - sb.append(" ").append(getTableLabel()).append(".").append(acolumnName).append("=").append(_ms.getTableLabel()).append(".").append(bcolumnName); - return this; - } - - public ModelSQL leftJoin(ModelSQL _ms,String[] acolumnNames,String[] bcolumnNames){ - if(!selected){ - select(); - } - sb.insert(sb.indexOf("from")-1,","+_ms.getQureyColumns()); - sb.append(" left join ").append(_ms.getTableName()).append(" ").append(_ms.getTableLabel()); - sb.append(" on "); - int len=acolumnNames.length>bcolumnNames.length?bcolumnNames.length:acolumnNames.length; - for(int i=0;i innerJoin(ModelSQL _ms,String acolumnName,String bcolumnName){ - if(!selected){ - select(); - } - sb.insert(sb.indexOf("from")-1,","+_ms.getQureyColumns()); - sb.append(" inner join ").append(_ms.getTableName()).append(" ").append(_ms.getTableLabel()); - sb.append(" ").append(getTableLabel()).append(".").append(acolumnName).append("=").append(_ms.getTableLabel()).append(".").append(bcolumnName); - return this; - } - - public ModelSQL innerJoin(ModelSQL _ms,String[] acolumnNames,String[] bcolumnNames){ - if(!selected){ - select(); - } - sb.insert(sb.indexOf("from")-1,","+_ms.getQureyColumns()); - sb.append(" inner join ").append(_ms.getTableName()).append(" ").append(_ms.getTableLabel()); - int len=acolumnNames.length>bcolumnNames.length?bcolumnNames.length:acolumnNames.length; - for(int i=0;i0){ - sber.append("(").append(model.getColumnLen()).append(")"); - } - - //是否可为空 - if(model.isNULL()){ - sber.append(" NULL "); - }else{ - sber.append(" NOT NULL "); - } - - if(null!=model.getValue()){ - sber.append(" default "); - if("varchar".equals(model.getColumnType())||model.getColumnType().toLowerCase().endsWith("text")){ - sber.append("'").append(model.getValue()).append("'"); - }else{ - sber.append(model.getValue()); - } - } - if(model.isAutoIncrement()){ - sber.append(" AUTO_INCREMENT"); - } - sber.append(",\n"); - } - - if(null!=primaryKey){ - sber.append("\t\t\tPRIMARY KEY (").append(primaryKey).append(")"); - }else{ - sber.delete(sber.length()-2, sber.length()); - } - sber.append("\n\t)ENGINE=InnoDB DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci;"); - return sber.toString(); - } - - public String getQureyColumns(){ - return queryColumns; - } - - public String getTableName(){ - return tableName; - } - - public String getTableLabel(){ - return tableLabel; - } - - public String toSQL(){ - return sb.toString(); - } - - private Model[] getPrimaryModel(){ - Model[] ms=new Model[fieldNum]; - int i=0; - for(Model m:models){ - if(m.isPrimary()){ - ms[i++]=m; - } - } - return Arrays.copyOf(ms, i); - } - - private Model getModel(String fieldName){ - Model model=null; - for(Model m:models){ - if(fieldName.equals(m.getFieldName())){ - model=m; - break; - } - } - return model; - } - - protected StringBuilder getSQL(){ - return sb; - } - - @Override - public String toString() { - return toSQL(); - } - - public Class getPrototype() { - return prototype; - } - - public void setPrototype(Class prototype) { - this.prototype = prototype; - } - -} diff --git a/src/main/java/org/ithang/ON.java b/src/main/java/org/ithang/ON.java deleted file mode 100644 index fe008d9..0000000 --- a/src/main/java/org/ithang/ON.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.ithang; - -@Deprecated -public class ON { - - private String atLabel; - private String btLabel; - private ModelSQL host; - public ON(ModelSQL _host,String btLabel){ - this.host=_host; - this.atLabel=host.getTableLabel(); - this.btLabel=btLabel; - host.getSQL().append(" on "); - } - - public ModelSQL on(String afieldName,String bfieldName){ - host.getSQL().append(atLabel).append(".").append(afieldName); - host.getSQL().append("=").append(btLabel).append(".").append(bfieldName); - return host; - } - - -} diff --git a/src/main/java/org/ithang/tools/ModelTools.java b/src/main/java/org/ithang/tools/ModelTools.java deleted file mode 100644 index e2a0091..0000000 --- a/src/main/java/org/ithang/tools/ModelTools.java +++ /dev/null @@ -1,190 +0,0 @@ -package org.ithang.tools; - -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - -import org.apache.log4j.Logger; -import org.ithang.Model; -import org.ithang.tools.lang.StrUtils; -import org.ithang.tools.mate.Column; -import org.ithang.tools.mate.Ignore; -import org.ithang.tools.mate.Primary; -import org.ithang.tools.mate.Table; - -public final class ModelTools { - - private final static Random r=new Random(System.currentTimeMillis()); - - private final static String[] tableLabels=new String[]{"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","x","y","z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","X","Y","Z"}; - - private final static Logger logger=Logger.getLogger(ModelTools.class); - /** - * 解析class对象,获得所有字段属性的相关信息 - * @param cls - * @return List 每个字段对应一个Model对象 - */ - public static List parseCls(Class cls){ - String tableName=null; - String tableLabel=null; - Model m=null; - Field[] fields=null; - List mds=null; - try{ - tableName=getTableName(cls); - //为表创建一个别名,用于字段前缀 - tableLabel=tableLabels[r.nextInt(tableLabels.length)]+String.valueOf(r.nextInt(36)); - fields=cls.getDeclaredFields(); - - if(null==fields||0==fields.length){ - logger.error("无效Class对象,得不到任何字段信息!"); - return null; - } - - mds=new ArrayList(fields.length); - for(Field field:fields){ - - //不处理序列化字段 - if("serialVersionUID".equals(field.getName())){ - continue; - } - - //如果存在ignore注解,则表示不处理该字段,该字段不对应表中任何列 - if(field.isAnnotationPresent(Ignore.class)){ - continue; - } - - m=new Model(); - m.setTableName(tableName); - m.setFieldName(field.getName()); - m.setFieldType(field.getType().getSimpleName()); - m.setTableLabel(tableLabel); - - //判断是否存在column注解,如果存在则用注解值作为列名 - if(field.isAnnotationPresent(Column.class)){ - Column column=field.getAnnotation(Column.class); - m.setColumnName(column.value()); - if(StrUtils.isNotBlank(column.defaultValue())){ - m.setValue(column.defaultValue()); - }else{ - m.setValue("NULL"); - } - }else{ - m.setColumnName(StrUtils.addUnderline(field.getName())); - m.setValue("NULL"); - } - - //判断是不是主键 - if(field.isAnnotationPresent(Primary.class)){ - Primary pri=field.getAnnotation(Primary.class); - if(null!=pri&&null!=pri.Seq()&&pri.Seq().trim().length()>0){//设置主键sequence - m.setSequence(pri.Seq()); - } - m.setPrimary(true); - }else{ - m.setPrimary(false); - } - - mds.add(m); - } - }catch(Exception e){ - e.printStackTrace(); - } - return mds; - } - - /** - * 得到表名 - * @param cls - * @return - */ - public static String getTableName(Class cls){ - if(cls.isAnnotationPresent(Table.class)){ - Table table=cls.getAnnotation(Table.class); - if(null!=table&&StrUtils.isNotBlank(table.value())){ - return table.value(); - } - } - return StrUtils.addUnderline(cls.getSimpleName()); - } - - public static Field getField(Class cls,String fieldName){ - Field field=null; - try{ - field=cls.getDeclaredField(fieldName); - }catch(Exception e){ - e.printStackTrace(); - } - return field; - } - - public static String getFieldValue(Object bean,String fieldName){ - Field field=null; - try{ - field=getField(bean.getClass(),fieldName); - Class fieldType=field.getType(); - Object v=bean.getClass().getMethod("get"+StrUtils.headUpper(fieldName)).invoke(bean); - if(fieldType==String.class){ - return "'"+(v==null?"":v)+"'"; - }else{ - return v==null?"0":String.valueOf(v); - } - }catch(Exception e){ - e.printStackTrace(); - } - return null; - } - - public static String[] getFieldNames(Class cls){ - String[] fieldNames=null; - try{ - Field[] fields=cls.getDeclaredFields(); - if(null!=fields&&fields.length>0){ - fieldNames=new String[fields.length]; - int i=0; - for(Field field:fields){ - fieldNames[i++]=field.getName(); - } - } - }catch(Exception e){ - e.printStackTrace(); - } - return fieldNames; - } - - public static String[] getColumnNames(Class cls){ - String[] columnNames=null; - try{ - Field[] fields=cls.getDeclaredFields(); - if(null!=fields&&fields.length>0){ - columnNames=new String[fields.length]; - int i=0; - for(Field field:fields){ - if(field.isAnnotationPresent(Column.class)){ - columnNames[i++]=field.getAnnotation(Column.class).value(); - }else{ - columnNames[i++]=StrUtils.addUnderline(field.getName()); - } - } - } - }catch(Exception e){ - e.printStackTrace(); - } - return columnNames; - } - - /*public static void generBeanFromMySQL(Connection conn,String schema) throws SQLException{ - QueryRunner qr=new QueryRunner(); - List tables=qr.query(conn,"select table_name from information_schema.columns where table_schema='"+schema+"'", new ColumnListHandler()); - if(null!=tables&&tables.size()>0){ - for(String table:tables){ - List columns=qr.query(conn, "select table_name,column_name,is_nullable,data_type,column_key,character_maximum_length len from information_schema.columns where table_schema='"+schema+"'", new BeanListHandler(Column.class)); - } - } - } - - private static List parseModelFromTable(List columns){ - return null; - }*/ -} diff --git a/src/main/java/org/ithang/tools/SQLGener.java b/src/main/java/org/ithang/tools/SQLGener.java deleted file mode 100644 index 4a3e699..0000000 --- a/src/main/java/org/ithang/tools/SQLGener.java +++ /dev/null @@ -1,154 +0,0 @@ -package org.ithang.tools; - -import java.lang.reflect.Field; -import java.util.Map; - -import org.ithang.tools.lang.StrUtils; - -@Deprecated -public class SQLGener { - /** - * 根据实体类生成Insert SQL - * @param bean - * @return - */ - public static String insert(Object bean){ - StringBuilder sber=new StringBuilder(); - String[] fieldNames=ModelTools.getFieldNames(bean.getClass()); - sber.append("insert into ").append(ModelTools.getTableName(bean.getClass())); - sber.append("(").append(StrUtils.trimSuffix(StrUtils.pkg(fieldNames, "", ","),",")).append(")"); - sber.append(" values ("); - int i=0; - for(String fieldName:fieldNames){ - sber.append(ModelTools.getFieldValue(bean, fieldName)); - if(i cls,Map values){ - StringBuilder sber=new StringBuilder(); - String[] fieldNames=ModelTools.getFieldNames(cls); - String[] columnNames=ModelTools.getColumnNames(cls); - sber.append("insert into ").append(ModelTools.getTableName(cls)); - sber.append("(").append(StrUtils.trimSuffix(StrUtils.pkg(columnNames, "", ","),",")).append(")"); - sber.append(" values ("); - int i=0; - for(String fieldName:fieldNames){ - Field field=ModelTools.getField(cls, fieldName); - if(field.getType()==String.class){ - sber.append("'").append(values.get(fieldName)).append("'"); - }else{ - sber.append(values.get(fieldName)); - } - if(i cls,Object...values){ - StringBuilder sber=new StringBuilder(); - String[] fieldNames=ModelTools.getFieldNames(cls); - String[] columnNames=ModelTools.getColumnNames(cls); - sber.append("insert into ").append(ModelTools.getTableName(cls)); - sber.append("(").append(StrUtils.trimSuffix(StrUtils.pkg(columnNames, "", ","),",")).append(")"); - sber.append(" values ("); - - if(null!=values&&values.length>0){ - int i=0; - for(Object value:values){ - if(value.getClass()==String.class){ - sber.append("'").append(value).append("'"); - }else{ - sber.append(value); - } - if(i cls,Map values){ - return null; - } - - /** - * 根据类信息及主键ID值生成Delete SQL - * @param cls - * @param id 主键值 - * @return - */ - public static String deleteSQL(Class cls,Object... id){ - return null; - } - - /** - * 根据类信息生成全量Select SQL - * @param cls - * @return - */ - public static String selectSQL(Class cls){ - return null; - } - - /** - * 根据条件生成条件Select SQL - * @param cls - * @param values - * @return - */ - public static String selectSQL(Class cls,Map values){ - return null; - } - -} diff --git a/src/main/java/org/ithang/tools/SQLLoader.java b/src/main/java/org/ithang/tools/SQLLoader.java deleted file mode 100644 index a0e5b70..0000000 --- a/src/main/java/org/ithang/tools/SQLLoader.java +++ /dev/null @@ -1,110 +0,0 @@ -package org.ithang.tools; - -import java.io.File; -import java.io.FileFilter; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.Reader; -import java.io.StringReader; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.commons.io.IOUtils; -import org.apache.log4j.Logger; - -import freemarker.cache.TemplateLoader; - -public class SQLLoader implements TemplateLoader { - - - private static Logger logger=Logger.getLogger(SQLLoader.class); - private final static Map templates=new HashMap(60); - - static{ - File classDir=new File(SQLLoader.class.getResource("/").getPath()); - List files=new ArrayList(); - loadSQLFile(classDir,files); - files.forEach(file->{ - loadTemplate(file); - }); - } - - public static void loadSQLFile(File dir,List sqlFiles){ - File[] files=dir.listFiles(new FileFilter(){ - - @Override - public boolean accept(File subDir) { - if(subDir.isDirectory()){ - loadSQLFile(subDir,sqlFiles); - return false; - } - if(subDir.getName().endsWith(".md")){ - return true; - } - return false; - } - - }); - - for(File f:files){ - sqlFiles.add(f); - } - } - - public static void loadTemplate(File sqlFile){ - try{ - FileInputStream fis=new FileInputStream(sqlFile); - List lines=IOUtils.readLines(fis, "UTF-8"); - StringBuilder sber=new StringBuilder(); - String key=null; - for(String line:lines){ - if(line.startsWith("*")){ - continue; - } - if(line.startsWith("#")){ - if(null!=key){ - templates.put(key, sber.toString()); - sber.delete(0, sber.length()); - } - key=line.replaceFirst("#", "").trim(); - }else{ - sber.append(line); - } - } - if(null!=key){ - templates.put(key,sber.toString()); - } - fis.close(); - }catch(Exception e){ - e.printStackTrace(); - } - } - - @Override - public void closeTemplateSource(Object obj) throws IOException { - if(null!=obj){ - ((StringReader)obj).close(); - } - } - - @Override - public Object findTemplateSource(String namespace_id) throws IOException { - logger.debug("Find SQL:"+namespace_id); - namespace_id=namespace_id.replaceAll("_zh_CN", ""); - namespace_id=namespace_id.replaceAll("_en_US", ""); - return new StringReader(templates.get(namespace_id)); - } - - @Override - public long getLastModified(Object obj) { - return 0; - } - - @Override - public Reader getReader(Object obj, String encoding) throws IOException { - return ((StringReader)obj); - } - -} diff --git a/src/main/java/org/ithang/tools/SQLParser.java b/src/main/java/org/ithang/tools/SQLParser.java deleted file mode 100644 index 77e275f..0000000 --- a/src/main/java/org/ithang/tools/SQLParser.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.ithang.tools; - -import java.io.StringWriter; -import java.io.Writer; -import java.util.Locale; -import java.util.Map; - -import org.apache.log4j.Logger; - -import freemarker.template.Configuration; - -/** - * 解析xml里的sql - * @author ithang - * - */ -public class SQLParser { - - private static Configuration cfg=null; - private static Logger logger=Logger.getLogger(SQLParser.class); - static{ - cfg=new Configuration(Configuration.VERSION_2_3_23); - cfg.setEncoding(Locale.CHINA, "UTF-8"); - cfg.setTemplateLoader(new SQLLoader()); - cfg.setOutputEncoding("UTF-8"); - logger.debug("init freemarker engine ..."); - } - - public static String getSQL(String namespace_id,Map values){ - try{ - Writer out = new StringWriter(32); - cfg.getTemplate(namespace_id).process(values, out); - String sql=out.toString(); - out.close(); - return sql; - }catch(Exception e){ - e.printStackTrace(); - } - return null; - } - -} diff --git a/src/main/java/org/ithang/tools/lang/CookieUtils.java b/src/main/java/org/ithang/tools/lang/CookieUtils.java deleted file mode 100644 index beabccf..0000000 --- a/src/main/java/org/ithang/tools/lang/CookieUtils.java +++ /dev/null @@ -1,131 +0,0 @@ -package org.ithang.tools.lang; - -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; - -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -public class CookieUtils { - - public static final int COOKIE_MAX_AGE = 7 * 24 * 3600; - public static final int COOKIE_HALF_HOUR = 30 * 60; - - /** - * 根据Cookie名称得到Cookie对象,不存在该对象则返回Null - * - * @param request - * @param name - * @return - */ - public static Cookie getCookie(HttpServletRequest request, String name) { - Cookie[] cookies = request.getCookies(); - if (StrUtils.isEmptyArray(cookies)) { - return null; - } - Cookie cookie = null; - for (Cookie c : cookies) { - if (name.equals(c.getName())) { - cookie = c; - break; - } - } - return cookie; - } - - /** - * 根据Cookie名称直接得到Cookie值 - * - * @param request - * @param name - * @return - */ - public static String getCookieValue(HttpServletRequest request, String name) { - Cookie cookie = getCookie(request, name); - if(cookie != null){ - return cookie.getValue(); - } - return null; - } - - /** - * 移除cookie - * @param request - * @param response - * @param name 这个是名称,不是值 - */ - public static void removeCookie(HttpServletRequest request, - HttpServletResponse response, String name) { - if (null == name) { - return; - } - Cookie cookie = getCookie(request, name); - if(null != cookie){ - cookie.setPath("/"); - cookie.setValue(""); - cookie.setMaxAge(0); - response.addCookie(cookie); - } - } - - /** - * 添加一条新的Cookie,可以指定过期时间(单位:秒) - * - * @param response - * @param name - * @param value - * @param maxValue - */ - public static void setCookie(HttpServletResponse response, String name, - String value, int maxValue) { - if(!StrUtils.isNotBlank(name)) { - return; - } - if(null == value) { - value = ""; - } - Cookie cookie = new Cookie(name, value); - cookie.setPath("/"); - if (maxValue != 0) { - cookie.setMaxAge(maxValue); - } else { - cookie.setMaxAge(COOKIE_HALF_HOUR); - } - response.addCookie(cookie); - try { - response.flushBuffer(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - /** - * 添加一条新的Cookie,默认30分钟过期时间 - * - * @param response - * @param name - * @param value - */ - public static void setCookie(HttpServletResponse response, String name, - String value) { - setCookie(response, name, value, COOKIE_HALF_HOUR); - } - - /** - * 将cookie封装到Map里面 - * @param request - * @return - */ - public static Map getCookieMap(HttpServletRequest request){ - Map cookieMap = new HashMap(); - Cookie[] cookies = request.getCookies(); - if(!StrUtils.isEmptyArray(cookies)){ - for(Cookie cookie : cookies){ - cookieMap.put(cookie.getName(), cookie); - } - } - return cookieMap; - } -} diff --git a/src/main/java/org/ithang/tools/lang/DateUtils.java b/src/main/java/org/ithang/tools/lang/DateUtils.java deleted file mode 100644 index e82989f..0000000 --- a/src/main/java/org/ithang/tools/lang/DateUtils.java +++ /dev/null @@ -1,230 +0,0 @@ -package org.ithang.tools.lang; - -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; -import java.util.TimeZone; - -public class DateUtils { - - public final static String YYYY_MM="yyyy-MM"; - public final static String YYYY_MM_DD="yyyy-MM-dd"; - public final static String YYYY_MM_DD_HH_mm_ss="yyyy-MM-dd HH:mm:ss"; - public final static String YYYY_MM_DD_HH_mm_ss_SS="yyyy-MM-dd HH:mm:ss SS"; - public final static String YYYYMMDDHHmmssSS="yyyyMMddHHmmssSS"; - public final static SimpleDateFormat sdf=new SimpleDateFormat(); - - public final static Calendar car=Calendar.getInstance(); - - static {//设置时区为本地默认时区 - sdf.setTimeZone(TimeZone.getDefault()); - car.setTimeZone(TimeZone.getDefault()); - } - - /** - * 得到当前时间对象 - * @return - */ - public static Date now(){ - return new Date(); - } - - /** - * 昨天的日期对象 - * @return - */ - public static Date lastDay(){ - return agoDay(1); - } - - /** - * 获取前指定天的时间对象 - * @param daynum - * @return - */ - public static Date agoDay(int daynum){ - car.clear(); - car.add(Calendar.DATE, daynum); - long subTime=car.getTimeInMillis(); - car.setTime(now()); - long nowTime=car.getTimeInMillis(); - car.setTimeInMillis(nowTime-subTime); - return car.getTime(); - } - - /** - * 获取前指定天的时间对象 - * @param daynum - * @return - */ - public static String agoDayStr(int daynum,String format){ - car.clear(); - car.add(Calendar.DATE, daynum); - long subTime=car.getTimeInMillis(); - car.setTime(now()); - long nowTime=car.getTimeInMillis(); - car.setTimeInMillis(nowTime-subTime); - return dateToStr(car.getTime(),format); - } - - /** - * 获得指写天数后的日期对象 - * @param daynum - * @return - */ - public static Date afterDay(int daynum){ - car.clear(); - car.add(Calendar.DATE, daynum); - long subTime=car.getTimeInMillis(); - car.setTime(now()); - long nowTime=car.getTimeInMillis(); - car.setTimeInMillis(nowTime+subTime); - return car.getTime(); - } - - /** - * 获得指定月数前的日期对象 - * @param daynum - * @return - */ - public static Date agoMonth(int monthNum){ - car.clear(); - car.add(Calendar.MONTH, monthNum); - long subTime=car.getTimeInMillis(); - car.setTime(now()); - long nowTime=car.getTimeInMillis(); - car.setTimeInMillis(nowTime-subTime); - return car.getTime(); - } - - /** - * 获得指定月数后的日期对象 - * @param daynum - * @return - */ - public static Date afterMonth(int monthNum){ - car.clear(); - car.add(Calendar.MONTH, monthNum); - long subTime=car.getTimeInMillis(); - car.setTime(now()); - long nowTime=car.getTimeInMillis(); - car.setTimeInMillis(nowTime+subTime); - return car.getTime(); - } - - /** - * 获得指定日期,指定月数后的日期对象 - * @param daynum - * @return - */ - public static Date afterMonth(Date date,int monthNum){ - car.clear(); - car.add(Calendar.MONTH, monthNum); - long subTime=car.getTimeInMillis(); - car.setTime(date); - long nowTime=car.getTimeInMillis(); - car.setTimeInMillis(nowTime+subTime); - return car.getTime(); - } - - /** - * 返回YYYY-MM 为格式的时间字符 - * @return String - */ - public static String getSysmonth(){ - sdf.applyPattern(YYYY_MM); - return sdf.format(now()); - } - - public static String getSysmonth(Date date){ - sdf.applyPattern(YYYY_MM); - return sdf.format(date); - } - /** - * 返回YYYY-MM-DD 为格式的时间字符 - * @return String - */ - public static String getSysdate(){ - sdf.applyPattern(YYYY_MM_DD); - return sdf.format(now()); - } - - public static String getSysdate(Date date){ - sdf.applyPattern(YYYY_MM_DD); - return sdf.format(date); - } - /** - * 返回YYYY-MM-DD HH:mm:ss 为格式的时间字符 - * @return String - */ - public static String getSystime(){ - sdf.applyPattern(YYYY_MM_DD_HH_mm_ss); - return sdf.format(now()); - } - - /** - * 定制格式化日期字符串 - * @param date - * @param format - * @return - */ - public static String dateToStr(Date date,String format){ - sdf.applyPattern(format); - return sdf.format(date); - } - - /** - * 转换字符串为date对象 - * @param dateStr - * @param format - * @return - */ - public static Date parseDate(String dateStr,String format){ - try { - sdf.applyPattern(format); - return sdf.parse(dateStr); - } catch (ParseException e) { - e.printStackTrace(); - } - return null; - } - - /** - * 计算两个日期之间相差的天数 - * @param smdate 较小的时间 - * @param bdate 较大的时间 - * @return 相差天数 - * @throws ParseException - */ - public static int daysBetween(Date smdate,Date bdate) throws ParseException - { - SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); - smdate=sdf.parse(sdf.format(smdate)); - bdate=sdf.parse(sdf.format(bdate)); - Calendar cal = Calendar.getInstance(); - cal.setTime(smdate); - long time1 = cal.getTimeInMillis(); - cal.setTime(bdate); - long time2 = cal.getTimeInMillis(); - long between_days=(time2-time1)/(1000*3600*24); - - return Integer.parseInt(String.valueOf(between_days)); - } - - /** - *字符串的日期格式的计算 - */ - public static int daysBetween(String smdate,String bdate) throws ParseException{ - SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); - Calendar cal = Calendar.getInstance(); - cal.setTime(sdf.parse(smdate)); - long time1 = cal.getTimeInMillis(); - cal.setTime(sdf.parse(bdate)); - long time2 = cal.getTimeInMillis(); - long between_days=(time2-time1)/(1000*3600*24); - - return Integer.parseInt(String.valueOf(between_days)); - } - -} diff --git a/src/main/java/org/ithang/tools/lang/JsonUtils.java b/src/main/java/org/ithang/tools/lang/JsonUtils.java deleted file mode 100644 index 424dc64..0000000 --- a/src/main/java/org/ithang/tools/lang/JsonUtils.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.ithang.tools.lang; - -import java.util.List; -import java.util.Map; - -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; - -public class JsonUtils { - - private static Gson gson=new Gson(); - - /** - * 把obj转为json字符串 - * @param obj - * @return - */ - public static String toJsonStr(Object obj){ - return gson.toJson(obj); - } - - /** - * 解析json字符串到实体对象中 - * @param json - * @param cls - * @return - */ - public static T parseJson(String json,Class cls){ - return gson.fromJson(json, cls); - } - - /** - * 批量转换json字符串为list实体类 - * @param json - * @param cls - * @return - */ - public static List parseJsons(String json,Class cls){ - return gson.fromJson(json, new TypeToken>() {}.getType()); - } - - public static Map parseJsonToMap(String json){ - return gson.fromJson(json, new TypeToken>() {}.getType()); - } - - public static List> parseJsonToMaps(String json){ - return gson.fromJson(json, new TypeToken>>() {}.getType()); - } - -} diff --git a/src/main/java/org/ithang/tools/lang/MD5Util.java b/src/main/java/org/ithang/tools/lang/MD5Util.java deleted file mode 100644 index d6d4f77..0000000 --- a/src/main/java/org/ithang/tools/lang/MD5Util.java +++ /dev/null @@ -1,64 +0,0 @@ -package org.ithang.tools.lang; - -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; - -/** - * @author zyt - */ -public class MD5Util { - public MD5Util() { - } - - public static String getEncryptedData(String str) { - if(!str.equals("") && !str.equals((Object)null)) { - String md5Str = null; - - MessageDigest nsae; - byte[] enBytes; - try { - nsae = MessageDigest.getInstance("MD5"); - nsae.update(str.getBytes()); - enBytes = nsae.digest(); - md5Str = byte2hex(enBytes); - } catch (NoSuchAlgorithmException var5) { - var5.printStackTrace(); - return null; - } - - md5Str = md5Str + "1ff433d9ddcc5c53b40bdcc0455a848c"; - - try { - nsae = MessageDigest.getInstance("SHA-1"); - nsae.update(md5Str.getBytes()); - enBytes = nsae.digest(); - return byte2hex(enBytes); - } catch (NoSuchAlgorithmException var4) { - var4.printStackTrace(); - return null; - } - } else { - return null; - } - } - - private static String byte2hex(byte[] b) { - String hs = ""; - String stmp = ""; - - for(int n = 0; n < b.length; ++n) { - stmp = Integer.toHexString(b[n] & 255); - if(stmp.length() == 1) { - hs = hs + "0" + stmp; - } else { - hs = hs + stmp; - } - } - - return hs; - } - - public static void main(String[] args) throws Exception { - System.out.println(getEncryptedData("boss2007")); - } -} diff --git a/src/main/java/org/ithang/tools/lang/MacUtil.java b/src/main/java/org/ithang/tools/lang/MacUtil.java deleted file mode 100644 index cf1de33..0000000 --- a/src/main/java/org/ithang/tools/lang/MacUtil.java +++ /dev/null @@ -1,124 +0,0 @@ -package org.ithang.tools.lang; - -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.LineNumberReader; -import java.text.DecimalFormat; -import java.util.StringTokenizer; - -import javax.servlet.http.HttpServletRequest; - -import org.apache.log4j.Logger; - -public class MacUtil { - private static Logger log = Logger.getLogger(MacUtil.class); - - public MacUtil() { - } - - public static String getIpAddress(HttpServletRequest request) { - String ip = request.getHeader("x-forwarded-for"); - if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { - ip = request.getHeader("Proxy-Client-IP"); - } - - if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { - ip = request.getHeader("WL-Proxy-Client-IP"); - } - - if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { - ip = request.getRemoteAddr(); - } - - return ip; - } - - public static String getMacAddress(HttpServletRequest request) { - String ip = getIpAddress(request); - log.info("---Ip:" + ip); - String smac = ""; - if(!"127.0.0.1".equals(ip)) { - try { - Process e = Runtime.getRuntime().exec("nbtstat -a " + ip); - InputStreamReader ir = new InputStreamReader(e.getInputStream()); - LineNumberReader input = new LineNumberReader(ir); - - String line; - while((line = input.readLine()) != null) { - if(line.indexOf("MAC Address") > 0) { - smac = line.substring(line.indexOf("-") - 2); - } - } - } catch (IOException var7) { - var7.printStackTrace(); - } - } - - log.info("---mac:" + smac); - return smac; - } - - public static boolean isMac(String mac) { - boolean y = false; - String macad = mac.trim(); - if(macad.length() != 17) { - return y; - } else if(macad.charAt(2) == 45 && macad.charAt(5) == 45 && macad.charAt(8) == 45 && macad.charAt(11) == 45 && macad.charAt(14) == 45) { - macad = macad.replace('-', '0'); - - for(int i = 0; i < macad.length(); ++i) { - if(!Character.isUpperCase(macad.charAt(i)) && !Character.isDigit(macad.charAt(i))) { - y = false; - break; - } - - y = true; - } - - return y; - } else { - return y; - } - } - - public static String getUserIP(HttpServletRequest request) { - String ip = getIpAddress(request); - if(ip != null) { - ip = ip.trim(); - if(ip.indexOf(",") > 0) { - ip = ip.substring(0, ip.indexOf(",")); - } - - if(ip.length() > 20) { - ip = ip.substring(0, 19); - } - } - - return ip; - } - - public static String formatIp(String ip) { - if(ip != null && !"".equals(ip)) { - String formatIp = null; - StringTokenizer st = new StringTokenizer(ip, "."); - String ip1 = (String)st.nextElement(); - String ip2 = (String)st.nextElement(); - String ip3 = (String)st.nextElement(); - String ip4 = (String)st.nextElement(); - DecimalFormat df = new DecimalFormat("000"); - formatIp = df.format((long)Integer.parseInt(ip1)) + "." + df.format((long)Integer.parseInt(ip2)) + "." + df.format((long)Integer.parseInt(ip3)) + "." + df.format((long)Integer.parseInt(ip4)); - return formatIp; - } else { - return null; - } - } - - public static void main(String[] args) { - String ip = "122.224.178.4, 58.4"; - if(ip.indexOf(",") > 0) { - ip = ip.substring(0, ip.indexOf(",")); - } - - System.out.println(ip); - } -} diff --git a/src/main/java/org/ithang/tools/lang/StrUtils.java b/src/main/java/org/ithang/tools/lang/StrUtils.java deleted file mode 100644 index f70e3c9..0000000 --- a/src/main/java/org/ithang/tools/lang/StrUtils.java +++ /dev/null @@ -1,155 +0,0 @@ -package org.ithang.tools.lang; - -public final class StrUtils { - - /** - * 是非空有效字段吗?是true,否false - * @param value - * @return - */ - public static boolean isNotBlank(String value){ - if(null!=value&&value.trim().length()>0){ - return true; - } - return false; - } - - public static String trim(String str,String mark){ - if(str.startsWith(mark)){ - str=str.replaceFirst(mark, ""); - } - if(str.endsWith(mark)){ - str=str.substring(0, str.lastIndexOf(mark)); - } - - return str; - } - - public static boolean isEmptyArray(Object[] array){ - if(null!=array&&array.length>0){ - return true; - } - return false; - } - - /** - * 增加下划线,把驼峰式转到下划线式 - * @param tname - * @return - */ - public static String addUnderline(String tname){ - String columnName=""; - - char[] tnames=tname.toCharArray(); - boolean _show=false; - for(int i=0;i0){ - _show=true; - } - if(_show){ - columnName+="_"+tnames[i]; - _show=false; - }else{ - columnName+=tnames[i]; - } - } - return columnName.toLowerCase(); - } - - /** - * 去掉下划线,并转为小写 - * @param tname - * @return - */ - public static String dropUnderline(String tname){ - StringBuffer columnName=new StringBuffer(); - tname=tname.toLowerCase(); - - char[] tnames=tname.toCharArray(); - boolean _show=false; - for(int i=0;i0){ - for(String suffix:suffixs){ - if(value.endsWith(suffix)){ - return value.substring(0, value.length()-suffix.length());//只去后缀一次 - } - } - } - return value.trim(); - } - - /** - * 首字母大写 - * @param value - * @return - */ - public static String headUpper(String value){ - char[] chars=value.toCharArray(); - if(null!=chars&&chars.length>1&&Character.isUpperCase(chars[1])){ - - }else{ - chars[0]=Character.toUpperCase(chars[0]); - } - return String.valueOf(chars); - } - - - /** - * 为每个字符串加前后缀 - * @param values - * @param prefix - * @param suffix - * @return - */ - public static String pkg(String[] values,String prefix,String suffix){ - StringBuilder sber=new StringBuilder(); - for(String value:values){ - if(isNotBlank(value)){ - sber.append(prefix).append(value).append(suffix); - } - } - return sber.toString(); - } - -} diff --git a/src/main/java/org/ithang/tools/lang/URLUtils.java b/src/main/java/org/ithang/tools/lang/URLUtils.java deleted file mode 100644 index 26f917d..0000000 --- a/src/main/java/org/ithang/tools/lang/URLUtils.java +++ /dev/null @@ -1,119 +0,0 @@ -package org.ithang.tools.lang; - -import java.util.HashMap; -import java.util.Map; -import java.util.Set; - -public class URLUtils { - /** - * 向url链接追加参数 - * @param url - * @param params Map - * @return - */ - public static String appendParams(String url, Map params){ - if(!StrUtils.isNotBlank(url)){ - return ""; - }else if(null==params||params.isEmpty()){ - return url.trim(); - }else{ - StringBuffer sb = new StringBuffer(""); - Set keys = params.keySet(); - for (String key : keys) { - sb.append(key).append("=").append(params.get(key)).append("&"); - } - sb.deleteCharAt(sb.length() - 1); - - url = url.trim(); - int length = url.length(); - int index = url.indexOf("?"); - if(index > -1){//url说明有问号 - if((length - 1) == index){//url最后一个符号为?,如:http://wwww.baidu.com? - url += sb.toString(); - }else{//情况为:http://wwww.baidu.com?aa=11 - url += "&" + sb.toString(); - } - }else{//url后面没有问号,如:http://wwww.baidu.com - url += "?" + sb.toString(); - } - return url; - } - } - - /** - * 向url链接追加参数(单个) - * @param url - * @param name String - * @param value String - * @return - */ - public static String appendParam(String url, String name, String value){ - if(!StrUtils.isNotBlank(url)){ - return ""; - }else if(!StrUtils.isNotBlank(name)){ - return url.trim(); - }else{ - Map params = new HashMap(); - params.put(name, value); - return appendParams(url, params); - } - } - - /** - * 移除url链接的多个参数 - * @param url String - * @param paramNames String[] - * @return - */ - public static String removeParams(String url, String... paramNames){ - if(!StrUtils.isNotBlank(url)){ - return ""; - }else if(StrUtils.isEmptyArray(paramNames)){ - return url.trim(); - }else{ - url = url.trim(); - int length = url.length(); - int index = url.indexOf("?"); - if(index > -1){//url说明有问号 - if((length - 1) == index){//url最后一个符号为?,如:http://wwww.baidu.com? - return url; - }else{//情况为:http://wwww.baidu.com?aa=11或http://wwww.baidu.com?aa=或http://wwww.baidu.com?aa - String baseUrl = url.substring(0, index); - String paramsString = url.substring(index + 1); - String[] params = paramsString.split("&"); - if(!StrUtils.isEmptyArray(params)){ - Map paramsMap = new HashMap(); - for (String param : params) { - if(StrUtils.isNotBlank(param)){ - String[] oneParam = param.split("="); - String paramName = oneParam[0]; - int count = 0; - for(int i=0; i 1)?oneParam[1]:""); - } - } - } - if(null!=paramsMap&&!paramsMap.isEmpty()){ - StringBuffer paramBuffer = new StringBuffer(baseUrl); - paramBuffer.append("?"); - Set set = paramsMap.keySet(); - for (String paramName : set) { - paramBuffer.append(paramName).append("=").append(paramsMap.get(paramName)).append("&"); - } - paramBuffer.deleteCharAt(paramBuffer.length() - 1); - return paramBuffer.toString(); - } - return baseUrl; - } - } - } - return url; - } - } -} diff --git a/src/main/java/org/ithang/tools/lang/UnicodeUtils.java b/src/main/java/org/ithang/tools/lang/UnicodeUtils.java deleted file mode 100644 index 5832b9c..0000000 --- a/src/main/java/org/ithang/tools/lang/UnicodeUtils.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.ithang.tools.lang; - -public class UnicodeUtils { - public static String unicode2String(String unicode){ - if(!StrUtils.isNotBlank(unicode))return null; - StringBuilder sb = new StringBuilder(); - int i = -1; - int pos = 0; - - while((i=unicode.indexOf("\\u", pos)) != -1){ - sb.append(unicode.substring(pos, i)); - if(i+5 < unicode.length()){ - pos = i+6; - sb.append((char)Integer.parseInt(unicode.substring(i+2, i+6), 16)); - } - } - - return sb.toString(); - } - - public static String string2Unicode(String string) { - - if(!StrUtils.isNotBlank(string))return null; - StringBuffer unicode = new StringBuffer(); - - for (int i = 0; i < string.length(); i++) { - - // 取出每一个字符 - char c = string.charAt(i); - - // 转换为unicode - unicode.append("\\u" + Integer.toHexString(c)); - } - - return unicode.toString(); - } - -} diff --git a/src/main/java/org/ithang/tools/mate/Column.java b/src/main/java/org/ithang/tools/mate/Column.java deleted file mode 100644 index 32e3e11..0000000 --- a/src/main/java/org/ithang/tools/mate/Column.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.ithang.tools.mate; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Target({java.lang.annotation.ElementType.FIELD}) -@Retention(RetentionPolicy.RUNTIME) -public @interface Column { - - public String value(); - - public String defaultValue() default ""; - -} diff --git a/src/main/java/org/ithang/tools/mate/Ignore.java b/src/main/java/org/ithang/tools/mate/Ignore.java deleted file mode 100644 index 4d86a6b..0000000 --- a/src/main/java/org/ithang/tools/mate/Ignore.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.ithang.tools.mate; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Target({java.lang.annotation.ElementType.FIELD}) -@Retention(RetentionPolicy.RUNTIME) -public @interface Ignore { - -} diff --git a/src/main/java/org/ithang/tools/mate/Primary.java b/src/main/java/org/ithang/tools/mate/Primary.java deleted file mode 100644 index 65226f0..0000000 --- a/src/main/java/org/ithang/tools/mate/Primary.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.ithang.tools.mate; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Target({java.lang.annotation.ElementType.FIELD}) -@Retention(RetentionPolicy.RUNTIME) -public @interface Primary { - - /** - * Sequence - * @return - */ - public String Seq() default ""; - -} diff --git a/src/main/java/org/ithang/tools/mate/Table.java b/src/main/java/org/ithang/tools/mate/Table.java deleted file mode 100644 index d52d07b..0000000 --- a/src/main/java/org/ithang/tools/mate/Table.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.ithang.tools.mate; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Target({java.lang.annotation.ElementType.TYPE}) -@Retention(RetentionPolicy.RUNTIME) -public @interface Table { - - public String value(); - -} diff --git a/src/test/java/org/ithang/ModelSQL_InsertTest.java b/src/test/java/org/ithang/ModelSQL_InsertTest.java deleted file mode 100644 index a26e1e6..0000000 --- a/src/test/java/org/ithang/ModelSQL_InsertTest.java +++ /dev/null @@ -1,147 +0,0 @@ -package org.ithang; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.ithang.entity.UserBean; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -/** - * ModelSQL测试用例 - */ -public class ModelSQL_InsertTest{ - - @Before - public void init(){ - - } - - @Test - public void insertTest0(){ - ModelSQL ms=new ModelSQL(UserBean.class); - String sql=ms.insertSQL(); - System.out.println("byName=false includeID=true ===>\n"+sql); - } - - @Test - public void insertTest1(){ - ModelSQL ms=new ModelSQL(UserBean.class); - String sql=ms.insertSQL(true,true); - System.out.println("byName=true includeID=true ===>\n"+sql); - } - - @Test - public void insertTest2(){ - ModelSQL ms=new ModelSQL(UserBean.class); - String sql=ms.insertSQL(false, false); - System.out.println("byName=false includeID=false ===>\n"+sql); - } - - @Test - public void insertTest3(){ - ModelSQL ms=new ModelSQL(UserBean.class); - String sql=ms.insertSQL(true, false); - System.out.println("byName=true includeID=false ===>\n"+sql); - } - - @Test - public void inserttest_Map(){ - ModelSQL ms=new ModelSQL(UserBean.class); - Map values=new HashMap(); - values.put("id", "10001"); - values.put("uname", "zhangsan"); - values.put("age", 18); - values.put("grade", 80); - values.put("high",170); - values.put("createTime", new java.util.Date()); - String sql=ms.insertSQL(values); - System.out.println("\n\n insert values===>"+sql); - } - - @Test - public void inserttest_Map1(){ - ModelSQL ms=new ModelSQL(UserBean.class); - Map values=new HashMap(); - values.put("id", "10001"); - values.put("uname", "zhangsan"); - values.put("age", 18); - //values.put("grade", 80); - //values.put("high",170); - values.put("createTime", new java.util.Date()); - String sql=ms.insertSQL(values); - System.out.println("\n\n insert values1===>"+sql); - } - - @Test - public void inserttest_Map2(){ - ModelSQL ms=new ModelSQL(UserBean.class); - Map values=new HashMap(); - //values.put("id", "10001"); - values.put("uname", "zhangsan"); - values.put("age", 18); - //values.put("grade", 80); - //values.put("high",170); - values.put("createTime", new java.util.Date()); - String sql=ms.insertSQL(values); - System.out.println("\n\n insert values2===>"+sql); - } - - @Test - public void insertTest_Bean(){ - ModelSQL ms=new ModelSQL(UserBean.class); - UserBean ub=new UserBean(); - String sql=ms.insertSQL(ub); - System.out.println("\n insert bean===>"+sql); - } - - @Test - public void insertTest_Bean1(){ - ModelSQL ms=new ModelSQL(UserBean.class); - UserBean ub=new UserBean(); - ub.setId("sb001"); - String sql=ms.insertSQL(ub); - System.out.println("\n insert bean1===>"+sql); - } - - @Test - public void insertTest_maps(){ - ModelSQL ms=new ModelSQL(UserBean.class); - List> mps=new ArrayList>(3); - - Map v1=new HashMap(); - //values.put("id", "10001"); - v1.put("uname", "zhangsan"); - v1.put("age", 18); - //values.put("grade", 80); - //values.put("high",170); - v1.put("createTime", new java.util.Date()); - - Map v2=new HashMap(); - v2.put("uname", "lishi"); - v2.put("age", 19); - v2.put("createTime", new java.util.Date()); - - Map v3=new HashMap(); - v3.put("uname", "goodjob"); - v3.put("age", 21); - v3.put("createTime", new java.util.Date()); - - mps.add(v1); - mps.add(v2); - mps.add(v3); - - String s=ms.insertMapsSQL(mps); - System.out.println("\n insert maps===>"+s); - } - - - @After - public void destory(){ - - } - -} diff --git a/src/test/java/org/ithang/ModelSQL_UpdateTest.java b/src/test/java/org/ithang/ModelSQL_UpdateTest.java deleted file mode 100644 index 01293b9..0000000 --- a/src/test/java/org/ithang/ModelSQL_UpdateTest.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.ithang; - -import org.ithang.entity.UserBean; -import org.junit.Before; -import org.junit.Test; - -/** - * ModelSQL测试用例 - */ -public class ModelSQL_UpdateTest{ - - @Before - public void init(){ - - } - - @Test - public void updateTest(){ - ModelSQL ms=new ModelSQL(UserBean.class); - String sql=ms.updateSQL(true); - System.out.println(sql); - } - -} diff --git a/src/test/java/org/ithang/entity/PersonBean.java b/src/test/java/org/ithang/entity/PersonBean.java deleted file mode 100644 index 155da4e..0000000 --- a/src/test/java/org/ithang/entity/PersonBean.java +++ /dev/null @@ -1,61 +0,0 @@ -package org.ithang.entity; - -import java.sql.Date; - -import org.ithang.tools.mate.Primary; - -public class PersonBean { - - @Primary - private long id; - private String name; - private int money; - private Integer grade; - private Long high; - private Date birth; - private String desc; - - public long getId() { - return id; - } - public void setId(long id) { - this.id = id; - } - public String getName() { - return name; - } - public void setName(String name) { - this.name = name; - } - public int getMoney() { - return money; - } - public void setMoney(int money) { - this.money = money; - } - public Integer getGrade() { - return grade; - } - public void setGrade(Integer grade) { - this.grade = grade; - } - public Long getHigh() { - return high; - } - public void setHigh(Long high) { - this.high = high; - } - public Date getBirth() { - return birth; - } - public void setBirth(Date birth) { - this.birth = birth; - } - public String getDesc() { - return desc; - } - public void setDesc(String desc) { - this.desc = desc; - } - -} diff --git a/src/test/java/org/ithang/entity/UserBean.java b/src/test/java/org/ithang/entity/UserBean.java deleted file mode 100644 index 5797e85..0000000 --- a/src/test/java/org/ithang/entity/UserBean.java +++ /dev/null @@ -1,71 +0,0 @@ -package org.ithang.entity; - -import java.util.Date; - -import org.ithang.tools.mate.Column; -import org.ithang.tools.mate.Ignore; -import org.ithang.tools.mate.Primary; -import org.ithang.tools.mate.Table; - -@Table("sys_user_info") -public class UserBean { - - @Primary - private String id; - - private String uname; - - @Primary - private int age; - - private Integer grade; - - @Primary - private Long high; - - @Column("create_time") - private Date createTime; - - @Ignore - private String opt; - - public String getId() { - return id; - } - public void setId(String id) { - this.id = id; - } - public String getUname() { - return uname; - } - public void setUname(String uname) { - this.uname = uname; - } - public int getAge() { - return age; - } - public void setAge(int age) { - this.age = age; - } - public Integer getGrade() { - return grade; - } - public void setGrade(Integer grade) { - this.grade = grade; - } - public Long getHigh() { - return high; - } - public void setHigh(Long high) { - this.high = high; - } - public Date getCreateTime() { - return createTime; - } - public void setCreateTime(Date createTime) { - this.createTime = createTime; - } - - - -} diff --git a/src/test/java/org/ithang/s/MSQLTest.java b/src/test/java/org/ithang/s/MSQLTest.java deleted file mode 100644 index 17cf8a6..0000000 --- a/src/test/java/org/ithang/s/MSQLTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.ithang.s; - -import static org.junit.Assert.*; - -import org.ithang.MSQL; -import org.ithang.entity.UserBean; -import org.junit.Test; - -public class MSQLTest { - - @Test - public void select_test() { - String ss=MSQL.select(UserBean.class); - System.out.println(ss); - } - - @Test - public void select2_test() { - String ss=MSQL.select(UserBean.class,"id , uname"); - System.out.println(ss); - } - - @Test - public void delete_test() { - String ss=MSQL.delete(UserBean.class); - System.out.println(ss); - } - - @Test - public void insert_test() { - String ss=MSQL.insert(UserBean.class); - System.out.println(ss); - } - - @Test - public void update_test() { - String ss=MSQL.update(UserBean.class); - System.out.println(ss); - } - -} diff --git a/src/test/java/org/ithang/tools/lang/SQLLoaderTest.java b/src/test/java/org/ithang/tools/lang/SQLLoaderTest.java deleted file mode 100644 index 07728b9..0000000 --- a/src/test/java/org/ithang/tools/lang/SQLLoaderTest.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.ithang.tools.lang; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -import org.ithang.tools.SQLLoader; -import org.junit.Test; - -public class SQLLoaderTest { - - @Test - public void test() { - List files=new ArrayList(); - String dirStr=SQLLoaderTest.class.getResource("/").getPath(); - System.out.println(dirStr); - SQLLoader.loadSQLFile(new File(dirStr), files); - files.forEach(d->{ - System.out.println(d.getName()); - }); - } - -} diff --git a/src/test/java/org/ithang/tools/lang/StrUtilsTest.java b/src/test/java/org/ithang/tools/lang/StrUtilsTest.java deleted file mode 100644 index e789237..0000000 --- a/src/test/java/org/ithang/tools/lang/StrUtilsTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.ithang.tools.lang; - - -import org.junit.Test; - -public class StrUtilsTest { - - @Test - public void addUnderlineTest() { - System.out.println("abcDefGod ==>"+StrUtils.addUnderline("abcDefGod")); - } - - @Test - public void dropUnderlineTest(){ - System.out.println("abc_def_god ==> "+StrUtils.dropUnderline("abc_def_god")); - } - - @Test - public void trimPrefixTest(){ - System.out.println("abcGod==>"+StrUtils.trimPrefix("abcGod", "ab")); - System.out.println("abcGod==>"+StrUtils.trimPrefix("abcGod", "bc")); - } - - @Test - public void trimSuffixTest(){ - System.out.println("abcGodxixi==>"+StrUtils.trimSuffix("abcGodxixi", "xi")); - System.out.println("abcGod==>"+StrUtils.trimSuffix("abcGodxixi", "x")); - } - - @Test - public void headUpperTest(){ - System.out.println("iibb==>"+StrUtils.headUpper("iibb")); - } - - @Test - public void pkg(){ - String[] abs={"abc","efd","godj","eri"}; - System.out.println(StrUtils.pkg(abs, "_", "$,")); - } - -} diff --git a/stylesheets/github-light.css b/stylesheets/github-light.css new file mode 100644 index 0000000..0c6b24d --- /dev/null +++ b/stylesheets/github-light.css @@ -0,0 +1,124 @@ +/* +The MIT License (MIT) + +Copyright (c) 2016 GitHub, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +.pl-c /* comment */ { + color: #969896; +} + +.pl-c1 /* constant, variable.other.constant, support, meta.property-name, support.constant, support.variable, meta.module-reference, markup.raw, meta.diff.header */, +.pl-s .pl-v /* string variable */ { + color: #0086b3; +} + +.pl-e /* entity */, +.pl-en /* entity.name */ { + color: #795da3; +} + +.pl-smi /* variable.parameter.function, storage.modifier.package, storage.modifier.import, storage.type.java, variable.other */, +.pl-s .pl-s1 /* string source */ { + color: #333; +} + +.pl-ent /* entity.name.tag */ { + color: #63a35c; +} + +.pl-k /* keyword, storage, storage.type */ { + color: #a71d5d; +} + +.pl-s /* string */, +.pl-pds /* punctuation.definition.string, string.regexp.character-class */, +.pl-s .pl-pse .pl-s1 /* string punctuation.section.embedded source */, +.pl-sr /* string.regexp */, +.pl-sr .pl-cce /* string.regexp constant.character.escape */, +.pl-sr .pl-sre /* string.regexp source.ruby.embedded */, +.pl-sr .pl-sra /* string.regexp string.regexp.arbitrary-repitition */ { + color: #183691; +} + +.pl-v /* variable */ { + color: #ed6a43; +} + +.pl-id /* invalid.deprecated */ { + color: #b52a1d; +} + +.pl-ii /* invalid.illegal */ { + color: #f8f8f8; + background-color: #b52a1d; +} + +.pl-sr .pl-cce /* string.regexp constant.character.escape */ { + font-weight: bold; + color: #63a35c; +} + +.pl-ml /* markup.list */ { + color: #693a17; +} + +.pl-mh /* markup.heading */, +.pl-mh .pl-en /* markup.heading entity.name */, +.pl-ms /* meta.separator */ { + font-weight: bold; + color: #1d3e81; +} + +.pl-mq /* markup.quote */ { + color: #008080; +} + +.pl-mi /* markup.italic */ { + font-style: italic; + color: #333; +} + +.pl-mb /* markup.bold */ { + font-weight: bold; + color: #333; +} + +.pl-md /* markup.deleted, meta.diff.header.from-file */ { + color: #bd2c00; + background-color: #ffecec; +} + +.pl-mi1 /* markup.inserted, meta.diff.header.to-file */ { + color: #55a532; + background-color: #eaffea; +} + +.pl-mdr /* meta.diff.range */ { + font-weight: bold; + color: #795da3; +} + +.pl-mo /* meta.output */ { + color: #1d3e81; +} + diff --git a/stylesheets/styles.css b/stylesheets/styles.css new file mode 100644 index 0000000..2e1768e --- /dev/null +++ b/stylesheets/styles.css @@ -0,0 +1,324 @@ +@font-face { + font-family: 'Noto Sans'; + font-weight: 400; + font-style: normal; + src: url('../fonts/Noto-Sans-regular/Noto-Sans-regular.eot'); + src: url('../fonts/Noto-Sans-regular/Noto-Sans-regular.eot?#iefix') format('embedded-opentype'), + local('Noto Sans'), + local('Noto-Sans-regular'), + url('../fonts/Noto-Sans-regular/Noto-Sans-regular.woff2') format('woff2'), + url('../fonts/Noto-Sans-regular/Noto-Sans-regular.woff') format('woff'), + url('../fonts/Noto-Sans-regular/Noto-Sans-regular.ttf') format('truetype'), + url('../fonts/Noto-Sans-regular/Noto-Sans-regular.svg#NotoSans') format('svg'); +} + +@font-face { + font-family: 'Noto Sans'; + font-weight: 700; + font-style: normal; + src: url('../fonts/Noto-Sans-700/Noto-Sans-700.eot'); + src: url('../fonts/Noto-Sans-700/Noto-Sans-700.eot?#iefix') format('embedded-opentype'), + local('Noto Sans Bold'), + local('Noto-Sans-700'), + url('../fonts/Noto-Sans-700/Noto-Sans-700.woff2') format('woff2'), + url('../fonts/Noto-Sans-700/Noto-Sans-700.woff') format('woff'), + url('../fonts/Noto-Sans-700/Noto-Sans-700.ttf') format('truetype'), + url('../fonts/Noto-Sans-700/Noto-Sans-700.svg#NotoSans') format('svg'); +} + +@font-face { + font-family: 'Noto Sans'; + font-weight: 400; + font-style: italic; + src: url('../fonts/Noto-Sans-italic/Noto-Sans-italic.eot'); + src: url('../fonts/Noto-Sans-italic/Noto-Sans-italic.eot?#iefix') format('embedded-opentype'), + local('Noto Sans Italic'), + local('Noto-Sans-italic'), + url('../fonts/Noto-Sans-italic/Noto-Sans-italic.woff2') format('woff2'), + url('../fonts/Noto-Sans-italic/Noto-Sans-italic.woff') format('woff'), + url('../fonts/Noto-Sans-italic/Noto-Sans-italic.ttf') format('truetype'), + url('../fonts/Noto-Sans-italic/Noto-Sans-italic.svg#NotoSans') format('svg'); +} + +@font-face { + font-family: 'Noto Sans'; + font-weight: 700; + font-style: italic; + src: url('../fonts/Noto-Sans-700italic/Noto-Sans-700italic.eot'); + src: url('../fonts/Noto-Sans-700italic/Noto-Sans-700italic.eot?#iefix') format('embedded-opentype'), + local('Noto Sans Bold Italic'), + local('Noto-Sans-700italic'), + url('../fonts/Noto-Sans-700italic/Noto-Sans-700italic.woff2') format('woff2'), + url('../fonts/Noto-Sans-700italic/Noto-Sans-700italic.woff') format('woff'), + url('../fonts/Noto-Sans-700italic/Noto-Sans-700italic.ttf') format('truetype'), + url('../fonts/Noto-Sans-700italic/Noto-Sans-700italic.svg#NotoSans') format('svg'); +} + +body { + background-color: #fff; + padding:50px; + font: 14px/1.5 "Noto Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + color:#727272; + font-weight:400; +} + +h1, h2, h3, h4, h5, h6 { + color:#222; + margin:0 0 20px; +} + +p, ul, ol, table, pre, dl { + margin:0 0 20px; +} + +h1, h2, h3 { + line-height:1.1; +} + +h1 { + font-size:28px; +} + +h2 { + color:#393939; +} + +h3, h4, h5, h6 { + color:#494949; +} + +a { + color:#39c; + text-decoration:none; +} + +a:hover { + color:#069; +} + +a small { + font-size:11px; + color:#777; + margin-top:-0.3em; + display:block; +} + +a:hover small { + color:#777; +} + +.wrapper { + width:860px; + margin:0 auto; +} + +blockquote { + border-left:1px solid #e5e5e5; + margin:0; + padding:0 0 0 20px; + font-style:italic; +} + +code, pre { + font-family:Monaco, Bitstream Vera Sans Mono, Lucida Console, Terminal, Consolas, Liberation Mono, DejaVu Sans Mono, Courier New, monospace; + color:#333; + font-size:12px; +} + +pre { + padding:8px 15px; + background: #f8f8f8; + border-radius:5px; + border:1px solid #e5e5e5; + overflow-x: auto; +} + +table { + width:100%; + border-collapse:collapse; +} + +th, td { + text-align:left; + padding:5px 10px; + border-bottom:1px solid #e5e5e5; +} + +dt { + color:#444; + font-weight:700; +} + +th { + color:#444; +} + +img { + max-width:100%; +} + +header { + width:270px; + float:left; + position:fixed; + -webkit-font-smoothing:subpixel-antialiased; +} + +header ul { + list-style:none; + height:40px; + padding:0; + background: #f4f4f4; + border-radius:5px; + border:1px solid #e0e0e0; + width:270px; +} + +header li { + width:89px; + float:left; + border-right:1px solid #e0e0e0; + height:40px; +} + +header li:first-child a { + border-radius:5px 0 0 5px; +} + +header li:last-child a { + border-radius:0 5px 5px 0; +} + +header ul a { + line-height:1; + font-size:11px; + color:#999; + display:block; + text-align:center; + padding-top:6px; + height:34px; +} + +header ul a:hover { + color:#999; +} + +header ul a:active { + background-color:#f0f0f0; +} + +strong { + color:#222; + font-weight:700; +} + +header ul li + li + li { + border-right:none; + width:89px; +} + +header ul a strong { + font-size:14px; + display:block; + color:#222; +} + +section { + width:500px; + float:right; + padding-bottom:50px; +} + +small { + font-size:11px; +} + +hr { + border:0; + background:#e5e5e5; + height:1px; + margin:0 0 20px; +} + +footer { + width:270px; + float:left; + position:fixed; + bottom:50px; + -webkit-font-smoothing:subpixel-antialiased; +} + +@media print, screen and (max-width: 960px) { + + div.wrapper { + width:auto; + margin:0; + } + + header, section, footer { + float:none; + position:static; + width:auto; + } + + header { + padding-right:320px; + } + + section { + border:1px solid #e5e5e5; + border-width:1px 0; + padding:20px 0; + margin:0 0 20px; + } + + header a small { + display:inline; + } + + header ul { + position:absolute; + right:50px; + top:52px; + } +} + +@media print, screen and (max-width: 720px) { + body { + word-wrap:break-word; + } + + header { + padding:0; + } + + header ul, header p.view { + position:static; + } + + pre, code { + word-wrap:normal; + } +} + +@media print, screen and (max-width: 480px) { + body { + padding:15px; + } + + header ul { + width:99%; + } + + header li, header ul li + li + li { + width:33%; + } +} + +@media print { + body { + padding:0.4in; + font-size:12pt; + color:#444; + } +} diff --git a/xuefo.apk b/xuefo.apk new file mode 100644 index 0000000..1375740 Binary files /dev/null and b/xuefo.apk differ