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- ...
随机推荐
- java实现ftp文件的上传与下载
最近在做ftp文件的上传与下载,基于此,整理了一下资料.本来想采用java自带的方法,可是看了一下jdk1.6与1.7的实现方法有点区别,于是采用了Apache下的框架实现的... 1.首先引用3个包 ...
- [C#] Control.Invoke方法和跨线程访问控件(转载)
转载前,在网上找了好多INVOKE方法的文章,就这个看着还可以,明白了大概,以后再深用的时候再研究 ,废话少说上转载(连转载都说的这么有气势,哈哈) 在设计界面时,我们经常需要将一些需要时间才能完 ...
- [课程设计]Scrum 3.6 多鱼点餐系统开发进度(用户测试反馈页面构思&留言板设计)
Scrum 3.6 多鱼点餐系统开发进度(用户测试反馈页面构思&留言板设计) 1.团队名称:重案组 2.团队目标:长期经营,积累客户充分准备,伺机而行 3.团队口号:矢志不渝,追求完美 4.团 ...
- PHP将图片二进制转换
http://www.360doc.com/content/14/0325/10/947551_363526874.shtml
- 【Spring】简单的Spring AOP注解示例
引入相关包: <properties> <spring.version>3.0.5.RELEASE</spring.version> <aspectj.ver ...
- 关于Markdown
之前有接触过一点markdown,知道能生成好看的排版,只是太懒都不去看不去记那些标签 现在才发现它简单好用得有点伟大 一个在线的Markdown编辑器:https://stackedit.io/ed ...
- Git命令行下解决冲突
使用Git时,在pull.merge.rebase的过程中,经常会遇到conflict的情况. 遇到conflict时,以上处理过程会终端,并且命令行中显示(xxx|MERGING)的状态(Windo ...
- R:incomplete final line found by readTableHeader on
报错: In read.table("abc.txt", header = T) : incomplete final line found by readTableHead ...
- Linux常用命令及shell脚本
一. 用户管理(添加用户.切换用户.删除用户) ~ ...
- Contact项目梳理
1. 共三张表:user用户表 group分组表 contact联系人表 entity 分模块,三个实体类,三个模块 2. 先注册再登录 DAO:UserDAOImpl public User g ...