移除 solon-plugin 模块独立仓库开发

This commit is contained in:
hubin 2024-10-15 18:40:43 +08:00
parent b208444306
commit a757e5f966
29 changed files with 2 additions and 1419 deletions

View File

@ -1,5 +1,5 @@
- opt: 优化代码生成器支持可视化配置生能力
- opt: 解扩展包不再强制依赖 spring 开发框架
- opt: 优化代码生成器支持可视化配置生能力
- opt: 解扩展包不再强制依赖 spring 开发框架
- feat: 重构 service 模块抽象为 CrudRepository 不再建议使用 IService 避免业务层数据混乱
- feat: 新增 solon 启动插件支持

View File

@ -1,17 +0,0 @@
apply plugin: 'kotlin'
compileKotlin{
kotlinOptions.jvmTarget = "1.8"
}
dependencies {
api project(":mybatis-plus-extension")
api "org.noear:mybatis-solon-plugin:3.0.1"
api "org.noear:solon-aot:3.0.1"
testImplementation "org.noear:solon-test:3.0.1"
testImplementation "io.github.classgraph:classgraph:4.8.176"
testImplementation "com.zaxxer:HikariCP:4.0.3"
testImplementation "${lib.h2}"
testImplementation "${lib.mysql}"
testImplementation "${lib.'logback-classic'}"
}

View File

@ -1,33 +0,0 @@
package com.baomidou.mybatisplus.core.override;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import java.lang.reflect.Method;
public class SolonMybatisMapperProxy<T> extends MybatisMapperProxy<T> {
private final SqlSessionFactory factory;
private final Class<T> mapperInterface;
private final SqlSession sqlSession;
public SolonMybatisMapperProxy(SqlSessionFactory sqlSessionFactory, SqlSession sqlSession, Class<T> mapperInterface) {
super(null, mapperInterface, null);
this.factory = sqlSessionFactory;
this.sqlSession = sqlSession;
this.mapperInterface = mapperInterface;
}
@Override
public SqlSession getSqlSession() {
return sqlSession;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
try (SqlSession session = factory.openSession(true)) {
Object mapper = session.getMapper(mapperInterface);
return method.invoke(mapper, args);
}
}
}

View File

@ -1,39 +0,0 @@
/*
* Copyright (c) 2011-2024, baomidou (jobob@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.baomidou.mybatisplus.extension.activerecord;
import com.baomidou.mybatisplus.extension.toolkit.SqlRunner;
/**
* ActiveRecord 模式 CRUD
* <p>
* 必须存在对应的原始mapper并继承baseMapper并且可以使用的前提下
* 才能使用此 AR 模式 !!!
* </p>
*
* @param <T>
* @author hubin
* @since 2016-11-06
*/
public abstract class Model<T extends Model<?>> extends AbstractModel<T> {
/**
* 执行 SQL
*/
public SqlRunner sql() {
return new SqlRunner(this.entityClass);
}
}

View File

@ -1,80 +0,0 @@
/*
* Copyright (c) 2011-2024, baomidou (jobob@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.baomidou.mybatisplus.extension.compatible;
import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils;
import org.apache.ibatis.logging.Log;
import org.apache.ibatis.reflection.ExceptionUtil;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.noear.solon.core.util.GenericUtil;
import org.noear.solon.core.util.ResourceUtil;
import org.noear.solon.data.tran.TranUtils;
import java.io.InputStream;
import java.util.function.Consumer;
/**
* spring 兼容方法集接口实现类
*/
public class SolonCompatibleSet implements CompatibleSet {
@Override
public SqlSession getSqlSession(SqlSessionFactory sessionFactory) {
return sessionFactory.openSession();
}
@Override
public void closeSqlSession(SqlSession sqlSession, SqlSessionFactory sqlSessionFactory) {
if (sqlSession != null) {
sqlSession.close();
}
}
@Override
public boolean executeBatch(SqlSessionFactory sqlSessionFactory, Log log, Consumer<SqlSession> consumer) {
boolean transaction = TranUtils.inTrans();
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
if (!transaction) {
log.warn("SqlSession [" + sqlSession + "] Transaction not enabled");
}
try {
consumer.accept(sqlSession);
//非事务情况下强制commit
sqlSession.commit(!transaction);
return true;
} catch (RuntimeException t) {
throw t;
} catch (Throwable t) {
sqlSession.rollback();
Throwable unwrapped = ExceptionUtil.unwrapThrowable(t);
if (unwrapped instanceof RuntimeException) {
throw (RuntimeException) unwrapped;
} else {
throw ExceptionUtils.mpe(unwrapped);
}
} finally {
sqlSession.close();
}
}
@Override
public InputStream getInputStream(String path) throws Exception {
return ResourceUtil.findResource(path).openStream();
}
}

View File

