1.介绍

因为以前使用的jpa封装的方法在更新和新增后返回的是最后保存的实体,但是现在想换成tk.mybatis框架然而此框架返回的是修改后影响的行数不太符合要求,于是就想办法抽离出通用的扩展方法,可能不是很严谨但是一般的使用却没问题。

2.公共接口

继承tk.mybatis 的Mapper
接口中的static方法可以抽到工具类中

public  interface IBaseDao<T> extends Mapper<T>, IdsMapper<T>, InsertListMapper<T>, ConditionMapper<T> {

//没有使用SqlSessionFactory ,插入和查询都会重新new SqlSession 
  default T customInsertSelective(T t){
    T t2=null;
    int i = this.insertSelective(t);
    if (i>0){

      Field id = getDeclareField(t, "id");
      if (id!=null){
        boolean flag = id.isAccessible();
        try {
          //设置该属性总是可访问
          id.setAccessible(true);
          t2=this.selectByPrimaryKey(id.get(t));
        } catch (IllegalAccessException e) {
          System.out.println(e.getMessage());
        }
        //还原可访问权限
        id.setAccessible(flag);
      }
    }
    return t2;
  }

  /**
   *自定义非空插入
   ******************************************
   * @author [2021/12/15 9:54]
   * @version 1.0.0
   ******************************************
   * @param t 实体
   * @param factory sql工厂
   * @param var1 mapper接口
   * @return T 存入的数据
   */
  default <Y> T customInsertSelectiveSqlSession(T t,SqlSessionFactory factory,Class<Y> var1){
    SqlSession session =  factory.openSession(ExecutorType.SIMPLE,false);
    IBaseDao mapper = (IBaseDao) session.getMapper(var1);
    T t2=null;
    try {
      //先插入
      int i = mapper.insertSelective(t);
      if (i>0){
        //插入成功,获取返回的id
        Field id = getDeclareField(t, "id");
        if (id!=null){
          boolean flag = id.isAccessible();
          try {
            //设置该属性总是可访问
            id.setAccessible(true);
            t2= (T) mapper.selectByPrimaryKey(id.get(t));
          } catch (IllegalAccessException e) {
            System.out.println(e.getMessage());
          }
          //还原可访问权限
          id.setAccessible(flag);
        }
      }
      session.commit();
      session.clearCache();
    } catch (Exception e) {
      // 没有提交的数据可以回滚
      session.rollback();
      e.printStackTrace();
    } finally {
      session.close();
    }
    return t2;
  }
  
  /**
   *自定义非空更新
   ******************************************
   * @author [2021/12/15 14:26]
   * @version 1.0.0
   ******************************************
   * @param t
   * @param factory
   * @param var1      
   * @return T
   */
  default <Y> T customUpdateSelectiveSqlSession(T t,SqlSessionFactory factory,Class<Y> var1){
    SqlSession session =  factory.openSession(ExecutorType.SIMPLE,false);
    IBaseDao mapper = (IBaseDao) session.getMapper(var1);
    T t2=null;
    try {
      //先插入
      int i = mapper.updateByPrimaryKeySelective(t);
      if (i>0){
        //插入成功,获取返回的id
        Field id = getDeclareField(t, "id");
        if (id!=null){
          boolean flag = id.isAccessible();
          try {
            //设置该属性总是可访问
            id.setAccessible(true);
            t2= (T) mapper.selectByPrimaryKey(id.get(t));
          } catch (IllegalAccessException e) {
            System.out.println(e.getMessage());
          }
          //还原可访问权限
          id.setAccessible(flag);
        }
      }
      session.commit();
      session.clearCache();
    } catch (Exception e) {
      // 没有提交的数据可以回滚
      session.rollback();
      e.printStackTrace();
    } finally {
      session.close();
    }
    return t2;
  }


  /**
   * 获取对象所有的属性,包括父类的属性
   */
   static Field[] getAllProperties(Object o) {
    Class clazz = o.getClass();
    List<Field> fieldList = new ArrayList<>();
    while (clazz != null) {
      fieldList.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields())));
      clazz = clazz.getSuperclass();
    }
    Field[] fields = new Field[fieldList.size()];
    fieldList.toArray(fields);
    return fields;
  }

  /**
   * 根据属性名查找对应的属性,子类没有的属性会到父类找
   *
   * @param o
   * @param fieldName
   * @return
   */
   static Field getDeclareField(Object o, String fieldName) {
    Field field = null;
    Class<?> clazz = o.getClass();
    for (; clazz != Object.class; clazz = clazz.getSuperclass()) {
      try {
        field = clazz.getDeclaredField(fieldName);
      } catch (NoSuchFieldException e) {

        System.out.println("bean没有该属性,bean = " + clazz.getName() + ",属性 = " + fieldName);
      }
    }
    return field;
  }
}

3.使用

继承自己的公共接口
1.   public interface UserDao extends IBaseDao<User>

2.SqlSessionFactory 

  @Resource
  SqlSessionFactory sqlSessionFactory;

3.调用

//自定义非空插入
User user2 = userDao.customInsertSelectiveSqlSession(user, sqlSessionFactory,UserDao.class);
System.out.println(user2);

//自定义非空更新
user2.setName("更新修改数据11111");
User user1 = userDao.customUpdateSelectiveSqlSession(user2, sqlSessionFactory, UserDao.class);
System.out.println(user1);

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