jfinal用的BaseDao

本项目基于SpringBoot+Jfinal

关于整合方案请参考http://www.jfinal.com/share/1402


BaseDao代码

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Model;
import com.jfinal.plugin.activerecord.Page;
import com.jfinal.plugin.activerecord.Record;
import com.jfinal.plugin.activerecord.SqlPara;
import com.jfinal.plugin.activerecord.Table;
import com.jfinal.plugin.activerecord.TableMapping;

/**
 * 顶级baseDao
 * @author 小李子
 *
 * @param <M>
 */
public abstract class BaseDao <M extends Model<?>>{
	
	/**
	 * 实体
	 */
	protected M model;
	/**
	 * 过滤列
	 */
	protected List<String> filterColumns;
	
	/**
	 * 设置Model
	 */
	private void setModelIn() {
		model=setModel();
	}
	
	/**
	 * 设置过滤不查询的列
	 */
	private void setFilterColumnsIn() {
		filterColumns=setFilterColumns();
	}
	
	/**
	 * 设置Model
	 * 子类需实现该方法
	 * 不然会报空指针异常
	 * @return M
	 */
	public abstract M setModel();
	/**
	 * 设置不查询的列
	 * 子类若实现该方法并返回非空集合
	 * 则查询时过滤该列
	 * @return
	 */
	public abstract List<String> setFilterColumns();
	
	/**
	 * 基础增删改方法
	 * @param m
	 * @return boolean
	 */
	public boolean insert(M m) {
		return m.save();
	}
	public boolean update(M m) {
		return m.update();
	}
	public boolean del(M m) {
		return m.delete();
	}
	
	/**
	 * 根据id查询
	 * @param id
	 * @return M
	 */
	@SuppressWarnings("unchecked")
	public M findById(Object id) {
		HashMap<String, Object> params=new HashMap<String, Object>();
		params.put("id", id);
		String sql = getSql(params, null, "limit 1");
		SqlPara sqlPara = getSqlPara(sql);
		return (M) model.findFirst(sqlPara);
	}
	/**
	 * 根据id删除
	 * @param id
	 * @return boolean
	 */
	public boolean delById(Object id) {
		setModelIn();
		return model.deleteById(id);
	}
	
	
	/**
	 * 查询方法
	 * @param params 参数
	 * @param orderBy 排序
	 * @param sql otherSql 如 limit
	 * @return List<M>
	 */
	@SuppressWarnings("unchecked")
	public List<M> select(HashMap<String, Object> params,HashMap<String, Object> orderBy,String sql){
		String sql2 = getSql(params, orderBy, sql);
		List<M> find = (List<M>) model.find(sql2);
		return find;
	}
	
	/**
	 * 分页查询
	 * @param params 参数
	 * @param orderBy 排序
	 * @param sql otherSql 如 limit
	 * @param pageNumber 页码
	 * @param pageSize 页大小
	 * @return
	 */
	public Page<Map<String,Object>> page(HashMap<String, Object> params,HashMap<String, Object> orderBy,String sql,int pageNumber,int pageSize){
		String sql2 = getSql(params, orderBy, sql);
		SqlPara sqlPara=new SqlPara();
		sqlPara.setSql(sql2);
		Page<Record> paginate = Db.paginate(pageNumber, pageSize, sqlPara);
		return toMapPage(paginate);
	}
	
	/**
	 * 获取SqlPara
	 * @param sql sql语句
	 * @return SqlPara
	 */
	private SqlPara getSqlPara(String sql) {
		SqlPara sqlPara = new SqlPara();
		sqlPara.setSql(sql);
		return sqlPara;
	}
	/**
	 * 转换sql语句
	 * @param params 参数
	 * @param orderBy 排序
	 * @param sql otherSql 如 limit
	 * @return sql
	 */
	private String getSql(HashMap<String, Object> params,HashMap<String, Object> orderBy,String sql) {
		setModelIn();
		StringBuffer s=new StringBuffer();
		s.append("select ");
		Set<String> columnNameSet = getTable().getColumnNameSet();
		String columnNames = columnNameSet.toString().replace("[", "").replace("]", "").replace(" ", "");
		
		setFilterColumnsIn();
		if (filterColumns!=null&&filterColumns.size()!=0) {
			for (String column : filterColumns) {
				if (columnNames.contains(column)) {
					columnNames=columnNames.replace(","+column, "");
					if (columnNames.contains(column)) {
						columnNames=columnNames.replace(column+",", "");
					}
					if (columnNames.contains(column)) {
						columnNames=columnNames.replace(column, "");
					}
				}
			}
		}
		s.append(columnNames);
		s.append(" from ");
		s.append(getTable().getName());
		s.append(" where 1=1 ");
		if (params!=null) {
			Set<String> keySet = params.keySet();
			for (String key : keySet) {
				s.append("and ");
				s.append(key);
				s.append("=");
				s.append(params.get(key));
			}
		}
		if (sql!=null) {
			s.append(" ");
			s.append(sql);
		}
		if (orderBy!=null) {
			Set<String> keySet = orderBy.keySet();
			s.append(" ");
			s.append("order by");
			s.append(" ");
			for (String key : keySet) {
				if (orderBy.get(key)!=null) {
					s.append(key);
					s.append(" ");
					s.append(orderBy.get(key));
				}
			}
		}
		return s.toString();
	}
	