@ -1,45 +0,0 @@
/*
* Copyright (c) 2011-2024, baomidou (jobob@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.baomidou.mybatisplus.extension.ddl;
import org.noear.solon.annotation.Inject;
import javax.sql.DataSource;
import java.util.List;
import java.util.function.Consumer;
/**
* 非多数据源 DDL 实现
*
* @author hubin
* @since 2021-09-23
*/
public class SimpleDdl implements IDdl {
@Inject
private DataSource dataSource;
@Override
public void runScript(Consumer<DataSource> consumer) {
consumer.accept(dataSource);
}
@Override
public List<String> getSqlFiles() {
return null;
}
}

View File

@ -1,103 +0,0 @@
/*
* Copyright (c) 2011-2024, baomidou (jobob@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.baomidou.mybatisplus.extension.repository;
import com.baomidou.mybatisplus.core.enums.SqlMethod;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
import com.baomidou.mybatisplus.core.toolkit.Assert;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
import org.apache.ibatis.binding.MapperMethod;
import org.noear.solon.annotation.Inject;
import org.noear.solon.data.annotation.Tran;
import java.util.Collection;
/**
* IService 实现类 泛型M mapper 对象T 是实体
*
* @author hubin
* @since 2018-06-23
*/
public abstract class CrudRepository<M extends BaseMapper<T>, T> extends AbstractRepository<M, T> {
@Inject
protected M baseMapper;
@Override
public M getBaseMapper() {
Assert.notNull(this.baseMapper, "baseMapper can not be null");
return this.baseMapper;
}
/**
* 批量插入
*
* @param entityList ignore
* @param batchSize ignore
* @return ignore
*/
@Tran
@Override
public boolean saveBatch(Collection<T> entityList, int batchSize) {
String sqlStatement = getSqlStatement(SqlMethod.INSERT_ONE);
return executeBatch(entityList, batchSize, (sqlSession, entity) -> sqlSession.insert(sqlStatement, entity));
}
/**
* 获取mapperStatementId
*
* @param sqlMethod 方法名
* @return 命名id
* @since 3.4.0
*/
protected String getSqlStatement(SqlMethod sqlMethod) {
return SqlHelper.getSqlStatement(this.getMapperClass(), sqlMethod);
}
@Tran
@Override
public boolean saveOrUpdateBatch(Collection<T> entityList, int batchSize) {
TableInfo tableInfo = TableInfoHelper.getTableInfo(this.getEntityClass());
Assert.notNull(tableInfo, "error: can not execute. because can not find cache of TableInfo for entity!");
String keyProperty = tableInfo.getKeyProperty();
Assert.notEmpty(keyProperty, "error: can not execute. because can not find column for id from entity!");
return SqlHelper.saveOrUpdateBatch(getSqlSessionFactory(), this.getMapperClass(), this.log, entityList, batchSize, (sqlSession, entity) -> {
Object idVal = tableInfo.getPropertyValue(entity, keyProperty);
return StringUtils.checkValNull(idVal)
|| CollectionUtils.isEmpty(sqlSession.selectList(getSqlStatement(SqlMethod.SELECT_BY_ID), entity));
}, (sqlSession, entity) -> {
MapperMethod.ParamMap<T> param = new MapperMethod.ParamMap<>();
param.put(Constants.ENTITY, entity);
sqlSession.update(getSqlStatement(SqlMethod.UPDATE_BY_ID), param);
});
}
@Tran
@Override
public boolean updateBatchById(Collection<T> entityList, int batchSize) {
String sqlStatement = getSqlStatement(SqlMethod.UPDATE_BY_ID);
return executeBatch(entityList, batchSize, (sqlSession, entity) -> {
MapperMethod.ParamMap<T> param = new MapperMethod.ParamMap<>();
param.put(Constants.ENTITY, entity);
sqlSession.update(sqlStatement, param);
});
}
}

View File

@ -1,72 +0,0 @@
/*
* Copyright (c) 2011-2024, baomidou (jobob@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.baomidou.mybatisplus.extension.service;
import com.baomidou.mybatisplus.extension.repository.IRepository;
import org.noear.solon.data.annotation.Tran;
import java.util.Collection;
/**
* 顶级 Service
*
* @author hubin
* @since 2018-06-23
*/
public interface IService<T> extends IRepository<T> {
/**
* 插入批量
*
* @param entityList 实体对象集合
*/
@Tran
default boolean saveBatch(Collection<T> entityList) {
return saveBatch(entityList, DEFAULT_BATCH_SIZE);
}
/**
* 批量修改插入
*
* @param entityList 实体对象集合
*/
@Tran
default boolean saveOrUpdateBatch(Collection<T> entityList) {
return saveOrUpdateBatch(entityList, DEFAULT_BATCH_SIZE);
}
/**
* 批量删除(jdbc批量提交)
*
* @param list 主键ID或实体列表(主键ID类型必须与实体类型字段保持一致)
* @return 删除结果
* @since 3.5.0
*/
@Tran
default boolean removeBatchByIds(Collection<?> list) {
return removeByIds(list);
}
/**
* 根据ID 批量更新
*
* @param entityList 实体对象集合
*/
@Tran
default boolean updateBatchById(Collection<T> entityList) {
return updateBatchById(entityList, DEFAULT_BATCH_SIZE);
}
}

