基于JFinal的BaseServicec数据库持久层接口封装思想

我们都知道JFinal的model拥有丰富的持久层数据接口,方便我们使用,但是model的接口很多都是带有sql的参数,就算你是一个很简单的“select * from user"也都要自己在service里面封装一次,业务接口多了,写的也多。那么如何让我们省去这些工作量呢?接下来就展示怎么样用一个BaseService封装通用的持久层方法。

1、只要设计一个抽象方法getDao()让继承类实现即可,有了这个抽象方法你就可以在这个BaseService封装通用的数据库持久层的方法了,你也就可以省掉了“select * from table“的代码了。

/**
 * 基于JFinal的通用service接口
 * @author QinHaiLin
 */
public abstract class BaseService {
    protected Logger logger = Logger.getLogger(getClass());
	/**
	 * 获取model dao
	 * @return 业务Model
	 */
	public abstract Model<?> getDao();
}

2、然后再写一个公共方法getTable()获取model绑定的表:

   /**
 * 基于JFinal的通用service接口
 * @author QinHaiLin
 */
public abstract class BaseService {
	
	/**
	 * 获取model dao
	 * @return 业务Model
	 */
	public abstract Model<?> getDao();

        /**
	 * 获取table名称
	 * @return tableName
	 */
	public String getTable() {
		return _getTable().getName();
	};
	
	
	/**
	 *获取JFinal表对象
	 */
	protected Table _getTable() {
		if(getDao()==null){
			logger.error("请实现getDao()方法,且不能返回null");
		}
	        return TableMapping.me().getTable(getDao().getClass());
	}

}

3、接下来就可利用这两个方法封装你的数据接口了,如查询列表:select * from table

       public List<Record> queryAllList() {
		return Db.find(getQuerySql());
	}
	/**
	 *@param 排序、分组语句
	 */
	public List<Record> queryAllList(String orderByGroupBy) {
		return Db.find(getQuerySql()+orderByGroupBy);
	}
	private String getQuerySql() {			
		return "select * from "+getTable()+" ";
	}

再比如增、删、改、查方法封装:

        /**
	 * 通用findById
	 * @param id
	 * @return
	 */
	public Model<?> findById(String id){
		return getDao().findById(id);
	}
	
	/**
	 * 通过字段查找对象数据
	 * @param pk 字段名
	 * @param value 字段值
	 * @return
	 */
	public Model<?> findByPk(String pk,String value){
		List<?> list=getDao().find(getQuerySql()+" where "+pk+"=?", value);
		if(list.size()>0){
			return (Model<?>) list.get(0);
		}
		return null;
	}
	
	/**
	 * 通用save
	 * @param entity
	 * @return
	 */
	public boolean save(Model<?> entity){
		//主键赋值uuid
		if(entity.get(getPK())==null){
			entity.set(getPK(), IdKit.createUUID());		
		};
		return entity.save();
	}
	
	/**
	 * 通用update
	 * @param entity
	 * @return
	 */
	public boolean update(Model<?> entity){
		return entity.update();
	}
	
	/**
	 * 通用delete
	 * @param entity
	 * @return
	 */
	public boolean delete(Model<?> entity){
		return entity.delete();
	}
	
	/**
	 * 通用deleteById
	 * @param id
	 * @return
	 */
	public boolean deleteById(String id){
		return getDao().deleteById(id);
	}
	
	/**
	 * 通用deleteByIds
	 * @param ids
	 */
	public void deleteByIds(List<String> ids){
		Object[][] paras=new Object[ids.size()][1];
		for(int i=0;i<ids.size();i++) {
			paras[i][0]=ids.get(i);
		}
		String sql="delete from "+getTable()+" where id=?";
		Db.batch(sql, paras, 100);
	}
	
	/**
	 * 根据字段删除数据
	 * @param ids
	 * @param pk
	 */
	public void deleteByPk(List<String> ids,String pk){
		Object[][] paras=new Object[ids.size()][1];
		for(int i=0;i<ids.size();i++) {
			paras[i][0]=ids.get(i);
		}
		String sql="delete from "+getTable()+" where "+pk+"=?";
		Db.batch(sql, paras, 100);
	}
	
	/**
	 * 是否存在对象数据
	 * @param pk
	 * @param value
	 * @return
	 */
	public boolean isExit(String pk,String value){
		List<?> list=Db.find(getQuerySql()+"where "+pk+"=? limit 1", value);
		if(list.size()==1){
			return true;
		}
		return false;
	}

