我们都知道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