栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

tk.mybatis扩展通用方法实现新增/修改后返回实体对象

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

tk.mybatis扩展通用方法实现新增/修改后返回实体对象

1.介绍

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

2.公共接口

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

public  interface IbaseDao extends Mapper, IdsMapper, InsertListMapper, ConditionMapper {

//没有使用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;
  }

  
  default  T customInsertSelectiveSqlSession(T t,SqlSessionFactory factory,Class 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;
  }
  
  
  default  T customUpdateSelectiveSqlSession(T t,SqlSessionFactory factory,Class 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 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;
  }

  
   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

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);

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/672094.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号