java 的 sqlHelper,改改之后也适用于不使用 EF 的 C# 项目,包含查询和建表。
这个类用来拼接 sql。
package com.ly.orm;
public class Query {
protected Query(String v) {
sql = v;
}
public String toString() {
return sql;
}
protected String sql;
public String select(String... cols) {
if (cols.length == 0) {
return String.format(sql, "*");
}
StringBuilder sb = new StringBuilder();
for (String c : cols) {
sb.append(c + ',');
}
sb.setLength(sb.length() - 1);
return String.format(sql, sb);
}
public static class P extends Query {
protected P(String v) {
super(v);
}
/**
* @param limit_offset
* [0] is limit, [1] is offset.
*/
public Query page(int[] limit_offset) {
return new Query(sql + " limit " + limit_offset[0] + " offset " + limit_offset[1]);
}
}
public static F from(String body) {
return new F(body);
}
public static class F extends P {
F(String v) {
super("select %s from " + v);
}
public F join(String v) {
return new F(sql + " " + v);
}
public W where(String v) {
if (noe(v)) {
return new W(sql);
}
return new W(sql + " where " + v);
}
public G groupby(String v) {
if (noe(v)) {
return new G(sql);
}
return new G(sql + " group by " + v);
}
public P orderby(String v) {
if (noe(v)) {
return new P(sql);
}
return new P(sql + " order by " + v);
}
}
public static class W extends P {
W(String v) {
super(v);
}
public G groupby(String v) {
if (noe(v)) {
return new G(sql);
}
return new G(sql + " group by " + v);
}
public P orderby(String v) {
if (noe(v)) {
return new P(sql);
}
return new P(sql + " ordery by " + v);
}
}
public static class G extends P {
G(String v) {
super(v);
}
public H having(String v) {
if (noe(v)) {
return new H(sql);
}
return new H(sql + " having " + v);
}
public P orderby(String v) {
if (noe(v)) {
return new P(sql);
}
return new P(sql + " order by " + v);
}
public static class H extends P {
H(String h) {
super(h);
}
public P orderby(String v) {
if (noe(v)) {
return new P(sql);
}
return new P(sql + " order by " + v);
}
}
}
private static boolean noe(String v) {
return v == null || v.trim().length() == 0;
}
}
这个类用来生成 sql 的条件项,包括 where having orderby limit offset,而 groupby 会改变 sql 的结构,所以不是条件项。
package com.ly.orm;
public class Condtions {
protected Condtions(Condtions s) {
if (s == null) {
return;
} else {
page = s.page;
where = s.where;
orderby = s.orderby;
having = s.having;
}
}
public static class Loader {
public static HOW page(int limit, int offset) {
HOW r = new HOW(null);
r.page = new int[] { limit, offset };
return r;
}
public static HOP where(String v) {
HOP r = new HOP(null);
r.where = v;
return r;
}
public static OPW having(String v) {
OPW r = new OPW(null);
r.having = v;
return r;
}
public static HPW orderby(String v) {
HPW r = new HPW(null);
r.orderby = v;
return r;
}
}
protected String where;
protected String having;
protected String orderby;
protected int[] page;
public static class HOP extends Condtions {
protected HOP(Condtions s) {
super(s);
}
public HO page(int l, int o) {
HO r = new HO(this);
r.page = new int[] { l, o };
return r;
}
public HP orderby(String v) {
HP r = new HP(this);
r.orderby = v;
return r;
}
public OP having(String v) {
OP r = new OP(this);
r.having = v;
return r;
}
}
public static class OPW extends Condtions {
protected OPW(Condtions s) {
super(s);
}
public OW page(int l, int o) {
OW r = new OW(this);
r.page = new int[] { l, o };
return r;
}
public PW orderby(String v) {
PW r = new PW(this);
r.orderby = v;
return r;
}
public OP where(String v) {
OP r = new OP(this);
r.where = v;
return r;
}
}
public static class HPW extends Condtions {
protected HPW(Condtions s) {
super(s);
}
public HW page(int l, int o) {
HW r = new HW(this);
r.page = new int[] { l, o };
return r;
}
public HP where(String v) {
HP r = new HP(this);
r.where = v;
return r;
}
public PW having(String v) {
PW r = new PW(this);
r.having = v;
return r;
}
}
public static class HOW extends Condtions {
protected HOW(Condtions s) {
super(s);
}
public HO where(String v) {
HO r = new HO(this);
r.where = v;
return r;
}
public OW having(String v) {
OW r = new OW(this);
r.having = v;
return r;
}
public HW orderby(String v) {
HW r = new HW(this);
r.orderby = v;
return r;
}
}
public class P extends Condtions {
protected P(Condtions s) {
super(s);
}
public Condtions page(int l, int o) {
Condtions r = new Condtions(this);
r.page = new int[] { l, o };
return r;
}
}
public class O extends Condtions {
protected O(Condtions s) {
super(s);
}
public Condtions orderby(String v) {
Condtions r = new Condtions(this);
r.orderby = v;
return r;
}
}
public class H extends Condtions {
protected H(Condtions s) {
super(s);
}
public Condtions having(String v) {
Condtions r = new Condtions(this);
r.having = v;
return r;
}
}
public class W extends Condtions {
protected W(Condtions s) {
super(s);
}
public Condtions where(String v) {
Condtions r = new Condtions(this);
r.where = v;
return r;
}
}
public class HO extends Condtions {
protected HO(Condtions s) {
super(s);
}
public O having(String v) {
O r = new O(this);
r.having = v;
return r;
}
public H orderby(String v) {
H r = new H(this);
r.orderby = v;
return r;
}
}
public class HP extends Condtions {
protected HP(Condtions s) {
super(s);
}
public H page(int l, int o) {
H r = new H(this);
r.page = new int[] { l, o };
return r;
}
public P having(String v) {
P r = new P(this);
r.having = v;
return r;
}
}
public class HW extends Condtions {
protected HW(Condtions s) {
super(s);
}
public H where(String v) {
H r = new H(this);
r.where = v;
return r;
}
public W having(String v) {
W r = new W(this);
r.having = v;
return r;
}
}
public class OP extends Condtions {
protected OP(Condtions s) {
super(s);
}
public O page(int l, int o) {
O r = new O(this);
r.page = new int[] { l, o };
return r;
}
public P orderby(String v) {
P r = new P(this);
r.orderby = v;
return r;
}
}
public class OW extends Condtions {
protected OW(Condtions s) {
super(s);
}
public O where(String v) {
O r = new O(this);
r.where = v;
return r;
}
public W orderby(String v) {
W r = new W(this);
r.orderby = v;
return r;
}
}
public class PW extends Condtions {
protected PW(Condtions s) {
super(s);
}
public P where(String v) {
P r = new P(this);
r.where = v;
return r;
}
public W page(int l, int o) {
W r = new W(this);
r.page = new int[] { l, o };
return r;
}
}
}
两个 annotation。一个在创建表时会用到,一个在查询时会用到,留意其中的 group 。
package com.ly.orm;
public @interface Creating {
/**
* set first charactor ' ' if want to rename the column
*/
String desc();
int index() default 0;
}
package com.ly.orm;
public @interface Querying {
String name();
String groupby() default "";
}
这个类用来转换类型到 sql 语句,这里用到了 group 关键词。自定义列名的话,Creating 中用一个空格开头。
至于其中的 Enm,只是因为不想写 foreach。java 有人实现过伪 linq,我也写了一个伪 linq,只有一小部分,用他的吧。
package com.ly.orm; import java.lang.reflect.Field;
import java.util.ArrayList; import com.ly.linq.Enm;
import com.ly.linq.FuncT;
import com.ly.linq.FuncTT;
import com.ly.linq.Pre; public class SqlMapper {
public interface Mapper<T> extends FuncT<ItemLoader, T> {
} public interface ItemLoader extends FuncTT<String, Class<?>, Object> {
} public static <T> Mapper<T> load(final Class<T> cls) {
return new Mapper<T>() {
@Override
public T get(ItemLoader querier) {
T r;
try {
r = cls.newInstance();
} catch (Exception e) {
e.printStackTrace();
return null;
}
Field[] fs = cls.getDeclaredFields();
for (Field f : fs) {
if (f.getAnnotation(Ignored.class) != null) {
continue;
}
Querying anno = f.getAnnotation(Querying.class);
String name = anno == null ? f.getName() : anno.name();
Object val = querier.get(name, f.getType());
f.setAccessible(true);
try {
f.set(r, val);
} catch (Exception e) {
e.printStackTrace();
continue;
}
}
return r;
}
};
} public static String getCreateSQL(Class<?> cls) {
String cols = Enm.toString(Enm.select(Enm.sort(Enm.where(cls.getFields(),
new Pre<Field>() {// where
@Override
public boolean check(Field ti) {
return ti.getAnnotation(Creating.class) != null;
}
}), new FuncT<Field, Integer>() {// sort
@Override
public Integer get(Field ti) {
return ti.getAnnotation(Creating.class).index();
}
}), new FuncT<Field, String>() {// select
@Override
public String get(Field ti) {
String desc = ti.getAnnotation(Creating.class).desc();
if (desc.charAt(0) == ' ') {
return desc.substring(1);
}
return ti.getName() + ' ' + desc;
}
}), ',');
if (cols.length() == 0) {
return cols;
}
Creating c = cls.getAnnotation(Creating.class);
String table = c != null ? c.desc() : cls.getSimpleName();
return String.format("create table %s(%s);", table, cols);
} public static String getQuerySQL(Class<?> cls, Condtions p) {
ArrayList<String> fuck = Enm.notNull(Enm.select(cls.getDeclaredFields(), getQueryingColName));
String[] c = new String[fuck.size()];
fuck.toArray(c);
Querying q = cls.getAnnotation(Querying.class);
String b = q == null ? cls.getSimpleName() : q.name();
String g = q == null ? null : q.groupby();
String h = g == null || g.trim().length() == 0 ? null : p.having;
return Query.from(b).where(p.where).groupby(g).having(h).orderby(p.orderby).page(p.page).select(c);
} private static FuncT<Field, String> getQueryingColName = new FuncT<Field, String>() {
@Override
public String get(Field ti) {
if (ti.getAnnotation(Ignored.class) != null) {
return null;
}
Querying q = ti.getAnnotation(Querying.class);
return q == null ? ti.getName() : q.name();
}
};
}
这个是 android 中 SQLiteOpenHelper 子类的局部代码,query(类型,可选条件)就可以返回这个类型的集合,方便的很。
public <T> ArrayList<T> query(Class<T> cls, Condtions sql, String... selectionArgs) {
return query(cls, SqlMapper.getQuerySQL(cls, sql), selectionArgs);
}
public <T> ArrayList<T> query(Class<T> cls, String sql, String... selectionArgs) {
Cursor c = getReadableDatabase().rawQuery(sql, selectionArgs);
ArrayList<T> r = new ArrayList<T>();
Mapper<T> mapper = SqlMapper.load(cls);
while (c.moveToNext()) {
r.add(mapper.get(getItem(c)));
}
c.close();
return r;
}
private static ItemLoader getItem(final Cursor c) {
return new ItemLoader() {
@Override
public Object get(String col, Class<?> t1) {
int i = c.getColumnIndex(col);
if (i < 0) {
return null;
}
if (t1.equals(int.class)) {
return c.getInt(i);
}
if (t1.equals(double.class)) {
return c.getDouble(i);
}
if (t1.equals(long.class)) {
return c.getLong(i);
}
if (t1.equals(short.class)) {
return c.getShort(i);
}
if (t1.equals(float.class)) {
return c.getFloat(i);
}
if (t1.equals(byte[].class)) {
return c.getBlob(i);
}
return c.getString(i);
}
};
}
@Override
public void onCreate(SQLiteDatabase db) {
for (Class<?> t : tables) {
db.execSQL(SqlMapper.getCreateSQL(t));
}
}
不想写任何字符串!但 java 没办法。
linq + DynamicLinq,想怎么写就怎么写,大家快转 C# 吧!
java 的 sqlHelper,改改之后也适用于不使用 EF 的 C# 项目,包含查询和建表。的更多相关文章
- Java项目专栏之数据库建表
Java项目专栏之数据库建表 数据库建表前期准备 1. 安装mysql:数据库语言,语法和sql server差不太多,如果习惯于sql server可以不用mysql. 2. 安装navicat:可 ...
- java jdbc sqlhelper
package com.shop.util; import java.sql.*; //SqlHelper类 //定义了数据库连接函数,关闭查询结果集,关闭Statement对象,关闭数据库连接 // ...
- JAVA版SqlHelper
//JAVA版SqlHelper package com.test.Dao; import java.sql.Connection; import java.sql.DriverManager; im ...
- 点评阿里JAVA手册之MySQL数据库 (建表规约、索引规约、SQL语句、ORM映射)
下载原版阿里JAVA开发手册 [阿里巴巴Java开发手册v1.2.0] 本文主要是对照阿里开发手册,注释自己在工作中运用情况. 本文内容:MySQL数据库 (建表规约.索引规约.SQL语句.ORM映 ...
- 【hbase】——Java操作Hbase进行建表、删表以及对数据进行增删改查,条件查询
1.搭建环境 新建JAVA项目,添加的包有: 有关Hadoop的hadoop-core-0.20.204.0.jar 有关Hbase的hbase-0.90.4.jar.hbase-0.90.4-tes ...
- (转)Java操作Hbase进行建表、删表以及对数据进行增删改查,条件查询
1.搭建环境 新建JAVA项目,添加的包有: 有关Hadoop的hadoop-core-0.20.204.0.jar 有关Hbase的hbase-0.90.4.jar.hbase-0.90.4-tes ...
- Java操作Hbase进行建表、删表以及对数据进行增删改查,条件查询
1.搭建环境 新建JAVA项目,添加的包有: 有关Hadoop的hadoop-core-0.20.204.0.jar 有关Hbase的hbase-0.90.4.jar.hbase-0.90.4-tes ...
- java封装实现Excel建表读写操作
对 Excel 进行读写操作是生产环境下常见的业务,网上搜索的实现方式都是基于POI和JXL第三方框架,但都不是很全面.小编由于这两天刚好需要用到,于是就参考手写了一个封装操作工具,基本涵盖了Exce ...
- Java,Mysql-根据一个给定经纬度的点,进行附近500米地点查询–合理利用算法
Java,Mysql-根据一个给定经纬度的点,进行附近500米地点查询–合理利用算法 LBS 球面距离公式 http://wiki.myoa.info/zh-blog:20 Java,Mysql- ...
随机推荐
- Infinite loop when using cookieless session ID on Azure
If you use cookieless session ID and deploy them on Azure, you might get infinite loop when you quer ...
- kthread_run【转】
转自:http://blog.csdn.net/zhangxuechao_/article/details/50876397 头文件 include/linux/kthread.h 创建并启动 /** ...
- loadrunner总体使用篇
为什么要进行性能测试呢? 有些问题是只有在大并发或者压力测试下才会暴露出来的,在平常的公司内部测试中,感觉一切都是正常的,但是把服务放到生产线上,例如某个时刻突然有很多的用户要向我们的服务发送请求, ...
- 自发行python版本制作(二)编译
本系列文章第二篇主要说明windows环境的编译环境搭建以及编译过程. 编译环境选择: 1.选用作神一样存在的Microsoft Visual C++ Compiler for Python 2.7为 ...
- 反射 __import__
__import__ 根据字符串导入模块 def run(): inp = input('请输入URL:') m,p = inp.split('/') obj = __import__(m) if h ...
- OPTM-Optimal Marks-SPOJ839最小割
You are given an undirected graph G(V, E). Each vertex has a mark which is an integer from the range ...
- Java 自定义客户端与服务器
一:浏览器如何请求数据基本原理 基本原理: 当浏览器输入地址向服务器请求数据时,实际上浏览器会在内部建立一个Socket对象,把http请求报文转变成byet[]字节,然后调用Socket的方法把这些 ...
- cocos IDE 编译lua 游戏程序的环境配置
因为毕业设计需要用cocosIDE编译一个apk在手机上跑,所以搭建这个环境还是需要的. ps:是针对win系统的. 需要的工具: 1.cocosIDE:点击链接 (ps:据说这个软件设计有点反人类, ...
- mysql主从配置(基于mysql5.5.x)
安装mysql数据库主从复制,步骤如下:1.主从服务器分别作以下准备: 1.1.数据库版本完全一致 1.2.修改root的密码, 不改也可以 2.修改主服务器master #vi /etc ...
- SQL-Server使用点滴(三)
除了基本的数据库,数据表,数据记录操作之外,SQL-Server还为我们提供了比较丰富的其他对象元素.函数,过程,触发器,序列,映射服务器, 以及对各种元素的系统表信息读取与判断. --先加一个利用递 ...