diff --git a/pom.xml b/pom.xml index 6bc6135..94a1628 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.bladejava blade-jdbc - 0.1.2 + 0.1.3-beta jar blade-jdbc @@ -70,7 +70,7 @@ ${slf4j-log4j12.version} test - + diff --git a/src/main/java/com/blade/jdbc/Model.java b/src/main/java/com/blade/jdbc/Model.java index 5af17c1..2f25f1f 100644 --- a/src/main/java/com/blade/jdbc/Model.java +++ b/src/main/java/com/blade/jdbc/Model.java @@ -38,6 +38,8 @@ public class Model extends HashMap { private Map params = new TreeMap(); + private PageRow pageRow; + private String sql; private String order; @@ -240,25 +242,21 @@ private List list(String sql) { query.withParams(paramValues); LOGGER.debug("Parameters\t=> {}", Arrays.toString(paramValues)); } - return (List) query.executeAndFetchModels(clazz); + + List list = (List) query.executeAndFetchModels(clazz); + this.clear(); + return list; } public Paginator page(int page, int limit) { - // query count - long total = this.count(); + long total = this.count(false); Paginator pager = new Paginator(total, page, limit); - int offset = (pager.getPageNum() - 1) * limit; - - String sql = dialect.getQueryPageSql(null, this); - - int index = params.size() + 1; - this.params.put(new ParamKey(index, "offset"), offset); - this.params.put(new ParamKey(index + 1, "limit"), limit); - - List result = this.list(sql); + pageRow = new PageRow(offset, limit); + List result = this.list(null); pager.setList(result); + pageRow = null; return pager; } @@ -280,6 +278,9 @@ public T findOne() { } List models = (List) query.executeAndFetchTable().asModel(clazz); + + this.clear(); + if(null != models && !models.isEmpty()){ return models.get(0); } @@ -287,6 +288,10 @@ public T findOne() { } public int count(){ + return this.count(true); + } + + public int count(boolean clear){ String sql = dialect.getQueryCountSql(this.sql, this); LOGGER.debug("Preparing\t=> {}", sql); Query query = Base.sql2o.open().createQuery(sql); @@ -296,7 +301,11 @@ public int count(){ query.withParams(paramValues); LOGGER.debug("Parameters\t=> {}", Arrays.toString(paramValues)); } - return query.executeScalar(Integer.class); + int count = query.executeScalar(Integer.class); + if(clear){ + this.clear(); + } + return count; } private void close(Connection connection){ @@ -322,7 +331,17 @@ public Map params() { return this.params; } + public PageRow getPageRow() { + return pageRow; + } + public String getOrder(){ return this.order; } + + @Override + public void clear() { + super.clear(); + this.params.clear(); + } } diff --git a/src/main/java/com/blade/jdbc/PageRow.java b/src/main/java/com/blade/jdbc/PageRow.java new file mode 100644 index 0000000..2b405f7 --- /dev/null +++ b/src/main/java/com/blade/jdbc/PageRow.java @@ -0,0 +1,24 @@ +package com.blade.jdbc; + +import java.io.Serializable; + +public class PageRow implements Serializable { + + private static final long serialVersionUID = -1221241722858484846L; + private int offset; + private int limit; + + public PageRow(int offset, int limit) { + this.offset = offset; + this.limit = limit; + } + + public int getOffset() { + return offset; + } + + public int getLimit() { + return limit; + } + +} diff --git a/src/main/java/com/blade/jdbc/dialect/DefaultDialect.java b/src/main/java/com/blade/jdbc/dialect/DefaultDialect.java index 497783b..9aecb3e 100644 --- a/src/main/java/com/blade/jdbc/dialect/DefaultDialect.java +++ b/src/main/java/com/blade/jdbc/dialect/DefaultDialect.java @@ -4,6 +4,7 @@ import java.util.Set; import com.blade.jdbc.Model; +import com.blade.jdbc.PageRow; import com.blade.jdbc.ParamKey; public class DefaultDialect implements Dialect { @@ -77,6 +78,13 @@ public String getQuerySql(String sql, Model model) { if(null != order){ realSql += "order by " + order; } + PageRow pageRow = model.getPageRow(); + if(null != pageRow){ + int index = model.params().size() + 1; + model.params().put(new ParamKey(index, "offset"), pageRow.getOffset()); + model.params().put(new ParamKey(index + 1, "limit"), pageRow.getLimit()); + realSql += " limit :p" + index + ", :p" + (index + 1); + } return realSql; } @@ -122,7 +130,18 @@ public String getQueryOneSql(String sql, Model model) { public String getQueryCountSql(String sql, Model model) { StringBuffer sqlBuf = new StringBuffer(); if(null != sql){ - sqlBuf.append(sql); + sqlBuf.append("select count(1) from"); + int pos = sql.indexOf("from") + 4; + int w = sql.indexOf("where"); + int o = sql.indexOf("order by"); + + if(w != -1){ + sqlBuf.append(sql.substring(pos, w)); + } else if(o != -1){ + sqlBuf.append(sql.substring(pos, 0)); + } else{ + sqlBuf.append(sql.substring(pos)); + } } else { sqlBuf.append("select count(") .append(model.pkName()) @@ -130,16 +149,7 @@ public String getQueryCountSql(String sql, Model model) { .append(model.table()); } sqlBuf.append(' ').append(this.whereSql(1, model)); - return sql.toString(); + return sqlBuf.toString(); } - @Override - public String getQueryPageSql(String sql, Model model) { - String realSql = this.getQuerySql(sql, model); - Map where = model.params(); - int whereSize = where.size(); - realSql += " limit :p" + (whereSize+1) + ", :p" + (whereSize+2); - return realSql; - } - } diff --git a/src/main/java/com/blade/jdbc/dialect/Dialect.java b/src/main/java/com/blade/jdbc/dialect/Dialect.java index f7d9524..75962fe 100644 --- a/src/main/java/com/blade/jdbc/dialect/Dialect.java +++ b/src/main/java/com/blade/jdbc/dialect/Dialect.java @@ -3,19 +3,17 @@ import com.blade.jdbc.Model; public interface Dialect { - + String getSaveSql(Model model); - + String getUpdateSql(Model model); - + String getDeleteSql(Model model); String getQuerySql(String sql, Model model); - + String getQueryOneSql(String sql, Model model); - + String getQueryCountSql(String sql, Model model); - - String getQueryPageSql(String sql, Model model); -} +} \ No newline at end of file diff --git a/src/test/java/com/blade/jdbc/test/CRUDTest.java b/src/test/java/com/blade/jdbc/test/CRUDTest.java index b45bc40..b6f9453 100644 --- a/src/test/java/com/blade/jdbc/test/CRUDTest.java +++ b/src/test/java/com/blade/jdbc/test/CRUDTest.java @@ -150,5 +150,11 @@ public void testQuery9() { System.out.println(count); } - + @Test + public void testQuery10() { + Person p = new Person(); + Paginator paginator = p.sql("select id, name from person").where("id > ?", 5).order("id desc").page(1, 10); + System.out.println(paginator); + } + }