View File

@ -1,30 +0,0 @@
/*
* Copyright (c) 2011-2024, baomidou (jobob@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.baomidou.mybatisplus.extension.service.impl;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.repository.CrudRepository;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* IService 实现类 泛型M mapper 对象T 是实体
*
* @author hubin
* @since 2018-06-23
*/
public class ServiceImpl<M extends BaseMapper<T>, T> extends CrudRepository<M, T> implements IService<T> {
}

View File

@ -1,22 +0,0 @@
/*
* Copyright (c) 2011-2024, baomidou (jobob@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* 通用 service 实现
*
* @author hubin
* @since 2018-06-08
*/
package com.baomidou.mybatisplus.extension.service.impl;

View File

@ -1,22 +0,0 @@
/*
* Copyright (c) 2011-2024, baomidou (jobob@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* 通用 Service 接口
*
* @author hubin
* @since 2018-06-08
*/
package com.baomidou.mybatisplus.extension.service;

View File

@ -1,244 +0,0 @@
/*
* Copyright (c) 2011-2024, baomidou (jobob@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.baomidou.mybatisplus.extension.toolkit;
import com.baomidou.mybatisplus.core.assist.ISqlRunner;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.GlobalConfigUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import org.apache.ibatis.logging.Log;
import org.apache.ibatis.logging.LogFactory;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.noear.solon.data.annotation.Tran;
import java.util.List;
import java.util.Map;
import java.util.Optional;
/**
* SqlRunner 执行 SQL
*
* @author Caratacus
* @since 2016-12-11
*/
public class SqlRunner implements ISqlRunner {
// 单例Query
public static final SqlRunner DEFAULT = new SqlRunner();
private final Log log = LogFactory.getLog(SqlRunner.class);
private Class<?> clazz;
public SqlRunner() {
}
public SqlRunner(Class<?> clazz) {
this.clazz = clazz;
}
/**
* 获取默认的SqlQuery(适用于单库)
*
* @return ignore
*/
public static SqlRunner db() {
return DEFAULT;
}
/**
* 根据当前class对象获取SqlQuery(适用于多库)
*
* @param clazz ignore
* @return ignore
*/
public static SqlRunner db(Class<?> clazz) {
return new SqlRunner(clazz);
}
@Tran
@Override
public boolean insert(String sql, Object... args) {
SqlSession sqlSession = sqlSession();
try {
return SqlHelper.retBool(sqlSession.insert(INSERT, sqlMap(sql, args)));
} finally {
closeSqlSession(sqlSession);
}
}
@Tran
@Override
public boolean delete(String sql, Object... args) {
SqlSession sqlSession = sqlSession();
try {
return SqlHelper.retBool(sqlSession.delete(DELETE, sqlMap(sql, args)));
} finally {
closeSqlSession(sqlSession);
}
}
/**
* 获取sqlMap参数
*
* @param sql 指定参数的格式: {0}, {1}
* @param args 仅支持String
* @return ignore
*/
private Map<String, String> sqlMap(String sql, Object... args) {
Map<String, String> sqlMap = CollectionUtils.newHashMapWithExpectedSize(1);
sqlMap.put(SQL, StringUtils.sqlArgsFill(sql, args));
return sqlMap;
}
/**
* 获取sqlMap参数
*
* @param sql 指定参数的格式: {0}, {1}
* @param page 分页模型
* @param args 仅支持String
* @return ignore
*/
private Map<String, Object> sqlMap(String sql, IPage<?> page, Object... args) {
Map<String, Object> sqlMap = CollectionUtils.newHashMapWithExpectedSize(2);
sqlMap.put(PAGE, page);
sqlMap.put(SQL, StringUtils.sqlArgsFill(sql, args));
return sqlMap;
}
@Tran
@Override
public boolean update(String sql, Object... args) {
SqlSession sqlSession = sqlSession();
try {
return SqlHelper.retBool(sqlSession.update(UPDATE, sqlMap(sql, args)));
} finally {
closeSqlSession(sqlSession);
}
}
/**
* 根据sql查询Map结果集
* <p>SqlRunner.db().selectList("select * from tbl_user where name={0}", "Caratacus")</p>
*
* @param sql sql语句可添加参数格式{0},{1}
* @param args 只接受String格式
* @return ignore
*/
@Override
public List<Map<String, Object>> selectList(String sql, Object... args) {
SqlSession sqlSession = sqlSession();
try {
return sqlSession.selectList(SELECT_LIST, sqlMap(sql, args));
} finally {
closeSqlSession(sqlSession);
}
}
/**
* 根据sql查询一个字段值的结果集
* <p>注意该方法只会返回一个字段的值 如果需要多字段请参考{@code selectList()}</p>
*
* @param sql sql语句可添加参数格式{0},{1}
* @param args 只接受String格式
* @return ignore
*/
@Override
public List<Object> selectObjs(String sql, Object... args) {
SqlSession sqlSession = sqlSession();
try {
return sqlSession.selectList(SELECT_OBJS, sqlMap(sql, args));
} finally {
closeSqlSession(sqlSession);
}
}
/**
* 根据sql查询一个字段值的一条结果
* <p>注意该方法只会返回一个字段的值 如果需要多字段请参考{@code selectOne()}</p>
*
* @param sql sql语句可添加参数格式{0},{1}
* @param args 只接受String格式
* @return ignore
*/
@Override
public Object selectObj(String sql, Object... args) {
return SqlHelper.getObject(log, selectObjs(sql, args));
}
@Override
public long selectCount(String sql, Object... args) {
SqlSession sqlSession = sqlSession();
try {
return SqlHelper.retCount(sqlSession.<Long>selectOne(COUNT, sqlMap(sql, args)));
} finally {
closeSqlSession(sqlSession);
}
}
@Override
public Map<String, Object> selectOne(String sql, Object... args) {
return SqlHelper.getObject(log, selectList(sql, args));
}
@Override
public <E extends IPage<Map<String, Object>>> E selectPage(E page, String sql, Object... args) {
if (null == page) {
return null;
}
SqlSession sqlSession = sqlSession();
try {
page.setRecords(sqlSession.selectList(SELECT_LIST, sqlMap(sql, page, args)));
} finally {
closeSqlSession(sqlSession);
}
return page;
}
/**
* 获取Session 默认自动提交
*/
private SqlSession sqlSession() {
return getSqlSessionFactory().openSession();
}
/**
* 释放sqlSession
*
* @param sqlSession session
*/
private void closeSqlSession(SqlSession sqlSession) {
if (sqlSession != null) {
sqlSession.close();
}
}
/**
* 获取SqlSessionFactory
*/
private SqlSessionFactory getSqlSessionFactory() {
return Optional.ofNullable(clazz).map(GlobalConfigUtils::currentSessionFactory).orElse(SqlHelper.FACTORY);
}
/**
* @deprecated 3.5.3.2
*/
@Deprecated
public void close() {
}
}

