因为以前使用的jpa封装的方法在更新和新增后返回的是最后保存的实体,但是现在想换成tk.mybatis框架然而此框架返回的是修改后影响的行数不太符合要求,于是就想办法抽离出通用的扩展方法,可能不是很严谨但是一般的使用却没问题。
2.公共接口继承tk.mybatis 的Mapper
接口中的static方法可以抽到工具类中
public interface IbaseDao3.使用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; } }
继承自己的公共接口 1. public interface UserDao extends IbaseDao2.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);



