[背景]
jfinal的activeModel的model类默认提供了findFirst方法,一般的使用方法如下
employeePhotoFaceDao.findFirst("select * from employee_photo_face where id=?");
使我不满意的是需要在sql中添加表名 employee_photo_face,能不能不添加这个表名呢?
[分析]
jfinal在启动是使用_MappingKit 建立的映射
public class _MappingKit { public static void mapping(ActiveRecordPlugin arp) { arp.addMapping("employee", "id", Employee.class); arp.addMapping("employee_department", "id", EmployeeDepartment.class); arp.addMapping("employee_group", "id", EmployeeGroup.class); arp.addMapping("employee_photo_face", "id", EmployeePhotoFace.class); arp.addMapping("employee_type", "id", EmployeeType.class); arp.addMapping("sys_user", "id", SysUser.class); } }
可以使用TableMapping.me().getTable(modelClass); 获取表名
剩下的就是泛型的问题了
[封装]
最终封装的代码如下
package com.litong.jfinal.service; import com.jfinal.aop.Aop; import com.jfinal.plugin.activerecord.Model; import com.jfinal.plugin.activerecord.Table; import com.jfinal.plugin.activerecord.TableMapping; import com.litong.modules.face.recognize.common.model.EmployeePhotoFace; /** * @author litong * @date 2020年9月29日_上午8:14:51 * @version 1.0 * @param <M> * @desc */ public class ActiveRecoredService { // 第一版 // public EmployeePhotoFace findFirst(String select, String where, Class<EmployeePhotoFace> class1) { // return null; // } // 第二版 // public <T>T findFirst(String select, String where, Class<T> class1) { // return null; // } // 第三版 // public <T> T findFirst(String select, String where, Class<? extends Model> class1) { // return null; // } // 第 四 版 public <M extends Model<M>> M findFirst(String select, String where, Class<M> modelClass, Object... paras) { Table table = TableMapping.me().getTable(modelClass); M m = Aop.get(modelClass); return m.findFirst(select + " " + "from " + table.getName() + " " + where, paras); } public static void main(String[] args) { ActiveRecoredService activeRecoredService = Aop.get(ActiveRecoredService.class); EmployeePhotoFace e = activeRecoredService.findFirst("select ", "where id=1", EmployeePhotoFace.class); } }
测试
public void testModel() { // ar 应 设置成类变量 ActiveRecoredService ar = Aop.get(ActiveRecoredService.class); EmployeePhotoFace findFirst = ar.findFirst("select *", "where id=?", EmployeePhotoFace.class, 1); JsonBean<EmployeePhotoFace> jsonBean = new JsonBean<>(findFirst); renderJson(jsonBean); }
测试成功