View File

@ -1,24 +0,0 @@
package com.baomidou.mybatisplus.solon.integration;
import org.apache.ibatis.solon.MybatisAdapter;
import org.apache.ibatis.solon.MybatisAdapterFactory;
import org.noear.solon.core.BeanWrap;
import org.noear.solon.core.Props;
/**
* 适配器工厂 for mybatis-plus
*
* @author noear, iYarnFog
* @since 1.5
*/
public class MybatisAdapterFactoryPlus implements MybatisAdapterFactory {
@Override
public MybatisAdapter create(BeanWrap dsWrap) {
return new MybatisAdapterPlus(dsWrap);
}
@Override
public MybatisAdapter create(BeanWrap dsWrap, Props dsProps) {
return new MybatisAdapterPlus(dsWrap, dsProps);
}
}

View File

@ -1,146 +0,0 @@
package com.baomidou.mybatisplus.solon.integration;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.core.MybatisSqlSessionFactoryBuilder;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.core.override.SolonMybatisMapperProxy;
import com.baomidou.mybatisplus.core.toolkit.GlobalConfigUtils;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.solon.integration.MybatisAdapterDefault;
import org.noear.solon.Utils;
import org.noear.solon.core.BeanWrap;
import org.noear.solon.core.Props;
import org.noear.solon.core.VarHolder;
import java.lang.reflect.Proxy;
import java.util.HashMap;
import java.util.Map;
/**
* 适配器 for mybatis-plus
* <p>
* 1.提供 mapperScan 能力
* 2.生成 factory 的能力
*
* @author noear, iYarnFog
* @since 1.5
*/
public class MybatisAdapterPlus extends MybatisAdapterDefault {
MybatisSqlSessionFactoryBuilder factoryBuilderPlus;
GlobalConfig globalConfig;
SqlSession sqlSession;
Map<Class<?>, Object> mapperCached = new HashMap<>();
/**
* 构建Sql工厂适配器使用默认的 typeAliases mappers 配置
*/
protected MybatisAdapterPlus(BeanWrap dsWrap) {
super(dsWrap);
this.factoryBuilderPlus = new MybatisSqlSessionFactoryBuilder();
dsWrap.context().getBeanAsync(MybatisSqlSessionFactoryBuilder.class, bean -> {
factoryBuilderPlus = bean;
});
}
/**
* 构建Sql工厂适配器使用属性配置
*/
protected MybatisAdapterPlus(BeanWrap dsWrap, Props dsProps) {
super(dsWrap, dsProps);
this.factoryBuilderPlus = new MybatisSqlSessionFactoryBuilder();
dsWrap.context().getBeanAsync(MybatisSqlSessionFactoryBuilder.class, bean -> {
factoryBuilderPlus = bean;
});
}
/**
* 初始化配置
*/
@Override
protected void initConfiguration(Environment environment) {
//for configuration section
config = new MybatisConfiguration(environment);
Props cfgProps = dsProps.getProp("configuration");
if (cfgProps.size() > 0) {
Utils.injectProperties(config, cfgProps);
}
//for globalConfig section
globalConfig = new GlobalConfig().setDbConfig(new GlobalConfig.DbConfig());
Props globalProps = dsProps.getProp("globalConfig");
if (globalProps.size() > 0) {
//尝试配置注入
Utils.injectProperties(globalConfig, globalProps);
}
GlobalConfigUtils.setGlobalConfig(config, globalConfig);
}
/**
* 获取会话工厂
*/
@Override
public SqlSessionFactory getFactory() {
if (factory == null) {
factory = factoryBuilderPlus.build(getConfiguration());
}
return factory;
}
public SqlSession getSession() {
if (sqlSession == null) {
sqlSession = new SolonSqlSession(getFactory());
}
return sqlSession;
}
@Override
public <T> T getMapper(Class<T> mapperClz) {
Object mapper = mapperCached.get(mapperClz);
if (mapper == null) {
synchronized (mapperClz) {
mapper = mapperCached.get(mapperClz);
if (mapper == null) {
SolonMybatisMapperProxy<T> tMybatisMapperProxy = new SolonMybatisMapperProxy<>(getFactory(), getSession(), mapperClz);
mapper = Proxy.newProxyInstance(
mapperClz.getClassLoader(),
new Class[]{mapperClz},
tMybatisMapperProxy);
mapperCached.put(mapperClz, mapper);
}
}
}
return (T) mapper;
}
/**
* 获取全局配置
*/
public GlobalConfig getGlobalConfig() {
return globalConfig;
}
@Override
public void injectTo(VarHolder varH) {
super.injectTo(varH);
//@Db("db1") SqlSessionFactory factory;
if (GlobalConfig.class.isAssignableFrom(varH.getType())) {
varH.setValue(this.getGlobalConfig());
return;
}
}
}

