MyBatis-Plus動態(tài)返回實(shí)體類示例詳解
更新時(shí)間:2022年07月27日 14:01:50 作者:code-x
這篇文章主要為大家介紹了MyBatis-Plus動態(tài)返回實(shí)體類示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
1. 自定義SqlSession
@Slf4j public class GenericSqlSession extends DefaultSqlSession { private static final ThreadLocal<Class<?>> CTX = new ThreadLocal<>(); private final Executor generalExecutor; public GenericSqlSession(Configuration configuration, Executor executor, boolean autoCommit) { super(configuration, executor, autoCommit); this.generalExecutor = executor; } @Override public <E> List<E> selectList(String statement, Object parameter, RowBounds rowBounds) { return doSelectList(statement, parameter, rowBounds); } protected <E> List<E> doSelectList(String statement, Object parameter, RowBounds rowBounds) { try { return generalExecutor.query(getCustomMappedStatement(statement), ParamNameResolver.wrapToMapIfCollection(parameter, null), rowBounds, Executor.NO_RESULT_HANDLER); } catch (Exception e) { throw ExceptionFactory.wrapException("Error querying database. Cause: " + e, e); } finally { ErrorContext.instance().reset(); } } protected MappedStatement getCustomMappedStatement(String statement) { var ms = getConfiguration().getMappedStatement(statement); var clazz = GenericSqlSession.get(); if (ObjectUtil.isEmpty(clazz)) { return ms; } else { var resultMaps = ms.getResultMaps(); var resultMap = resultMaps.get(0); var customMap = new ResultMap.Builder(getConfiguration(), resultMap.getId(), clazz, resultMap.getResultMappings(), resultMap.getAutoMapping()).build(); return new MappedStatement.Builder(getConfiguration(), ms.getId(), ms.getSqlSource(), ms.getSqlCommandType()) .resultMaps(Collections.singletonList(customMap)) .resource(ms.getResource()) .useCache(ms.isUseCache()) .build(); } } public static void set(Class<?> clazz) { CTX.set(clazz); } public static Class<?> get() { return CTX.get(); } public static void remove() { CTX.remove(); } }
2. 自定義SqlSessionFactory
public class GenericSqlSessionFactory extends DefaultSqlSessionFactory { public GenericSqlSessionFactory(Configuration configuration) { super(configuration); } @Override public SqlSession openSession(ExecutorType execType) { Transaction tx = null; try { final var environment = getConfiguration().getEnvironment(); final var transactionFactory = getTransactionFactoryFromEnvironment(environment); tx = transactionFactory.newTransaction(environment.getDataSource(), null, false); final var executor = getConfiguration().newExecutor(tx, execType); return new GenericSqlSession(getConfiguration(), executor, false); } catch (Exception e) { // may have fetched a connection so let's call close() closeTransaction(tx); throw ExceptionFactory.wrapException("Error opening session. Cause: " + e, e); } finally { ErrorContext.instance().reset(); } } private TransactionFactory getTransactionFactoryFromEnvironment(Environment environment) { if (environment == null || environment.getTransactionFactory() == null) { return new ManagedTransactionFactory(); } return environment.getTransactionFactory(); } private void closeTransaction(Transaction tx) { if (tx != null) { try { tx.close(); } catch (SQLException ignore) { // Intentionally ignore. Prefer previous error. } } } }
3. 自定義SqlSessionTemplate
@Component public class GenericSqlSessionTemplate extends SqlSessionTemplate { public GenericSqlSessionTemplate(SqlSessionFactory sqlSessionFactory) { super(new GenericSqlSessionFactory(sqlSessionFactory.getConfiguration())); } }
4. 自定義基礎(chǔ)Mapper
public interface SuperMapper<T> extends BaseMapper<T> { /** * selectById * * @param clazz 自定義結(jié)果集class * @param id id * @param <D> D * @return D */ @SuppressWarnings("unchecked") default <D> D selectById(Class<D> clazz, Serializable id) { try { GenericSqlSession.set(clazz); return (D) selectById(id); } finally { GenericSqlSession.remove(); } } }
5. 使用
繼承自定義的基礎(chǔ)Mapper
@Data @TableName("tag") public class TagPO implements Serializable { private static final long serialVersionUID = 1L; @TableId(type = IdType.AUTO) private Integer id; private String name; } public interface TagDAO extends SuperMapper<TagPO> { } @Component @Slf4j public class MybatisTest implements CommandLineRunner { @Autowired TagDAO tagDAO; @Override public void run(String... args) throws Exception { TagDTO id1 = tagDAO.selectById(TagDTO.class, 1); log.info("{}", id1); TagPO id2 = tagDAO.selectById(1); log.info("{}", id2); } }
以上就是MyBatis-Plus動態(tài)返回實(shí)體類示例詳解的詳細(xì)內(nèi)容,更多關(guān)于MyBatis-Plus返回實(shí)體類的資料請關(guān)注腳本之家其它相關(guān)文章!
您可能感興趣的文章:
- mybatis-plus如何使用sql的date_format()函數(shù)查詢數(shù)據(jù)
- MyBatis-Plus?實(shí)體類注解的實(shí)現(xiàn)示例
- Mybatis-Plus實(shí)體類繼承Model的使用小結(jié)
- Mybatis-plus如何提前獲取實(shí)體類用雪花算法生成的ID
- Mybatis-Plus實(shí)體類注解方法與mapper層和service層的CRUD方法
- mybatis-plus實(shí)體類中出現(xiàn)非數(shù)據(jù)庫映射字段解決辦法
- 詳解mybatis-plus實(shí)體類中字段和數(shù)據(jù)庫中字段名不對應(yīng)解決辦法
- MyBatis-Plus ORM數(shù)據(jù)庫和實(shí)體類映射方式
相關(guān)文章
探討Java 將Markdown文件轉(zhuǎn)換為Word和PDF文檔
這篇文章主要介紹了Java 將Markdown文件轉(zhuǎn)換為Word和PDF文檔,本文通過分步指南及代碼示例展示了如何將 Markdown 文件轉(zhuǎn)換為 Word 文檔和 PDF 文件,需要的朋友可以參考下2024-07-07SpringCloudAlibaba微服務(wù)調(diào)用組件OpenFeign的方法
Feign是Netflix開發(fā)的聲明式、模板化的HTTP客戶端,其靈感來自Retrofit、JAXRS-2.0以及WebSocket,Feign可幫助我們更加便捷、優(yōu)雅地調(diào)用HTTP API,這篇文章主要介紹了SpringCloudAlibaba微服務(wù)調(diào)用組件OpenFeign,需要的朋友可以參考下2024-07-07解決java.lang.IllegalArgumentException異常問題
這篇文章主要介紹了解決java.lang.IllegalArgumentException異常問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04Maven項(xiàng)目如何查找jar包是由哪個(gè)依賴引入的
這篇文章主要介紹了Maven項(xiàng)目如何查找jar包是由哪個(gè)依賴引入的問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08使用Maven將springboot工程打包成docker鏡像
這篇文章主要介紹了使用Maven將springboot工程打包成docker鏡像,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12