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);
}
}