package com.authine.common.sdk.base.snowflake;
/**
- Twitter_Snowflake
- SnowFlake的结构如下(每部分用-分开):
- 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000
- 1位标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0
- 41位时间截(毫秒级),注意,41位时间截不是存储当前时间的时间截,而是存储时间截的差值(当前时间截 - 开始时间截)
- 得到的值),这里的的开始时间截,一般是我们的id生成器开始使用的时间,由我们程序来指定的(如下下面程序IdWorker类的startTime属性)。41位的时间截,可以使用69年,年T = (1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69
- 10位的数据机器位,可以部署在1024个节点,包括5位datacenterId和5位workerId
- 12位序列,毫秒内的计数,12位的计数顺序号支持每个节点每毫秒(同一机器,同一时间截)产生4096个ID序号
- 加起来刚好64位,为一个Long型。
- SnowFlake的优点是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由数据中心ID和机器ID作区分),并且效率较高,经测试,SnowFlake每秒能够产生26万ID左右。
*/
public class SnowflakeIdWorker {
// Fields=============
/**
- 开始时间截 (2015-01-01)
*/
private final long twepoch = 1420041600000L;
/**
- 机器id所占的位数
*/
private static final long workerIdBits = 5L;
/**
- 数据标识id所占的位数
*/
private final long datacenterIdBits = 5L;
/**
- 支持的最大机器id,结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数)
*/
private static final long maxWorkerId = -1L ^ (-1L << workerIdBits);
/**
- 支持的最大数据标识id,结果是31
*/
private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);
/**
- 序列在id中占的位数
*/
private final long sequenceBits = 12L;
/**
- 机器ID向左移12位
*/
private final long workerIdShift = sequenceBits;
/**
- 数据标识id向左移17位(12+5)
*/
private final long datacenterIdShift = sequenceBits + workerIdBits;
/**
- 时间截向左移22位(5+5+12)
*/
private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;
/**
- 生成序列的掩码,这里为4095 (0b111111111111=0xfff=4095)
*/
private final long sequenceMask = -1L ^ (-1L << sequenceBits);
/**
- 工作机器ID(0~31)
*/
private long workerId;
/**
- 数据中心ID(0~31)
*/
private long datacenterId;
/**
- 毫秒内序列(0~4095)
*/
private long sequence = 0L;
/**
- 上次生成ID的时间截
*/
private long lastTimestamp = -1L;
//Constructors=======
/**
- 构造函数
- @param workerId 工作ID (0~31)
- @param datacenterId 数据中心ID (0~31)
*/
public SnowflakeIdWorker(long workerId, long datacenterId) {
if (workerId > maxWorkerId || workerId < 0) {
throw new IllegalArgumentException(String.format(“worker Id can’t be greater than %d or less than 0”, maxWorkerId));
}
if (datacenterId > maxDatacenterId || datacenterId < 0) {
throw new IllegalArgumentException(String.format(“datacenter Id can’t be greater than %d or less than 0”, maxDatacenterId));
}
this.workerId = workerId;
this.datacenterId = datacenterId;
}
// Methods============
/**
- 获得下一个ID (该方法是线程安全的)
- @return SnowflakeId
*/
public synchronized long nextId() {
long timestamp = timeGen();
//如果当前时间小于上一次ID生成的时间戳,说明系统时钟回退过这个时候应当抛出异常
if (timestamp < lastTimestamp) {
throw new RuntimeException(
String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
}
//如果是同一时间生成的,则进行毫秒内序列
if (lastTimestamp == timestamp) {
sequence = (sequence + 1) & sequenceMask;
//毫秒内序列溢出
if (sequence == 0) {
//阻塞到下一个毫秒,获得新的时间戳
timestamp = tilNextMillis(lastTimestamp);
}
}
//时间戳改变,毫秒内序列重置
else {
sequence = 0L;
}
//上次生成ID的时间截
lastTimestamp = timestamp;
//移位并通过或运算拼到一起组成64位的ID
return ((timestamp - twepoch) << timestampLeftShift) //
| (datacenterId << datacenterIdShift) //
| (workerId << workerIdShift) //
| sequence;
}
/**
- 阻塞到下一个毫秒,直到获得新的时间戳
- @param lastTimestamp 上次生成ID的时间截
- @return 当前时间戳
*/
protected long tilNextMillis(long lastTimestamp) {
long timestamp = timeGen();
while (timestamp <= lastTimestamp) {
timestamp = timeGen();
}
return timestamp;
}
/**
- 返回以毫秒为单位的当前时间
- @return 当前时间(毫秒)
*/
protected long timeGen() {
return System.currentTimeMillis();
}
public static Long getMaxWorkerId() {
return maxWorkerId;
}
}
@ApiModel(description = “物业主”)
@Table(“tb_area_owner”)
@NoArgsConstructor
@Data
public class AreaOwner implements Serializable{
@ApiModelProperty(value="id",hidden = true)
@Id("id")
private Long id;
@ApiModelProperty("编码")
private String areaCode ;
@ApiModelProperty("物业主名称")
private String areaName ;
@ApiModelProperty("联系人名称")
private String contactName ;
@ApiModelProperty("联系人手机号")
private String contactPhone;
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Table {
String value() ;
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Id {
String value() ;
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ReturnData {
}
package com.authine.webcore.web.dao.model;
import java.util.List;
/**
-
@descript:
*/
public class PageModel {/以下参数为了支持layui而存在**********/
/**- 返回状态
*/
private String code ;
/**
- 提示信息
/
private String msg ;
/* - 总记录数
/
private long count ;
/* - 分页数据
*/
private List data ;
public PageModel(){
}
/**
-
layui分页
-
@param pageSize
-
@param pageIndex
-
@param count
-
@param data
*/
public PageModel(int pageSize, int pageIndex,long count, List data) {
this.code = “0” ;
this.msg = “” ;this.count = count;
this.data = data;if(data == null || data.size() == 0){
this.code = “-1”;//为了满足layui的需求 分页特殊处理
this.msg = “没有查询到数据哦” ;
}
}
/layui page*******/
public String getCode() {
return code;
}public void setCode(String code) {
this.code = code;
}public long getCount() {
return count;
}public void setCount(long count) {
this.count = count;
}public List getData() {
return data;
}public void setData(List data) {
this.data = data;
}public String getMsg() {
return msg;
}public void setMsg(String msg) {
this.msg = msg;
} - 返回状态
}
package com.authine.webcore.web.dao.impl;
import java.io.Serializable;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.support.rowset.SqlRowSet;
import org.springframework.jdbc.support.rowset.SqlRowSetMetaData;
import org.springframework.stereotype.Repository;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.authine.common.sdk.base.snowflake.SnowflakeIdWorker;
import com.authine.webcore.web.annotation.dao.Column;
import com.authine.webcore.web.annotation.dao.Ctime;
import com.authine.webcore.web.annotation.dao.GeneratedId;
import com.authine.webcore.web.annotation.dao.Id;
import com.authine.webcore.web.annotation.dao.Table;
import com.authine.webcore.web.annotation.dao.Utime;
import com.authine.webcore.web.dao.BaseDao;
import com.authine.webcore.web.dao.model.PageModel;
import com.authine.webcore.web.exception.SysException;
import com.authine.webcore.web.log.BaseLog;
import com.authine.webcore.web.log.LogRecord;
import com.authine.webcore.web.util.BeanCopierUtils;
import com.authine.webcore.web.util.ContextParam;
import com.authine.webcore.web.util.ContextUtils;
/**
-
@descript:数据访问接口
*/
@Repository(“jdbcBaseDao”)
public class JdbcBaseDao implements BaseDao {@Autowired
private JdbcTemplate jdbcTemplate;/**
- 获取表名
- @param clazz
- @return
*/
private String getTableName(Class clazz){
Table table = clazz.getDeclaredAnnotation(Table.class) ;
if(table == null){
throw new SysException(“1”,“entry not config @ExtTable value”);
}
return table.value();
}
/**
-
获取实体类ID属性
-
@param clazz
-
@return
*/
private String getEntryId(Class<?> clazz){Field[] fields = clazz.getDeclaredFields() ;
for(Field field : fields){
Annotation[] arr = field.getAnnotationsByType(Id.class) ;
if(arr == null || arr.length == 0){
continue ;
}
return field.getName() ;
}
return null ;
}
/**
- 获取数据库字段对应的列名
- @param field
- @return
*/
private String getFieldColumn(Field field ){
String columnName = null ;
Annotation[] arr = field.getAnnotationsByType(Column.class) ;
if(arr != null && arr.length > 0){
columnName = ((Column)arr[0]).value() ;
}else{
columnName = field.getName() ;
}
return columnName ;
}
/**
-
获取实体类【数据库字段-属性】的映射
-
@param field
-
@return
*/
private Map<String,String> getColumnAttrMap(Class<?> clazz){
Map<String,String> map = new HashMap<String, String>(clazz.getDeclaredAnnotations().length);Field[] fields = null ;
for(; clazz != Object.class ; clazz = clazz.getSuperclass()) {
try {
fields = clazz.getDeclaredFields() ;
if(fields==null || fields.length == 0){
continue ;
}
Column extColumn = null ;
for(int i=0;i<fields.length;i++){
extColumn = fields[i].getDeclaredAnnotation(Column.class) ;
if(extColumn != null){
map.put(extColumn.value(),fields[i].getName()) ;
}else{
map.put(fields[i].getName(),fields[i].getName()) ;
}
}
} catch (Exception e) {
//这里甚么都不能抛出去。
//如果这里的异常打印或者往外抛,则就不会进入
}
}return map ;
}
/**
-
获取表主键
-
@param clazz
-
@return
*/
private String getTablePrimaryKey(Class<?> clazz){
Field[] fields = clazz.getDeclaredFields() ;for(int i=0;i<fields.length;i++){
//判断自动生成主键
Id extId = fields[i].getDeclaredAnnotation(Id.class);
if(extId != null){//自动生成值
return extId.value() ;
}
}return null;
}
private static String setAliasParameter(String sql, Map<String, Object> alias) {
if (alias != null) { Set<String> keys = alias.keySet(); for (String key : keys) { Object value = alias.get(key); if (value instanceof Collection) { //query.setParameterList(key, (Collection<?>) value); } else { sql = sql.replaceAll("#\\{"+key+"}", String.valueOf(value)) ; sql = sql.replaceAll("\\$\\{"+key+"}", String.valueOf(value)) ; } } } return sql ;
}
private T convertToObj(Class clazz,SqlRowSet rowSet) {
T obj = null ;try { obj = clazz.newInstance() ; } catch (Exception e) { } // 获取结果集的数据源 SqlRowSetMetaData rsmeta = rowSet.getMetaData(); // 获取结果集中的字段数 int count = rsmeta.getColumnCount(); // 循环取出个字段的名字以及他们的值并将其作为值赋给对应的实体对象的属性 for (int i = 0; i < count; i++) { // 获取字段名 String name = rsmeta.getColumnName(i + 1); try { //System.out.println(clazz.getSimpleName()+":name="+name+",value="+rowSet.getObject(name)); BeanCopierUtils.setFieldValueByName(name, rowSet.getObject(name), obj) ; } catch (Exception e) { throw new RuntimeException("数据库字段["+name+"]在模型里没有该属性", e) ; } } return obj;
}
public T save(T t) {
Object[] arr = getInsertSqlParamValueArr(t); //自动生成主键
String insertSql = getInsertSql(t) ;LogRecord.debug(BaseLog.class, insertSql) ; LogRecord.debug(BaseLog.class, "params:"+JSON.toJSONString(arr)) ; jdbcTemplate.update(insertSql,arr); return t;
}
/**
-
获取insert SQL
-
@param clazz
-
@return
*/
private String getInsertSql(T t){
Field[] fields = t.getClass().getDeclaredFields() ;
StringBuilder sql = new StringBuilder() ;sql.append(“insert into “).append(getTableName(t.getClass())) ;
sql.append(”(”) ;for(int i=0;i<fields.length;i++){
if(i>0){
sql.append(",") ;
}
sql.append(getFieldColumn(fields[i])) ;
}
sql.append(") values (") ;
for(int i=0;i<fields.length;i++){
if(i>0){
sql.append(",") ;
}
sql.append("?");
}
sql.append(")");return sql.toString() ;
}
/**
-
插入语句的值
-
@param t
*/
private Object[] getInsertSqlParamValueArr(T t){
Field[] fields = t.getClass().getDeclaredFields() ;
Object[] arrayData = new Object[fields.length];Object value = null ;
for(int i=0;i<fields.length;i++){
arrayData[i] = BeanCopierUtils.getFieldValueByName(fields[i].getName(), t) ;Annotation[] a_arr = null; //判断自动生成主键 a_arr = fields[i].getAnnotationsByType(GeneratedId.class) ; if(a_arr != null && a_arr.length > 0){//自动生成值 value = BeanCopierUtils.getFieldValueByName(fields[i].getName(), t) ; if(value == null){ value = new SnowflakeIdWorker(0, 0).nextId()%1000000000000000L ; BeanCopierUtils.setFieldValueByName(fields[i].getName(), value, t); arrayData[i] = value ; continue ; } } //判断自动生成创建时间 a_arr = fields[i].getAnnotationsByType(Ctime.class) ; if(a_arr != null && a_arr.length > 0){//自动生成值 value = BeanCopierUtils.getFieldValueByName(fields[i].getName(), t) ; if(value == null){ value = new Date() ; BeanCopierUtils.setFieldValueByName(fields[i].getName(), value, t); arrayData[i] = value ; continue ; } } //判断自动生成更新时间 a_arr = fields[i].getAnnotationsByType(Utime.class) ; if(a_arr != null && a_arr.length > 0){//自动生成值 value = BeanCopierUtils.getFieldValueByName(fields[i].getName(), t) ; if(value == null){ value = new Date() ; BeanCopierUtils.setFieldValueByName(fields[i].getName(), value, t); arrayData[i] = value ; continue ; } }
}
return arrayData;
}
public void saveBatch(List list) {
for(T t :list){
save(t) ;
}
}public void delete(T t) {
String tableName = getTableName(t.getClass());
String primaryKey = getTablePrimaryKey(t.getClass());
String sql = “delete from “+tableName +” where “+primaryKey+”=?”;LogRecord.debug(BaseLog.class, sql) ; String entryId = getEntryId(t.getClass()); Object idVal = BeanCopierUtils.getFieldValueByName(entryId, t); jdbcTemplate.update(sql,new Object[]{idVal}) ;
}
public int update(T t) {
Object[] arr = getUpdateSqlParamValueArr(t); String updateSql = getUpdateSql(t) ; LogRecord.debug(BaseLog.class, "Update SQL :"+updateSql) ; LogRecord.debug(BaseLog.class, "params:"+JSON.toJSONString(arr)) ; return jdbcTemplate.update(updateSql,arr);
}
/**
-
获取update SQL
-
@param clazz
-
@return
*/
private String getUpdateSql(T t){
Field[] fields = t.getClass().getDeclaredFields() ;
StringBuilder sql = new StringBuilder() ;String primaryId = getTablePrimaryKey(t.getClass()) ;
sql.append("update “).append(getTableName(t.getClass())) ;
sql.append(” set ") ;for(int i=0;i<fields.length;i++){
if(i>0){
sql.append(",") ;
}
sql.append(getFieldColumn(fields[i])).append(" = ? “) ;
}
sql.append(” where “).append(primaryId).append(” = ?") ;return sql.toString() ;
}
/**
-
更新语句的值
-
@param t
*/
private Object[] getUpdateSqlParamValueArr(T t){
Field[] fields = t.getClass().getDeclaredFields() ;
Object[] arrayData = new Object[fields.length+1];//String primaryId = getTablePrimaryKey(t.getClass()) ;
String entryId = getEntryId(t.getClass()) ;Object value = null ;
for(int i=0;i<fields.length;i++){Annotation[] a_arr = null; value = BeanCopierUtils.getFieldValueByName(fields[i].getName(), t) ; //判断自动生成更新时间 a_arr = fields[i].getAnnotationsByType(Utime.class) ; if(a_arr != null && a_arr.length > 0){//自动生成值 value = new Date() ; BeanCopierUtils.setFieldValueByName(fields[i].getName(), value, t); } arrayData[i] = value ;
}
arrayData[arrayData.length-1] = BeanCopierUtils.getFieldValueByName(entryId, t) ;
return arrayData;
}
public void updateBatch(List list) {
if(list != null && list.size() > 0){
for(T t : list){
update(t);
}
}}
public T get(final Class clazz, Serializable id) {
Map<String,String> map = getColumnAttrMap(clazz) ;String tableName = getTableName(clazz) ; String primaryKey = getTablePrimaryKey(clazz) ; String sql = "select * from "+tableName+" where "+primaryKey+"="+id ; LogRecord.debug(BaseLog.class, "SELECT SQL : " + sql) ; Map<String,Object> result = jdbcTemplate.queryForMap(sql) ; T obj = null ; try { obj = (T)clazz.newInstance(); } catch (Exception e) { } for (Map.Entry<String, String> entry : map.entrySet()) { BeanCopierUtils.setFieldValueByName(entry.getValue(), result.get(entry.getKey()), obj) ; } return obj ;
}
public int executeSql(String sql) {
return executeSql(sql, null,null) ;
}public int executeSql(String sql, Object arg) {
return executeSql(sql, new Object[]{arg},null) ;
}public int executeSql(String sql, Object[] args) {
return executeSql(sql, args,null) ;
}public int executeSqlByAlias(String sql, Map<String, Object> alias) {
return executeSql(sql, null,alias) ;
}public int executeSql(String sql, Object[] args, Map<String, Object> alias) {
if(alias != null && alias.size() > 0){
sql = setAliasParameter(sql, alias) ;
}
return jdbcTemplate.update(sql, args) ;
}public T queryObjectSql(Class clazz,String sql) throws Exception {
return queryObjectSql(clazz, sql, null, null);
}public T queryObjectSql(Class clazz,String sql, Object arg) throws Exception {
return queryObjectSql(clazz, sql, new Object[]{arg}, null);
}public T queryObjectSql(Class clazz,String sql, Object[] args) throws Exception {
return queryObjectSql(clazz, sql, args, null);
}
public T queryObjectSqlByAlias(Class clazz,String sql, Map<String, Object> alias)throws Exception {
return queryObjectSql(clazz, sql, null, alias);
}
public T queryObjectSql(Class clazz,String sql, Object[] args,Map<String, Object> alias) throws Exception {
SqlRowSet rowSet = null ; if(alias != null && alias.size() > 0){ sql = setAliasParameter(sql,alias); } if(args != null && args.length> 0){ rowSet = jdbcTemplate.queryForRowSet(sql,args) ; }else{ rowSet = jdbcTemplate.queryForRowSet(sql) ; } List<T> list = new ArrayList<T>() ; while(rowSet.next()){ T obj = convertToObj(clazz, rowSet) ; list.add(obj) ; } if(list != null){ if(list.size() == 1){ LogRecord.debug(BaseLog.class, JSONObject.toJSONString(list.get(0))) ; return list.get(0) ; }else if(list.size() > 1){ throw new SysException("SQL Query return duplicate "+list.size()+" rows") ; } } return null;
}
public List findSql(Class clazz, String sql) {
return findSql(clazz, sql,null, null) ;
}public List findSql(Class clazz, String sql, Object[] args) {
return findSql(clazz, sql,args, null) ;
}public List findSql(Class clazz, String sql, Object arg) {
return findSql(clazz, sql,new Object[]{arg}, null) ;
}public List findSqlByAlias(Class clazz, String sql,Map<String, Object> alias) {
return findSql(clazz, sql,null, alias) ;
}public List findSql(Class clazz, String sql, Object[] args,Map<String, Object> alias) {
SqlRowSet rowSet = null ; if(alias != null && alias.size() > 0){ sql = setAliasParameter(sql,alias); } if(args != null && args.length> 0){ rowSet = jdbcTemplate.queryForRowSet(sql,args) ; }else{ rowSet = jdbcTemplate.queryForRowSet(sql) ; } List<T> list = new ArrayList<T>() ; while(rowSet.next()){ T obj = convertToObj(clazz, rowSet) ; list.add(obj) ; LogRecord.debug(BaseLog.class, JSONObject.toJSONString(obj)) ; } return list;
}
public T queryBasicTypeSql(Class clazz,String sql) {
return queryBasicTypeSql(clazz, sql, null, null);
}public T queryBasicTypeSql(Class clazz,String sql, Object arg) {
return queryBasicTypeSql(clazz, sql, new Object[]{arg}, null);
}public T queryBasicTypeSql(Class clazz,String sql, Object[] args) {
return queryBasicTypeSql(clazz, sql, args, null);
}
public T queryBasicTypeSqlByAlias(Class clazz,String sql, Map<String, Object> alias){
return queryBasicTypeSql(clazz, sql, null, alias);
}
public T queryBasicTypeSql(Class clazz,String sql, Object[] args,Map<String, Object> alias) {
if(alias != null && alias.size() > 0){ sql = setAliasParameter(sql,alias); } T t = null ; if(args != null && args.length> 0){ t = jdbcTemplate.queryForObject(sql, args, clazz) ; }else{ t = jdbcTemplate.queryForObject(sql, clazz) ; } return t;
}
public List findBasicTypeSql(Class clazz, String sql) {
return findBasicTypeSql(clazz, sql,null, null) ;
}public List findBasicTypeSql(Class clazz, String sql, Object[] args) {
return findBasicTypeSql(clazz, sql,args, null) ;
}public List findBasicTypeSql(Class clazz, String sql, Object arg) {
return findBasicTypeSql(clazz, sql,new Object[]{arg}, null) ;
}public List findBasicTypeSqlByAlias(Class clazz, String sql,Map<String, Object> alias) {
return findBasicTypeSql(clazz, sql,null, alias) ;
}public List findBasicTypeSql(Class clazz, String sql, Object[] args,Map<String, Object> alias) {
if(alias != null && alias.size() > 0){ sql = setAliasParameter(sql,alias); } List<T> list = null ; if(args != null && args.length> 0){ list = jdbcTemplate.queryForList(sql, args, clazz); }else{ list = jdbcTemplate.queryForList(sql, clazz); } return list;
}
public PageModel listPageSql(Class clazz, String sql) {
return listPageSql(clazz, sql, null, null) ;
}public PageModel listPageSql(Class clazz, String sql, Object arg) {
return listPageSql(clazz, sql, new Object[]{arg}, null) ;
}public PageModel listPageSql(Class clazz, String sql,
Object[] args) {
return listPageSql(clazz, sql, args, null) ;
}public PageModel listPageSqlByAlias(Class clazz, String sql,Map<String, Object> alias) {
return listPageSql(clazz, sql, null, alias) ;
}public PageModel listPageSql(Class clazz, String sql,Object[] args, Map<String, Object> alias) {
SqlRowSet rowSet = null ; if(alias != null && alias.size() > 0){ sql = setAliasParameter(sql,alias); } String countSql = getCountSql(sql); ContextParam cp = ContextUtils.getContextParam(); int pageIndex = cp.getPage() ; int pageSize = cp.getLimit(); int offset = (pageIndex - 1) * pageSize; sql = sql + " limit "+offset + "," + pageSize ; LogRecord.debug(BaseLog.class, "select sql:"+sql) ; LogRecord.debug(BaseLog.class, "count sql:"+countSql) ; if(args != null && args.length> 0){ rowSet = jdbcTemplate.queryForRowSet(sql,args) ; }else{ rowSet = jdbcTemplate.queryForRowSet(sql) ; } List<T> list = new ArrayList<T>() ; while(rowSet.next()){ T obj = convertToObj(clazz, rowSet) ; list.add(obj) ; LogRecord.debug(BaseLog.class, JSONObject.toJSONString(obj)) ; } long total = countSql(countSql); PageModel<T> page = new PageModel<T>(pageIndex,pageSize,total, list); return page;
}
private String getCountSql(String sql) {
String tmpHql = sql.toLowerCase(); String condition = sql.substring(tmpHql.indexOf("from")); String countSql = "select count(*) " + condition; return countSql;
}
public long countSql(String sql) {
return countSql(sql, null, null);
}public long countSql(String sql, Object arg) {
return countSql(sql, new Object[]{arg}, null);
}public long countSql(String sql, Object[] args) {
return countSql(sql, args, null);
}public long countSqlByAlias(String sql, Map<String, Object> alias) {
return countSql(sql, null, alias);
}public long countSql(String sql, Object[] args, Map<String, Object> alias) {
if(alias != null && alias.size() > 0){
sql = setAliasParameter(sql, alias) ;
}LogRecord.debug(BaseLog.class, "count sql:"+sql) ; Long count = 0L ; if(args != null && args.length > 0){ count = jdbcTemplate.queryForObject(sql, args, Long.class); }else{ count = jdbcTemplate.queryForObject(sql, Long.class) ; } return (count==null)?0L:count.longValue() ;
}
public double sumSql(String sql) {
return sumSql(sql, null, null) ;
}public double sumSql(String sql, Object arg) {
return sumSql(sql, new Object[]{arg}, null) ;
}public double sumSql(String sql, Object[] args) {
return sumSql(sql, args, null) ;
}public double sumSqlByAlias(String sql, Map<String, Object> alias) {
return sumSql(sql, null, alias) ;
}public double sumSql(String sql, Object[] args, Map<String, Object> alias) {
if(alias != null && alias.size() > 0){
sql = setAliasParameter(sql, alias) ;
}LogRecord.debug(BaseLog.class, "sum sql:"+sql) ; Double sum = 0d; if(args != null && args.length > 0){ sum = jdbcTemplate.queryForObject(sql, args, Double.class); }else{ sum = jdbcTemplate.queryForObject(sql, Double.class); } return (sum==null)?0d:sum.doubleValue() ;
}
}