package org.theonefx.wcframework.jdbc.easyjsql; import java.lang.reflect.Field; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import javax.sql.DataSource; import org.theonefx.wcframework.core.javabean.JavaBeanReadCallBack; import org.theonefx.wcframework.core.javabean.JavaBeanReader; import org.theonefx.wcframework.jdbc.RowMapper; import org.theonefx.wcframework.jdbc.annotation.Column; import org.theonefx.wcframework.jdbc.core.PreparedStatementCallBackOperation; import org.theonefx.wcframework.jdbc.easyjsql.driver.DBDriver; import org.theonefx.wcframework.jdbc.easyjsql.driver.MySqleDriver; public class EasySqlTemple extends PreparedStatementCallBackOperation implements EasySql { private EasySqlAttributes attributes = new EasySqlAttributes();; private DBDriver dbDriver = new MySqleDriver(); public EasySqlTemple() { } public EasySqlTemple(DataSource dataSource) { setDataSource(dataSource); } // ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓GetSet↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ public DBDriver getDbDriver() { return dbDriver; } public void setDbDriver(DBDriver dbDriver) { this.dbDriver = dbDriver; } // ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑GetSet↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ // ===============================下面是链式操作方法======================================= @Override public EasySql join(String table, String on) { return join(table, on, JoinType.left); } @Override public EasySql join(String table, String on, JoinType type) { JoinEntry entry = new JoinEntry(table, on, type); this.attributes.addJoinEntry(entry); return this; } @Override public EasySql select(String select) { this.attributes.setSelect(select); return this; } @Override public EasySql from(String from) { attributes.setFrom(from); return this; } @Override public EasySql where(String key, Object val) { return where(key, Relation.AND, WhereType.equal, val); } @Override public EasySql where(Map<String, Object> map) { Iterator<Map.Entry<String, Object>> iter = map.entrySet().iterator(); while (iter.hasNext()) { Entry<String, Object> entry = iter.next(); where(entry.getKey(), Relation.AND, WhereType.equal, entry.getValue()); } return this; } @Override public EasySql or_where(Map<String, Object> map) { Iterator<Map.Entry<String, Object>> iter = map.entrySet().iterator(); while (iter.hasNext()) { Entry<String, Object> entry = iter.next(); where(entry.getKey(), Relation.OR, WhereType.equal, entry.getValue()); } return this; } @Override public EasySql or_where(String key, Object val) { return where(key, Relation.OR, WhereType.equal, val); } @Override public EasySql where_in(String key, Object... objs) { Object args = objs; if (objs.length == 1 && objs[0].getClass().isArray()) { args = objs[0]; } return where(key, Relation.AND, WhereType.in, args); } @Override public EasySql or_where_in(String key, Object... objs) { Object args = objs; if (objs.length == 1 && objs[0].getClass().isArray()) { args = objs[0]; } return where(key, Relation.OR, WhereType.in, args); } @Override public EasySql where_not_in(String key, Object... objs) { Object args = objs; if (objs.length == 1 && objs[0].getClass().isArray()) { args = objs[0]; } return where(key, Relation.AND, WhereType.not_in, args); } @Override public EasySql or_where_not_in(String key, Object... objs) { Object args = objs; if (objs.length == 1 && objs[0].getClass().isArray()) { args = objs[0]; } return where(key, Relation.OR, WhereType.not_in, args); } @Override public EasySql like(String key, String val) { return where(key, Relation.AND, WhereType.like, val); } @Override public EasySql or_like(String key, String val) { return where(key, Relation.OR, WhereType.like, val); } @Override public EasySql like(Map<String, String> map) { Iterator<Map.Entry<String, String>> iter = map.entrySet().iterator(); while (iter.hasNext()) { Entry<String, String> entry = iter.next(); where(entry.getKey(), Relation.OR, WhereType.like, entry.getValue()); } return this; } private EasySql where(String key, Relation relation, WhereType type, Object objs) { WhereEntry whereEntry = new WhereEntry(key, objs, type, relation); attributes.addWhereEntry(whereEntry); return this; } @Override public EasySql limit(int start, int limit) { LimitEntry limitEntry = new LimitEntry(); limitEntry.setStart(start); limitEntry.setLimit(limit); attributes.setLimitEntry(limitEntry); return this; } @Override public EasySql limit(int limit) { return limit(0, limit); } @Override public EasySql set(String key, Object val) { SetEntry entry = new SetEntry(key, val); attributes.addSet(entry); return this; } @Override public EasySql set(Map<String, Object> map) { Iterator<Map.Entry<String, Object>> iter = map.entrySet().iterator(); while (iter.hasNext()) { Entry<String, Object> entry = iter.next(); set(entry.getKey(), entry.getValue()); } return this; } @Override public EasySql orderBy(String fieldname, OrderType type){ attributes.addOrderBy(fieldname,type); return this; } @Override public EasySql orderBy(String fieldname){ attributes.addOrderBy(fieldname); return this; } @Override public EasySql clear() { // TODO 懒省事了。。。。。 this.attributes = new EasySqlAttributes(); return this; } // =================================================================execute触发,调用以下方法以后无法再继续链式操作了===================================================== @Override public int execInsert() { attributes.setAction(ACTION.insert); SQLForPreparedStatement sfps = dbDriver.getSqlForPreparedStatement(attributes); return update(sfps.getSql(), sfps.getArgs(), sfps.getArgTypes()); } @Override public int execInsert(String table) { return from(table).execInsert(); } @Override public int execInsert(String table, Map<String, Object> map) { return set(map).execInsert(table); } @Override public int execDelete() { attributes.setAction(ACTION.delete); SQLForPreparedStatement sfps = dbDriver.getSqlForPreparedStatement(attributes); return update(sfps.getSql(), sfps.getArgs(), sfps.getArgTypes()); } @Override public int execDelete(String table) { return from(table).execDelete(); } @Override public int execDelete(String table, Map<String, Object> map) { return where(map).execDelete(table); } @Override public int execUpdate() { attributes.setAction(ACTION.update); SQLForPreparedStatement sfps = dbDriver.getSqlForPreparedStatement(attributes); return update(sfps.getSql(), sfps.getArgs(), sfps.getArgTypes()); } @Override public int execUpdate(String table) { return from(table).execUpdate(); } @Override public int execUpdate(String table, Map<String, Object> map) { return set(map).execUpdate(table); } @Override public <T> List<T> getAsList(String table, final RowMapper<T> mapper) { attributes.setFrom(table); return getAsList(mapper); } @Override public <T> List<T> getAsList(final RowMapper<T> mapper) { attributes.setAction(ACTION.select); SQLForPreparedStatement sqlForPreparedStatement = this.dbDriver.getSqlForPreparedStatement(attributes); return query(sqlForPreparedStatement.getSql(), sqlForPreparedStatement.getArgs(), mapper); } @Override public <T> T getAsObject(RowMapper<T> mapper) { attributes.setAction(ACTION.select); SQLForPreparedStatement sqlForPreparedStatement = this.dbDriver.getSqlForPreparedStatement(attributes); return queryForObject(sqlForPreparedStatement.getSql(), sqlForPreparedStatement.getArgs(), mapper); } @Override public <T> T getAsObject(String table, RowMapper<T> mapper) { attributes.setFrom(table); return getAsObject(mapper); } @Override public int getAllResultCount(String table) { attributes.setFrom(table); return getAllResultCount(); } @Override public int getAllResultCount() { attributes.setAction(ACTION.count); SQLForPreparedStatement sqlForPreparedStatement = this.dbDriver.getSqlForPreparedStatement(attributes); return queryForInt(sqlForPreparedStatement.getSql(), sqlForPreparedStatement.getArgs()); } @Override public EasySql setBean(Object bean) { JavaBeanReader.read(bean, new JavaBeanReadCallBack() { @Override public void read(Field field, String fildName, Object value) { Column column = field.getAnnotation(Column.class); if (column != null && (!column.insertable() && !column.updateable())) { return; } set(fildName, value); } }); return this; } @Override public int execInsertBean(String table, Object bean) { return setBean(bean).execInsert(table); } @Override public EasySql where_greater(String key, Object val, boolean withequal) { if (withequal) { where(key, Relation.AND, WhereType.greater_equal, val); } else { where(key, Relation.AND, WhereType.greater, val); } return this; } @Override public EasySql where_lesser(String key, Object val, boolean withequal) { if (withequal) { where(key, Relation.AND, WhereType.lesser_equal, val); } else { where(key, Relation.AND, WhereType.lesser, val); } return this; } @Override public EasySql where_greater_equal(String key, Object val) { return where_greater(key, val, true); } @Override public EasySql where_lesser_equal(String key, Object val) { return where_lesser(key, val, true); } }