MyBatis-Plus動(dòng)態(tài)返回實(shí)體類示例詳解
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動(dòng)態(tài)返回實(shí)體類示例詳解的詳細(xì)內(nèi)容,更多關(guān)于MyBatis-Plus返回實(shí)體類的資料請(qǐng)關(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ù)庫中字段名不對(duì)應(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-07
SpringCloudAlibaba微服務(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
簡(jiǎn)述Springboot @Async 異步方法
這篇文章主要介紹了Springboot @Async 異步方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-05-05
解決java.lang.IllegalArgumentException異常問題
這篇文章主要介紹了解決java.lang.IllegalArgumentException異常問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04
Maven項(xiàng)目如何查找jar包是由哪個(gè)依賴引入的
這篇文章主要介紹了Maven項(xiàng)目如何查找jar包是由哪個(gè)依賴引入的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
使用Maven將springboot工程打包成docker鏡像
這篇文章主要介紹了使用Maven將springboot工程打包成docker鏡像,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12