4、service外部接口实现抽象方法getDao()代码:

public class SysUserService extends BaseService {

	private SysUser dao = new SysUser().dao();
	
	/* (non-Javadoc)
	 * @see com.qinhailin.common.base.service.BaseService#getDao()
	 */
	@Override
	public Model<?> getDao() {
		return dao;
	}

}


5、再分享一下我的查询、分页的封装,带sql是方便业务层service进行调用,仅供参考:

public List<Record> queryForList(String sql) {
	return Db.find(sql);
}
	
public List<Record> queryForList(String sql,Object...object) {
	return Db.find(sql,object);
}

public List<Record> queryForList(String sql,Record record) {
	return queryForList(sql,record,null);
}
	
public List<Record> queryForList(String sql,Record record,String groupOrderBy){
	List<Object> paras = new ArrayList<>();
	sql = this.createQuerySql(sql, groupOrderBy, record, paras, "like");
	List<Record> list = Db.find(sql, paras.toArray());
	return list;
}
	
public List<Record> queryForListEq(String sql,Record record,String groupOrderBy){
	List<Object> paras = new ArrayList<>();
	sql = this.createQuerySql(sql, groupOrderBy, record, paras, "=");
	List<Record> list = Db.find(sql, paras.toArray());
	return list;
}
	
        /**
	 * 自定义分页查询
	 * @param sql
	 * @param pageNumber
	 * @param pageSize
	 * @param record
	 * @param groupOrderBy
	 * @return
	 */
public Grid queryForList(String sql,int pageNumber,int pageSize,Record record,String groupOrderBy){
    List<Object> paras = new ArrayList<>();
    sql = this.createQuerySql(sql, groupOrderBy, record, paras, "like");
    return getGrid(pageNumber, pageSize, sql, paras.toArray());
}
	
public Grid queryForListEq(String sql,int pageNumber,int pageSize,Record record,String groupOrderBy){
	List<Object> paras = new ArrayList<>();
	sql = this.createQuerySql(sql, groupOrderBy, record, paras, "=");
	return getGrid(pageNumber, pageSize, sql, paras.toArray());
}
	
public Grid queryForList(int pageNumber,int pageSize,String sql){
	return getGrid(pageNumber, pageSize, sql);
}
	
public Grid queryForList(int pageNumber,int pageSize,String sql,Object...object){
	return getGrid(pageNumber, pageSize, sql, object);	
}
	
public Grid queryForList(int pageNumber,int pageSize){
	return getGrid( pageNumber, pageSize,getQuerySql());
}
	
public Grid queryForList(int pageNumber,int pageSize,Record record){
	List<Object> paras=new ArrayList<>();
	String sql=createQuerySql(getQuerySql(), null, record, paras, "like");
	return getGrid( pageNumber, pageSize,sql,paras.toArray());
}
	
public Grid queryForList(int pageNumber,int pageSize,Record record,String  orderBygroupBySql){
	List<Object> paras=new ArrayList<>();
	String sql=createQuerySql(getQuerySql(), orderBygroupBySql, record, paras, "like");
	return getGrid( pageNumber, pageSize,sql,paras.toArray());
}
	
	/**
	 * 全等查询
	 * @param pageNumber
	 * @param pageSize
	 * @param record
	 * @return
	 */
public Grid queryForListEq(int pageNumber,int pageSize,Record record){
      List<Object> paras=new ArrayList<>();
      String sql=createQuerySql(getQuerySql(), null, record, paras, "=");
      return getGrid( pageNumber, pageSize,sql,paras.toArray());
}
	
	/**
	 * 全等查询
	 * @param pageNumber
	 * @param pageSize
	 * @param record
	 * @param orderBygroupBySql
	 * @return
	 */
public Grid queryForListEq(int pageNumber,int pageSize,Record record,String orderBygroupBySql){
	List<Object> paras=new ArrayList<>();
        String sql=createQuerySql(getQuerySql(), orderBygroupBySql, record, paras, "=");
	return getGrid( pageNumber, pageSize,sql,paras.toArray());
}
				
	/**
	 * 分页,模糊查询
	 * @param grid
	 * @param record columns查询元素集合  
	 * @return
	 */