	/**
	 * 获取table
	 * @return
	 */
	private Table getTable() {
		return TableMapping.me().getTable(model.getClass());
	}
	
	
	/**
	 * 将Page<Record>列表转换成Page<Map>列表
	 * @param Page<Record>
	 * @return
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	private Page<Map<String,Object>> toMapPage(Page<Record> recordPage){
	
		List<Map<String,Object>> list = toMapList(recordPage.getList());
		Page<Map<String,Object>> result = new Page(
				list,
				recordPage.getPageNumber(),
				recordPage.getPageSize(),
				recordPage.getTotalPage(),
				recordPage.getTotalRow());
		return result;
	}
	/**
	 * 将Record列表转换成Map列表
	 * @param recordList
	 * @return
	 */
	private List<Map<String,Object>> toMapList(List<Record> recordList){
		List<Map<String,Object>> result = new ArrayList<Map<String,Object>>();
		if(null!=recordList && !recordList.isEmpty()){
			for(Record record:recordList){
				result.add(record.getColumns());
			}
		}
		return result;
	}
	

}



使用方法


创建Dao层

import java.util.List;

import org.springframework.stereotype.Repository;

import com.wx.base.BaseDao;
import com.wx.model.Configs;


@Repository
/**
 * 继承BaseDao
 * 并实现其抽象方法
 * setModel() 方法为必须返回一个非空值
 * @author 小李子
 *
 */
public class ConfigDao extends BaseDao<Configs>{


	@Override
	public Configs setModel() {
		return new Configs();
	}

	@Override
	public List<String> setFilterColumns() {
		
		return null;
	}

}

Controller调用


为了方便省略service层


实际开发中不建议省略

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.alibaba.fastjson.JSONObject;
import com.wx.dao.ConfigDao;
import com.wx.entity.ResultBean;
import com.wx.model.Configs;

@RequestMapping("config")
@RestController
public class ConfigController {
	@Autowired
	private ConfigDao cd;
	/**
	 * 根据id查询
	 * @param id
	 * @return
	 */
	@RequestMapping("test")
	public Object test(String id) {
		
		return cd.findById(id);
	}
	/**
	 * 查询全部
	 * @return
	 */
	@RequestMapping("getConfig")
	public ResultBean getConfig() {
		try {
			List<Configs> select = cd.select(null, null,null);
			return ResultBean.success(select.get(0));
		} catch (Exception e) {
			e.printStackTrace();
			return ResultBean.fail("系统错误,请稍后再试");
		}
	}
	/**
	 * 修改
	 * @param json
	 * @return
	 */
	@RequestMapping("modify")
	public ResultBean modify(String json) {
		try {
			Configs config = JSONObject.parseObject(json, Configs.class);
			boolean update = cd.update(config);
			if (update) {
				return ResultBean.success();
			}else {
				return ResultBean.fail("修改失败,请稍后再试");
			}
		} catch (Exception e) {
			e.printStackTrace();
			return ResultBean.fail("系统错误,请稍后再试");
		}
	}

}


生成的sql为

Sql: select msg,img,id,title from configs where 1=1

查询结果为

{"id":1,"msg":"test","img":"test","title":"test"}

若设置了过滤列


        Dao层实现方法

        @Override
	public List<String> setFilterColumns() {
		List<String> strs=new ArrayList<String>();
		strs.add("title");
		return strs;
	}


生成sql为

Sql: select msg,img,id from configs where 1=1 and id=1 limit 1

查询结果为

{"id":1,"msg":"test","img":"test","title":null}

希望各位大佬给点改进建议


评论区

JFinal

2019-10-10 14:50

大量的 springboot 项目在使用 jfinal 的 active record 模块

jfinal 的 active record 模块早已发布为独立的项目,可以单独引入,可以进一步降低 jar 包的大小:
https://www.jfinal.com/doc/5-15
https://www.jfinal.com/doc/6-10

谢谢分享

cs3230524

2019-10-14 14:28

楼主请问数据字典怎么使用?直接修改实体的 getter 吗?