View File

@ -1,209 +0,0 @@
package com.baomidou.mybatisplus.solon.integration;
import org.apache.ibatis.cursor.Cursor;
import org.apache.ibatis.executor.BatchResult;
import org.apache.ibatis.reflection.ExceptionUtil;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.noear.solon.data.tran.TranUtils;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Connection;
import java.util.List;
import java.util.Map;
public class SolonSqlSession implements SqlSession {
private final SqlSessionFactory sqlSessionFactory;
private final SqlSession sqlSessionProxy;
public SolonSqlSession(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
this.sqlSessionProxy = (SqlSession) Proxy.newProxyInstance(SqlSessionFactory.class.getClassLoader(), new Class[]{SqlSession.class}, new SqlSessionInterceptor());
}
public SqlSessionFactory getSqlSessionFactory() {
return this.sqlSessionFactory;
}
public SqlSession getSqlSessionProxy() {
return this.sqlSessionProxy;
}
@Override
public <T> T selectOne(String statement) {
return this.sqlSessionProxy.selectOne(statement);
}
@Override
public <T> T selectOne(String statement, Object parameter) {
return this.sqlSessionProxy.selectOne(statement, parameter);
}
@Override
public <K, V> Map<K, V> selectMap(String statement, String mapKey) {
return this.sqlSessionProxy.selectMap(statement, mapKey);
}
@Override
public <K, V> Map<K, V> selectMap(String statement, Object parameter, String mapKey) {
return this.sqlSessionProxy.selectMap(statement, parameter, mapKey);
}
@Override
public <K, V> Map<K, V> selectMap(String statement, Object parameter, String mapKey, RowBounds rowBounds) {
return this.sqlSessionProxy.selectMap(statement, parameter, mapKey, rowBounds);
}
@Override
public <T> Cursor<T> selectCursor(String statement) {
return this.sqlSessionProxy.selectCursor(statement);
}
@Override
public <T> Cursor<T> selectCursor(String statement, Object parameter) {
return this.sqlSessionProxy.selectCursor(statement, parameter);
}
@Override
public <T> Cursor<T> selectCursor(String statement, Object parameter, RowBounds rowBounds) {
return this.sqlSessionProxy.selectCursor(statement, parameter, rowBounds);
}
@Override
public <E> List<E> selectList(String statement) {
return this.sqlSessionProxy.selectList(statement);
}
@Override
public <E> List<E> selectList(String statement, Object parameter) {
return this.sqlSessionProxy.selectList(statement, parameter);
}
@Override
public <E> List<E> selectList(String statement, Object parameter, RowBounds rowBounds) {
return this.sqlSessionProxy.selectList(statement, parameter, rowBounds);
}
@Override
public void select(String statement, ResultHandler handler) {
this.sqlSessionProxy.select(statement, handler);
}
@Override
public void select(String statement, Object parameter, ResultHandler handler) {
this.sqlSessionProxy.select(statement, parameter, handler);
}
@Override
public void select(String statement, Object parameter, RowBounds rowBounds, ResultHandler handler) {
this.sqlSessionProxy.select(statement, parameter, rowBounds, handler);
}
@Override
public int insert(String statement) {
return this.sqlSessionProxy.insert(statement);
}
@Override
public int insert(String statement, Object parameter) {
return this.sqlSessionProxy.insert(statement, parameter);
}
@Override
public int update(String statement) {
return this.sqlSessionProxy.update(statement);
}
@Override
public int update(String statement, Object parameter) {
return this.sqlSessionProxy.update(statement, parameter);
}
@Override
public int delete(String statement) {
return this.sqlSessionProxy.delete(statement);
}
@Override
public int delete(String statement, Object parameter) {
return this.sqlSessionProxy.delete(statement, parameter);
}
@Override
public <T> T getMapper(Class<T> type) {
return this.getConfiguration().getMapper(type, this);
}
@Override
public void commit() {
throw new UnsupportedOperationException("Manual commit is not allowed over a Solon managed SqlSession");
}
@Override
public void commit(boolean force) {
throw new UnsupportedOperationException("Manual commit is not allowed over a Solon managed SqlSession");
}
@Override
public void rollback() {
throw new UnsupportedOperationException("Manual rollback is not allowed over a Solon managed SqlSession");
}
@Override
public void rollback(boolean force) {
throw new UnsupportedOperationException("Manual rollback is not allowed over a Solon managed SqlSession");
}
@Override
public void close() {
throw new UnsupportedOperationException("Manual close is not allowed over a Solon managed SqlSession");
}
@Override
public void clearCache() {
this.sqlSessionProxy.clearCache();
}
@Override
public Configuration getConfiguration() {
return this.sqlSessionFactory.getConfiguration();
}
@Override
public Connection getConnection() {
return this.sqlSessionProxy.getConnection();
}
@Override
public List<BatchResult> flushStatements() {
return this.sqlSessionProxy.flushStatements();
}
private class SqlSessionInterceptor implements InvocationHandler {
private SqlSessionInterceptor() {
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object unwrapped;
try (SqlSession sqlSession = sqlSessionFactory.openSession(true)) {
Object result = method.invoke(sqlSession, args);
sqlSession.commit(!TranUtils.inTrans());
unwrapped = result;
} catch (Throwable var11) {
unwrapped = ExceptionUtil.unwrapThrowable(var11);
if (unwrapped instanceof RuntimeException) {
throw (RuntimeException) unwrapped;
}
throw (Throwable) unwrapped;
}
return unwrapped;
}
}
}

