我们都知道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
项目:JFinal-layui