这个类用来拼接 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# 项目,包含查询和建表。的更多相关文章

  1. Java项目专栏之数据库建表

    Java项目专栏之数据库建表 数据库建表前期准备 1. 安装mysql:数据库语言,语法和sql server差不太多,如果习惯于sql server可以不用mysql. 2. 安装navicat:可 ...

  2. java jdbc sqlhelper

    package com.shop.util; import java.sql.*; //SqlHelper类 //定义了数据库连接函数,关闭查询结果集,关闭Statement对象,关闭数据库连接 // ...

  3. JAVA版SqlHelper

    //JAVA版SqlHelper package com.test.Dao; import java.sql.Connection; import java.sql.DriverManager; im ...

  4. 点评阿里JAVA手册之MySQL数据库 (建表规约、索引规约、SQL语句、ORM映射)

    下载原版阿里JAVA开发手册  [阿里巴巴Java开发手册v1.2.0] 本文主要是对照阿里开发手册,注释自己在工作中运用情况. 本文内容:MySQL数据库 (建表规约.索引规约.SQL语句.ORM映 ...

  5. 【hbase】——Java操作Hbase进行建表、删表以及对数据进行增删改查,条件查询

    1.搭建环境 新建JAVA项目,添加的包有: 有关Hadoop的hadoop-core-0.20.204.0.jar 有关Hbase的hbase-0.90.4.jar.hbase-0.90.4-tes ...

  6. (转)Java操作Hbase进行建表、删表以及对数据进行增删改查,条件查询

    1.搭建环境 新建JAVA项目,添加的包有: 有关Hadoop的hadoop-core-0.20.204.0.jar 有关Hbase的hbase-0.90.4.jar.hbase-0.90.4-tes ...

  7. Java操作Hbase进行建表、删表以及对数据进行增删改查,条件查询

    1.搭建环境 新建JAVA项目,添加的包有: 有关Hadoop的hadoop-core-0.20.204.0.jar 有关Hbase的hbase-0.90.4.jar.hbase-0.90.4-tes ...

  8. java封装实现Excel建表读写操作

    对 Excel 进行读写操作是生产环境下常见的业务,网上搜索的实现方式都是基于POI和JXL第三方框架,但都不是很全面.小编由于这两天刚好需要用到,于是就参考手写了一个封装操作工具,基本涵盖了Exce ...

  9. Java,Mysql-根据一个给定经纬度的点,进行附近500米地点查询–合理利用算法

    Java,Mysql-根据一个给定经纬度的点,进行附近500米地点查询–合理利用算法   LBS 球面距离公式 http://wiki.myoa.info/zh-blog:20 Java,Mysql- ...

随机推荐

  1. PhpStorm创建Drupal模块项目开发教程(2)

    通常支持Drupal HOOK的文件为.module.首先我们需要在这里对它进行声明,以便索引,并且在代码完成中使用Ctrl+Space(空格)完成HOOK实现. Drupal HOOK调用,通常情况 ...

  2. 谷歌 HTML/CSS 规范 2016-12-30

    背景 这篇文章定义了 HTML 和 CSS 的格式和代码规范,旨在提高代码质量和协作效率. 通用样式规范 协议 省略图片.样式.脚本以及其他媒体文件 URL 的协议部分(http:,https:),除 ...

  3. session详解

    什么是Session 对Tomcat而言,Session是一块在服务器开辟的内存空间,其存储结构为ConcurrentHashMap: Session的目的 Http协议是一种无状态协议,即每次服务端 ...

  4. java内存详解

    二.JAVA中的内存模型 程序运行的时候,内存主要由以下部分组成: 堆:所有线程共享一个堆:存放的都是new 出来的对象:由垃圾回收器回收: 方法区:所有线程共享一个方法区:里面存放的内容有点杂,可以 ...

  5. lower函数

    将大写字母变成小写 >>> a='AAABBBccc' >>> a.lower() 'aaabbbccc'

  6. 自动拒绝恶意IP远程登录Linux服务器脚本

    当我们已经配置了iptables防火墙,我们允许22端口对外网所有人访问,当然这也是为了方便,我们在任何地方都连接上,没有做VPN,也没有做ssh密钥验证,但是我们的密码设置得非常复杂,大小写.特殊符 ...

  7. 微信OAuth2.0网页授权

    1.OAuth2.0网页授权 关于网页授权的两种scope的区别说明 1.以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页 ...

  8. Ubuntu中配置Thunderbird登录qq邮箱

    1.打开thunderbird 2.开启QQ邮箱pop功能 登录网页版QQ邮箱(email.qq.com) 设置---->>账户---->> 3.配置thunderbird 注 ...

  9. ichart.js绘制虚线 ,平均分虚线

    var Data=new Array(); Data[0] = { labels : ["第一单元","第二单元","第三单元"," ...

  10. VS.Net 2015 Update3 学习(2) jquery-form, jquery-validation,jquery-validation-unobtrusive一起用

    我觉DataAnnotations非常酷的一个功能.但是教程中的@ajaxform的却不怎么优雅,需要全局的onSucces等函数.因此我使用jquery-form做ajax提交. function ...