package com.supervision.util.mybatis; import com.supervision.util.mybatis.RowMapperStatementBuilder; import org.apache.ibatis.exceptions.TooManyResultsException; import org.apache.ibatis.session.SqlSession; import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; /** * 基于mybatis直接执行sql语句的工具类 */ @Component public class RowSqlMapper { private final RowMapperStatementBuilder mapperStatementBuilder; private final SqlSession sqlSession; /** * 构造方法,默认缓存MappedStatement * * @param sqlSession */ public RowSqlMapper(SqlSession sqlSession) { this.sqlSession = sqlSession; this.mapperStatementBuilder = new RowMapperStatementBuilder(sqlSession.getConfiguration()); } /** * 获取List中最多只有一个的数据 * * @param list List结果 * @param 泛型类型 * @return */ private T getOne(List list) { if (list.size() == 1) { return list.get(0); } else if (list.size() > 1) { throw new TooManyResultsException("Expected one result (or null) to be returned by selectOne(), but found: " + list.size()); } else { return null; } } /** * 查询返回一个结果,多个结果时抛出异常 * * @param sql 执行的sql * @return */ public Map selectOne(String sql) { List> list = selectList(sql); return getOne(list); } /** * 查询返回一个结果,多个结果时抛出异常 * * @param sql 执行的sql * @param value 参数 * @return */ public Map selectOne(String sql, Object value) { List> list = selectList(sql, value); return getOne(list); } /** * 查询返回一个结果,多个结果时抛出异常 * * @param sql 执行的sql * @param resultType 返回的结果类型 * @param 泛型类型 * @return */ public T selectOne(String sql, Class resultType) { List list = selectList(sql, resultType); return getOne(list); } /** * 查询返回一个结果,多个结果时抛出异常 * * @param sql 执行的sql * @param value 参数 * @param resultType 返回的结果类型 * @param 泛型类型 * @return */ public T selectOne(String sql, Object value, Class resultType) { List list = selectList(sql, value, resultType); return getOne(list); } /** * 查询返回List> * * @param sql 执行的sql * @return */ public List> selectList(String sql) { String msId = mapperStatementBuilder.select(sql); return sqlSession.selectList(msId); } /** * 查询返回List> * * @param sql 执行的sql * @param value 参数 * @return */ public List> selectList(String sql, Object value) { Class parameterType = value != null ? value.getClass() : null; String msId = mapperStatementBuilder.selectDynamic(sql, parameterType); return sqlSession.selectList(msId, value); } /** * 查询返回指定的结果类型 * * @param sql 执行的sql * @param resultType 返回的结果类型 * @param 泛型类型 * @return */ public List selectList(String sql, Class resultType) { String msId; if (resultType == null) { msId = mapperStatementBuilder.select(sql); } else { msId = mapperStatementBuilder.select(sql, resultType); } return sqlSession.selectList(msId); } /** * 查询返回指定的结果类型 * * @param sql 执行的sql * @param value 参数 * @param resultType 返回的结果类型 * @param 泛型类型 * @return */ public List selectList(String sql, Object value, Class resultType) { String msId; Class parameterType = value != null ? value.getClass() : null; if (resultType == null) { msId = mapperStatementBuilder.selectDynamic(sql, parameterType); } else { msId = mapperStatementBuilder.selectDynamic(sql, parameterType, resultType); } return sqlSession.selectList(msId, value); } /** * 插入数据 * * @param sql 执行的sql * @return */ public int insert(String sql) { String msId = mapperStatementBuilder.insert(sql); return sqlSession.insert(msId); } /** * 插入数据 * * @param sql 执行的sql * @param value 参数 * @return */ public int insert(String sql, Object value) { Class parameterType = value != null ? value.getClass() : null; String msId = mapperStatementBuilder.insertDynamic(sql, parameterType); return sqlSession.insert(msId, value); } /** * 更新数据 * * @param sql 执行的sql * @return */ public int update(String sql) { String msId = mapperStatementBuilder.update(sql); return sqlSession.update(msId); } /** * 更新数据 * * @param sql 执行的sql * @param value 参数 * @return */ public int update(String sql, Object value) { Class parameterType = value != null ? value.getClass() : null; String msId = mapperStatementBuilder.updateDynamic(sql, parameterType); return sqlSession.update(msId, value); } /** * 删除数据 * * @param sql 执行的sql * @return */ public int delete(String sql) { String msId = mapperStatementBuilder.delete(sql); return sqlSession.delete(msId); } /** * 删除数据 * * @param sql 执行的sql * @param value 参数 * @return */ public int delete(String sql, Object value) { Class parameterType = value != null ? value.getClass() : null; String msId = mapperStatementBuilder.deleteDynamic(sql, parameterType); return sqlSession.delete(msId, value); } }