mybatis 传入id_mybatis插入与批量插入返回ID的原理详解

背景

最近正在整理之前基于mybatis的半ORM框架。原本的框架底层类ORM操作是通过StringBuilder的append拼接的,这次打算用JsqlParser重写一遍,一来底层不会存在太多的文本拼接,二来基于其他开源包维护难度会小一些,最后还可以整理一下原有的冗余方法。

这两天整理insert相关的方法,在将对象插入数据库后,期望是要返回完整对象,并且包含实际的数据库id。

基础相关框架为:spring、mybatis、hikari。

底层调用方法

最底层的做法实际上很直白,就是利用mybatis执行最简单的sql语句,给上代码。

@Repository("baseDao")

public class BaseDao extends SqlSessionDaoSupport {

private Logger logger = LoggerFactory.getLogger(this.getClass());

/**

* 最大的单次批量插入的数量

*/

private static final int MAX_BATCH_SIZE = 10000;

@Override

@Autowired

public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {

super.setSqlSessionFactory(sqlSessionFactory);

}

/**

* 根据sql方法名称和对象插入数据库

*/

public Object insert(String sqlName, Object obj) throws SQLException {

return getSqlSession().insert(sqlName, obj); // 此处直接执行传入的xml中对应的sql id,以及参数

}

}

单个对象插入

java代码

/**

* 简单插入实体对象

*

* @param entity 实体对象

* @throws SQLException

*/

public T insertEntity(T entity) throws SQLException {

Insert insert = new Insert();

insert.setTable(new Table(entity.getClass().getSimpleName()));

insert.setColumns(JsqlUtils.getColumnNameFromEntity(entity.getClass()));

insert.setItemsList(JsqlUtils.getAllColumnValueFromEntity(entity,insert.getColumns()));

Map param = new HashMap<>();

param.put("baseSql", insert.toString());

param.put("entity", entity);

this.insert("BaseDao.insertEntity", param);

return entity;

}

xml代码

${baseSql}

其他的就不多说了,这里针对如何返回已经入库的id给个说明。

在xml的 insert 标签中,设置 keyProperty 为 对应对象的id字段,和 insert(sqlName, obj) 这个方法中的 obj 是对应的。

这里一般有两种情况:

直接保存实体的对象作为参数传入(给伪代码示例)

SaveObject saveObject = new SaveObject(); // SaveObject中包含字段soid,作为自增id

saveObject.setName("my name");

saveObject.s

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值