tk.mybatis扩展通用方法实现新增/修改后返回实体对象
·
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);
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)