View File

@ -1,39 +0,0 @@
package com.baomidou.mybatisplus.solon.integration;
import com.baomidou.mybatisplus.core.toolkit.reflect.GenericTypeUtils;
import com.baomidou.mybatisplus.extension.compatible.CompatibleHelper;
import com.baomidou.mybatisplus.extension.compatible.SolonCompatibleSet;
import com.baomidou.mybatisplus.solon.integration.aot.MybatisPlusRuntimeNativeRegistrar;
import org.noear.solon.aot.RuntimeNativeRegistrar;
import org.noear.solon.core.AppContext;
import org.noear.solon.core.runtime.NativeDetector;
import org.noear.solon.core.util.ClassUtil;
import org.noear.solon.core.util.GenericUtil;
import org.apache.ibatis.solon.integration.MybatisAdapterManager;
import org.noear.solon.core.Plugin;
/**
* @author noear
* @since 1.5
*/
public class XPluginImpl implements Plugin {
@Override
public void start(AppContext context) {
//
// 此插件的 solon.plugin.priority 会大于 mybatis-solon-plugin 的值
//
MybatisAdapterManager.setAdapterFactory(new MybatisAdapterFactoryPlus());
// 注入兼容配置
CompatibleHelper.setCompatibleSet(new SolonCompatibleSet());
// 提供反射处理类
GenericTypeUtils.setGenericTypeResolver((GenericUtil::resolveTypeArguments));
// aot
if (NativeDetector.isAotRuntime() && ClassUtil.hasClass(() -> RuntimeNativeRegistrar.class)) {
context.wrapAndPut(MybatisPlusRuntimeNativeRegistrar.class);
}
}
}

View File

