需求如题所示。这个问题我咨询了 MybatisPlus 的开发人员,得到的反馈是需要购买定制服务才能告诉我如何操作,所以我就看了下源码,找到了实现方式,封装成了工具,代码如下:
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.session.SqlSession;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.SqlSessionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
public class DBUtils {
@Autowired
private SqlSessionTemplate sqlSessionTemplate;
/**
* 获取sqlSession
*
* @return
*/
public SqlSession getSqlSession() {
return SqlSessionUtils.getSqlSession(sqlSessionTemplate.getSqlSessionFactory(),
sqlSessionTemplate.getExecutorType(), sqlSessionTemplate.getPersistenceExceptionTranslator());
}
/**
* 关闭sqlSession
*
* @param session
*/
public void closeSqlSession(SqlSession session) {
SqlSessionUtils.closeSqlSession(session, sqlSessionTemplate.getSqlSessionFactory());
}
public List<Map<String, Object>> executeQuerySql(String sql) {
log.info("执行查询sql:" + sql);
List<Map<String, Object>> list = new ArrayList<>();
PreparedStatement pst = null;
SqlSession session = getSqlSession();
ResultSet result = null;
try {
pst = session.getConnection().prepareStatement(sql);
result = pst.executeQuery();
ResultSetMetaData md = result.getMetaData();//获得结果集结构信息,元数据
int columnCount = md.getColumnCount(); //获得列数
while (result.next()) {
Map<String, Object> rowData = new HashMap<>();
for (int i = 1; i <= columnCount; i++) {
rowData.put(md.getColumnName(i), result.getObject(i));
}
list.add(rowData);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (pst != null) {
try {
pst.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
closeSqlSession(session);
}
return list;
}
}