package org.nutz.dao.impl; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.nutz.dao.Chain; import org.nutz.dao.Condition; import org.nutz.dao.FieldMatcher; import org.nutz.dao.entity.Entity; import org.nutz.dao.impl.sql.pojo.InsertByChainPItem; import org.nutz.dao.sql.DaoStatement; import org.nutz.dao.sql.Pojo; import org.nutz.dao.sql.PojoMaker; import org.nutz.dao.sql.SqlType; import org.nutz.dao.util.Pojos; import org.nutz.lang.Each; import org.nutz.lang.ExitLoop; import org.nutz.lang.Lang; import org.nutz.lang.LoopException; public class EntityOperator { Entity<?> entity; NutDao dao; Object myObj; List<Pojo> pojoList = new ArrayList<Pojo>(); private int updateCount; /** * 批量执行准备好的 Dao 语句 * * @return 自身 */ public EntityOperator exec() { /* * 为每个语句检查一遍参数状态 */ if (null != entity) { for (Pojo pojo : pojoList) { if (null == pojo.getOperatingObject()) pojo.setOperatingObject(myObj); if (pojo.params().isEmpty()) pojo.addParamsBy(pojo.getOperatingObject()); } updateCount = dao._exec(pojoList.toArray(new DaoStatement[pojoList.size()])); } return this; } public Pojo addUpdate() { return addUpdate(entity, myObj); } public Pojo addUpdate(Chain chain, Condition cnd) { Pojo pojo = dao.pojoMaker.makePojo(SqlType.UPDATE); pojo.setEntity(entity); pojo.append(Pojos.Items.entityTableName()); pojo.append(Pojos.Items.updateFieldsBy(chain)); pojo.append(Pojos.Items.cnd(cnd)); pojoList.add(pojo); return pojo; } public Pojo addUpdate(final Entity<?> en, final Object obj) { if (null == en) return null; Pojo pojo = dao.pojoMaker.makeUpdate(en, null) .append(Pojos.Items.cndAuto(en, Lang.first(obj))) .setOperatingObject(obj); pojoList.add(pojo); return pojo; } public List<Pojo> addUpdateForIgnoreNull( final Entity<?> en, final Object obj, final FieldMatcher fm) { if (null == en) return null; final FieldMatcher newFM; if (null == fm) newFM = FieldMatcher.make(null, null, true); else { newFM = fm; newFM.setIgnoreNull(true); } final List<Pojo> re = new ArrayList<Pojo>(Lang.length(obj)); Lang.each(obj, new Each<Object>() { public void invoke(int i, Object ele, int length) throws ExitLoop, LoopException { Pojo pojo = dao.pojoMaker.makeUpdate(en, ele) .append(Pojos.Items.cndAuto(en, ele)) .setOperatingObject(ele); pojo.getContext().setFieldMatcher(newFM); re.add(pojo); } }); pojoList.addAll(re); return re; } public Pojo addUpdate(Condition cnd) { if (null == entity) return null; Pojo pojo = dao.pojoMaker.makeUpdate(entity, null).append(Pojos.Items.cnd(cnd)); pojoList.add(pojo); return pojo; } public Pojo addDeleteSelfOnly(long id) { if (null == entity) return null; Pojo pojo = dao.pojoMaker.makeDelete(entity); pojo.append(Pojos.Items.cndAuto(entity, myObj)); pojo.addParamsBy(myObj); pojoList.add(pojo); return pojo; } public Pojo addDeleteSelfOnly(String name) { if (null == entity) return null; Pojo pojo = dao.pojoMaker.makeDelete(entity); pojo.append(Pojos.Items.cndName(entity, name)); pojo.addParamsBy(name); pojoList.add(pojo); return pojo; } public Pojo addDeleteSelfOnly() { if (null == entity) return null; Pojo pojo = dao.pojoMaker.makeDelete(entity); pojo.append(Pojos.Items.cndAuto(entity, myObj)); pojo.addParamsBy(myObj); pojoList.add(pojo); return pojo; } public List<Pojo> addInsert() { return addInsert(entity, myObj); } public List<Pojo> addInsert(Entity<?> en, Object obj) { if (null == en) return null; int len = Lang.length(obj); List<Pojo> re = new ArrayList<Pojo>(len); if (len > 0) { if (len == 1) { for (Pojo pojo : en.cloneBeforeInsertMacroes()) re.add(pojo.setOperatingObject(obj)); } re.add(dao.pojoMaker.makeInsert(en).setOperatingObject(obj)); if (len == 1) { for (Pojo pojo : en.cloneAfterInsertMacroes()) re.add(pojo.setOperatingObject(obj)); } pojoList.addAll(re); } return re; } public Pojo addInsertSelfOnly() { return addInsertSelfOnly(entity, myObj); } public Pojo addInsertSelfOnly(Entity<?> en, Object obj) { if (null == entity) return null; Pojo pojo; if (obj instanceof Chain) { pojo = dao.pojoMaker.makePojo(SqlType.INSERT); pojo.append(Pojos.Items.entityTableName()); pojo.append(new InsertByChainPItem((Chain)obj)); pojo.setEntity(en); } else { pojo = dao.pojoMaker.makeInsert(en).setOperatingObject(obj); } pojoList.add(pojo); return pojo; } public EntityOperator add(Pojo pojo) { pojoList.add(pojo); return this; } public int getUpdateCount() { return updateCount; } public PojoMaker maker() { return dao.pojoMaker; } public Entity<?> getEntityBy(Object obj) { return dao.holder.getEntityBy(obj); } public Entity<?> getEntity(Class<?> type) { return dao.holder.getEntity(type); } public Entity<?> makeEntity(String tableName, Map<String, Object> map) { return dao.holder.makeEntity(tableName, map); } }