@ -1,68 +0,0 @@
package com.baomidou.mybatisplus.solon.integration.aot;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.core.MybatisXMLLanguageDriver;
import com.baomidou.mybatisplus.core.conditions.AbstractLambdaWrapper;
import com.baomidou.mybatisplus.core.conditions.AbstractWrapper;
import com.baomidou.mybatisplus.core.conditions.ISqlSegment;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.interfaces.Compare;
import com.baomidou.mybatisplus.core.conditions.interfaces.Func;
import com.baomidou.mybatisplus.core.conditions.interfaces.Join;
import com.baomidou.mybatisplus.core.conditions.interfaces.Nested;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.Query;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import org.noear.solon.aot.RuntimeNativeMetadata;
import org.noear.solon.aot.RuntimeNativeRegistrar;
import org.noear.solon.aot.hint.ExecutableMode;
import org.noear.solon.aot.hint.MemberCategory;
import org.noear.solon.core.AppContext;
import java.lang.invoke.SerializedLambda;
/**
* mybatis-plus aot 注册 native 元数据
*
* @author songyinyin
* @since 2.3
*/
public class MybatisPlusRuntimeNativeRegistrar implements RuntimeNativeRegistrar {
@Override
public void register(AppContext context, RuntimeNativeMetadata metadata) {
metadata.registerDefaultConstructor(MybatisXMLLanguageDriver.class);
metadata.registerReflection(MybatisConfiguration.class, MemberCategory.DECLARED_FIELDS, MemberCategory.INTROSPECT_PUBLIC_CONSTRUCTORS);
metadata.registerAllDeclaredMethod(MybatisConfiguration.class, ExecutableMode.INVOKE);
metadata.registerReflection(AbstractLambdaWrapper.class, MemberCategory.DECLARED_FIELDS, MemberCategory.INTROSPECT_PUBLIC_CONSTRUCTORS);
metadata.registerJdkProxy(AbstractWrapper.DoSomething.class);
metadata.registerReflection(AbstractWrapper.DoSomething.class);
metadata.registerReflection(AbstractWrapper.class, MemberCategory.DECLARED_FIELDS, MemberCategory.INTROSPECT_PUBLIC_CONSTRUCTORS);
metadata.registerAllDeclaredMethod(AbstractWrapper.class, ExecutableMode.INVOKE);
metadata.registerReflection(ISqlSegment.class, MemberCategory.DECLARED_FIELDS, MemberCategory.INTROSPECT_PUBLIC_CONSTRUCTORS);
metadata.registerReflection(Wrapper.class, MemberCategory.DECLARED_FIELDS, MemberCategory.INTROSPECT_PUBLIC_CONSTRUCTORS);
metadata.registerAllDeclaredMethod(Wrapper.class, ExecutableMode.INVOKE);
metadata.registerReflection(Compare.class, MemberCategory.DECLARED_FIELDS, MemberCategory.INTROSPECT_PUBLIC_CONSTRUCTORS);
metadata.registerReflection(Func.class, MemberCategory.DECLARED_FIELDS, MemberCategory.INTROSPECT_PUBLIC_CONSTRUCTORS);
metadata.registerReflection(Join.class, MemberCategory.DECLARED_FIELDS, MemberCategory.INTROSPECT_PUBLIC_CONSTRUCTORS);
metadata.registerReflection(Nested.class, MemberCategory.DECLARED_FIELDS, MemberCategory.INTROSPECT_PUBLIC_CONSTRUCTORS);
metadata.registerReflection(LambdaQueryWrapper.class, MemberCategory.DECLARED_FIELDS, MemberCategory.INTROSPECT_PUBLIC_METHODS,
MemberCategory.INTROSPECT_PUBLIC_METHODS, MemberCategory.INTROSPECT_DECLARED_CONSTRUCTORS);
metadata.registerAllDeclaredMethod(LambdaQueryWrapper.class, ExecutableMode.INVOKE);
metadata.registerReflection(Query.class, MemberCategory.DECLARED_FIELDS, MemberCategory.INTROSPECT_PUBLIC_CONSTRUCTORS);
metadata.registerAllDeclaredMethod(BaseMapper.class, ExecutableMode.INVOKE);
metadata.registerSerialization(SerializedLambda.class);
metadata.registerSerialization(SFunction.class);
}
}

View File

@ -1,2 +0,0 @@
solon.plugin=com.baomidou.mybatisplus.solon.integration.XPluginImpl
solon.plugin.priority=30

View File