public Grid queryForList(Grid grid, Record record) {
	List<Object> paras=new ArrayList<>();
	String sql = this.createQuerySql(getQuerySql(), null, record, paras, "like");
	return getGrid(grid.getPageNumber(),grid.getPageSize(),sql,paras.toArray());
}
	
	/**
	 * 分页查询,分组排序
	 * @param grid
	 * @param orderBygroupBySql
	 * @return
	 */
public Grid queryForList(Grid grid, String orderBygroupBySql) {
	List<Object> paras=new ArrayList<>();
	String sql = this.createQuerySql(getQuerySql(), orderBygroupBySql, null, paras, "like");
	return getGrid(grid.getPageNumber(),grid.getPageSize(),sql,paras.toArray());
}

	/**
	 * 分页,模糊查询,分组排序
	 * @param grid
	 * @param record columns查询元素集合
	 * @param orderBygroupBySql 分组排序
	 * 
	 */
public Grid queryForList(Grid grid, Record record, String orderBygroupBySql) {
	List<Object> paras = new ArrayList<>();
	String sql = this.createQuerySql(getQuerySql(), orderBygroupBySql, record, paras, "like");
	return getGrid(grid.getPageNumber(),grid.getPageSize(),sql,paras.        toArray());
}

private Grid getGrid(int pageNumber,int pageSize,String sql,Object... paras){
	int startIndex = (pageNumber - 1) * pageSize;
	List<Record> list = Db.find(sql + " limit " + startIndex + "," + pageSize, paras);
	List<Record> count = Db.find(sql, paras);
	return new Grid(list, pageNumber, pageSize, count.size());
}
	
private Grid getGrid(int pageNumber,int pageSize,String sql){
	int startIndex = (pageNumber - 1) * pageSize;
	List<Record> list = Db.find(sql + " limit " + startIndex + "," + pageSize);
	List<Record> count = Db.find(sql);
	return new Grid(list, pageNumber, pageSize, count.size());
}
	
	/**
	 * 拼接模糊查询条件
	 * 
	 * @param sql
	 * @param orderByGroupBySql
	 * @param record
	 *            columns查询元素集合
	 * @param paras
	 * @param queryType
	 *            like or = ,模糊查询或者全等查询
	 * @return
	 */
private String createQuerySql(String sql, String orderByGroupBySql, Record record, List<Object> paras,String queryType) {
	if(record==null){
	return orderByGroupBySql == null ? sql : sql + " " + orderByGroupBySql;
}
		
Map<String,Object> columns=record.getColumns();
      Iterator<String> iter=columns.keySet().iterator();
      StringBuffer whereSql=new StringBuffer();
        
      while(iter.hasNext()){
        String column=iter.next();
        Object value=columns.get(column);
        	
        if(value!=null&&value.toString().trim().length()>0){
        	if(whereSql.length()>0){
        		whereSql.append(" and ");
        	}
		if ("=".equals(queryType)) {
			whereSql.append(column + " = ? ");
			paras.add(value);
		} else {
			whereSql.append(column + " like ? ");
			paras.add("%" + value + "%");
		}
          }
       }

        if(whereSql.length()>0){
        	if(sql.contains("where")){
        		sql+=" and "+whereSql.toString();
        	}else{
        		sql+=" where "+whereSql.toString();
        	}        	
        }
        
	if (orderByGroupBySql != null) {
		sql += " " + orderByGroupBySql;
	}
		
        return sql;
}

思路有了,要什么样的接口都可以自行封装了。

然后复杂的业务sql就用JFinal的sql管理,这样就非常舒服了。

6、这个设计思想你学会了吗,点赞+收藏吧,与人为乐!

7、实战项目分享:JFinal-layui极速开发企业应用管理系统

     开源项目地址:https://gitee.com/QinHaiSenLin/Jfinal-layui



评论区

山东小木

2019-01-10 19:15

嗯 就是这么搞

琴海森林

2019-01-10 19:19

@山东小木 嗯,小木的学院还是有很多料的,哈哈哈

北流家园网

2019-01-11 21:22

太少了,分页查询、缓存查询等内容都没集完。

琴海森林

2019-01-11 22:05

@北流家园网 代码没贴完而已,要看详细的分页查询的,可以看分享的开源项目里面有。

琴海森林

2019-01-12 08:44

贴了一些分页查询的封装示例

北流家园网

2019-01-16 04:16

赞一个

jboss_final

2019-01-18 15:23

赞一个,可能有更简单的方式噢: enhancer.io