@ -1,34 +0,0 @@
package demo;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.core.MybatisSqlSessionFactoryBuilder;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import demo.dso.MetaObjectHandlerImpl;
import demo.dso.MybatisSqlSessionFactoryBuilderImpl;
import org.apache.ibatis.solon.annotation.Db;
import org.noear.solon.Solon;
import org.noear.solon.annotation.Bean;
import org.noear.solon.annotation.Configuration;
import org.noear.solon.annotation.Inject;
import javax.sql.DataSource;
@Configuration
public class Config {
@Bean
public void db1_cfg(@Db("db1") MybatisConfiguration cfg,
@Db("db1") GlobalConfig globalConfig) {
//增加 mybatis-plus 的自带分页插件
MybatisPlusInterceptor plusInterceptor = new MybatisPlusInterceptor();
plusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
cfg.addInterceptor(plusInterceptor);
}
// @Bean
// public MybatisSqlSessionFactoryBuilder factoryBuilderNew(){
// return new MybatisSqlSessionFactoryBuilderImpl();
// }
}

View File

@ -1,22 +0,0 @@
package demo;
import com.baomidou.mybatisplus.core.toolkit.Assert;
import demo.dso.service.UserService;
import demo.model.User;
import org.noear.solon.Solon;
import java.util.List;
/**
* @author noear 2021/7/12 created
*/
public class DemoApp {
public static void main(String[] args) {
Solon.start(DemoApp.class, args);
//test
UserService userService = Solon.context().getBean(UserService.class);
Assert.notNull(userService.getUserList(), "查询结果异常");
}
}

View File

@ -1,21 +0,0 @@
package demo.controller;
import demo.dso.service.UserService;
import demo.model.User;
import org.noear.solon.annotation.Controller;
import org.noear.solon.annotation.Inject;
import org.noear.solon.annotation.Mapping;
import java.util.List;
@Controller
public class IndexController {
@Inject
UserService userService;
@Mapping("/")
public List<User> index() {
return userService.getUserList();
}
}

View File

@ -1,19 +0,0 @@
package demo.dso;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
/**
* @author noear 2022/4/17 created
*/
public class MetaObjectHandlerImpl implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
}
@Override
public void updateFill(MetaObject metaObject) {
}
}

View File

@ -1,9 +0,0 @@
package demo.dso;
import com.baomidou.mybatisplus.core.MybatisSqlSessionFactoryBuilder;
/**
* @author noear 2021/10/20 created
*/
public class MybatisSqlSessionFactoryBuilderImpl extends MybatisSqlSessionFactoryBuilder {
}

View File

@ -1,10 +0,0 @@
package demo.dso.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import demo.model.User;
/**
* @author
*/
public interface UserMapper extends BaseMapper<User> {
}

View File

@ -1,24 +0,0 @@
package demo.dso.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import demo.dso.mapper.UserMapper;
import demo.model.User;
import org.noear.solon.annotation.Component;
import org.noear.solon.annotation.Inject;
import java.util.List;
/**
* @author noear 2021/9/9 created
*/
@Component
public class UserService {
@Inject
UserMapper userMapper;
public List<User> getUserList() {
assert userMapper != null;
return userMapper.selectList(new QueryWrapper<>());
}
}

View File

@ -1,31 +0,0 @@
package demo.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
/**
* @author iYarnFog
*/
@TableName(value = "users")
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String uuid;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUuid() {
return uuid;
}
public void setUuid(String uuid) {
this.uuid = uuid;
}
}

View File

@ -1,27 +0,0 @@
package features;
import com.baomidou.mybatisplus.core.mapper.Mapper;
import demo.dso.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.noear.solon.core.util.GenericUtil;
import java.util.Arrays;
import java.util.Map;
public class IGenericTypeResolverImplTest {
@Test
public void resolveTypeArguments() {
System.out.println(Arrays.toString(GenericUtil.resolveTypeArguments(DemoImpl.class, Map.class)));
System.out.println(Arrays.toString(GenericUtil.resolveTypeArguments(DemoImpl.class, Demo.class)));
System.out.println(Arrays.toString(GenericUtil.resolveTypeArguments(UserMapper.class, Mapper.class)));
}
private interface Demo<T> {}
private abstract static class DemoImpl implements Map<Integer, String>, IGenericTypeResolverImplTest.Demo<Double> {
}
}

View File

@ -1,24 +0,0 @@
server:
port: 6040
# 配置数据源
solon.dataSources:
db1!:
class: "com.zaxxer.hikari.HikariDataSource"
jdbcUrl: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=true
driverClassName: com.mysql.cj.jdbc.Driver
username: root
password: 1234
mybatis:
db1:
mappers:
- "demo.dso.mapper.*"
configuration:
cacheEnabled: false
mapUnderscoreToCamelCase: true
globalConfig:
banner: false
metaObjectHandler: "demo.dso.MetaObjectHandlerImpl"
dbConfig:
logicDeleteField: "deleted"

View File

@ -22,7 +22,6 @@ include 'mybatis-plus-extension'
include 'mybatis-plus-generator'
include 'mybatis-plus-bom'
include 'mybatis-plus-spring'
include 'mybatis-plus-solon-plugin'
include 'spring-boot-starter'
include ':spring-boot-starter:mybatis-plus-boot-starter'
include ':spring-boot-starter:mybatis-plus-boot-starter-test'