List泛型封装实现两个不同实体类属性list之间的复制,同时实现了对mybatis plus IPage对象的复制

本文介绍了一个针对MybatisPlus的工具类,提供list与IPage对象之间的复制功能,并支持对象属性的自动映射。核心方法包括copyList和copyIPage,以及字符串列表与集合的处理方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package org.monitor.util;

import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.BeansException;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/**
 * 对两个list做copy工作
 * 对MybatisPlus里面的元素封装
 **/
public class ListUtil<S,T> {

    public static <S,T> void copyList(Collection<S> sCollection,Collection<T> tCollection,Class<T> tClass) {
        if(sCollection==null||tCollection==null||sCollection.size()==0){
            return;
        }
        try {
            for(S s:sCollection){
                T t = tClass.newInstance();
                BeanUtils.copyProperties(s,t);
                tCollection.add(t);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static <S,T> void copyIPage(IPage<S> siPage,IPage<T> tiPage,Class<T> tClass){
        if(siPage==null||tiPage==null){
            return;
        }
        tiPage.setCurrent(siPage.getCurrent());
        tiPage.setPages(siPage.getPages());
        tiPage.setSize(siPage.getSize());
        tiPage.setTotal(siPage.getTotal());
        List<S> sList= siPage.getRecords();
        List<T> tList=new ArrayList<>();
        copyList(sList,tList,tClass);
        tiPage.setRecords(tList);
    }

/**
 * 将list以某个符号分隔成字符串
 * @param list 字符串列表
 * @param symbol 符号
 * @return
 */
public static String getStringByList(List<String> list,String symbol){
    if(Func.isEmpty(list)){
        return "";
    }
    StringBuilder stringBuilder=new StringBuilder();
    for(int i=0;i<list.size();i++){
        if(i!=list.size()-1){
            stringBuilder.append(list.get(i)).append(symbol);
        }else{
            stringBuilder.append(list.get(i));
        }
    }
    return stringBuilder.toString();
}

/**
 * 将set以某个符号分隔成字符串
 * @param set set
 * @param symbol 符号
 * @return
 */
public static String getStringBySet(Set<String> set, String symbol){
    List<String> stringList=new ArrayList<>(set);
    return getStringByList(stringList,symbol);
}

public static List<String> getListByString(String s){
    List<String> list=new ArrayList<>();
    if(Func.isEmpty(s)){
        return list;
    }
    String[] array=s.split(",");
    list=Arrays.asList(array);
    return list;
}

public static List<String> getListByString(String s,String symbol){
    List<String> list=new ArrayList<>();
    if(Func.isEmpty(s)){
        return list;
    }
    String[] array=s.split(symbol);
    list=Arrays.asList(array);
    return list;
}

public static <S,T> void copyList(Collection<S> sCollection, Collection<T> tCollection, Class<T> tClass) {
    if(sCollection==null||tCollection==null||sCollection.size()==0){
        return;
    }
    try {
        for(S s:sCollection){
            T t = tClass.newInstance();
            BeanUtils.copyProperties(s,t);
            tCollection.add(t);
        }
    } catch (Exception e) {
        log.error("列表转换失败",e);
    }
}

public static <S,T> List<T> copyList(Collection<S> sCollection,Class<T> tClass) {
    List<T> list=new ArrayList<>();
    if(sCollection==null||sCollection.size()==0){
        return list;
    }
    try {
        for(S s:sCollection){
            T t = tClass.newInstance();
            BeanUtils.copyProperties(s,t);
            list.add(t);
        }
    } catch (Exception e) {
        log.error("列表转换失败",e);
    }
    return list;
}


}

<think>我们正在讨论的是MyBatis-Plus如何为Mapper添加默认的selectList方法。根据引用[1]和引用[3],我们知道MyBatis-Plus的BaseMapper接口已经提供了默认的selectList方法,但是如何正确地配置使得Mapper能够使用这些默认方法呢? 关键点: 1. 在MyBatis-Plus中,BaseMapper接口已经定义了selectList方法(以及其他的CRUD方法),我们只需要让自己的Mapper接口继承BaseMapper即可。 2. 但是,仅仅继承BaseMapper是不够的,我们还需要在构建SqlSessionFactory时使用MyBatis-Plus提供的MybatisSqlSessionFactoryBean,而不是MyBatis原生的SqlSessionFactoryBuilder。这是因为MyBatis-Plus需要注入自己的逻辑来支持BaseMapper中的默认方法。 步骤: 1. 定义Mapper接口,继承BaseMapper,并指定实体类)。 2. 配置SqlSessionFactory时,使用MybatisSqlSessionFactoryBean,并设置数据源和配置(包括添加Mapper接口或扫描Mapper包)。 3. 在Spring Boot中,通常通过配置类来完成,或者使用自动配置(但需要确保正确引入了MyBatis-Plus的starter)。 根据引用[1]中的示例,我们可以这样配置: ```java // 创建MybatisSqlSessionFactoryBean,而不是使用SqlSessionFactoryBuilder MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dataSource); // 设置数据源 // 创建Mybatis-Plus的配置对象(注意:这里是MybatisConfiguration,不是MyBatis原生的Configuration) MybatisConfiguration configuration = new MybatisConfiguration(); // 设置其他配置,如是否开启驼峰命名等 configuration.setMapUnderscoreToCamelCase(true); // 将Mapper接口添加到配置中(或者使用setMapperLocations设置XML文件) configuration.addMapper(UserMapper.class); sqlSessionFactoryBean.setConfiguration(configuration); // 获取SqlSessionFactory SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBean.getObject(); ``` 这样配置后,UserMapper就拥有了BaseMapper中定义的selectList方法。 另外,在Spring Boot中,我们通常使用自动配置,但是如果要自定义,可以这样写配置类: ```java @Configuration public class MybatisPlusConfig { @Bean public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception { MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean(); factoryBean.setDataSource(dataSource); // 设置Mybatis-Plus的全局配置 MybatisConfiguration configuration = new MybatisConfiguration(); configuration.setMapUnderscoreToCamelCase(true); factoryBean.setConfiguration(configuration); // 如果不想一个个添加Mapper,可以设置Mapper扫描路径 factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml")); // 或者使用setTypeAliasesPackage设置实体类所在的包 factoryBean.setTypeAliasesPackage("com.example.entity"); return factoryBean.getObject(); } // 配置分页插件等(根据引用[3]) @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } } ``` 注意:在Spring Boot中,如果我们引入了mybatis-plus-boot-starter,它会自动配置SqlSessionFactory,并且会自动扫描Mapper接口(通常是在主启动类同包或子包下的接口)。所以,如果我们遵循约定,可能不需要手动配置Mapper扫描。 但是,如果出现无法调用selectList等默认方法的情况,很可能是没有正确配置SqlSessionFactory,应该检查是否使用了MybatisSqlSessionFactoryBean。 总结: 1. 让Mapper接口继承BaseMapper<T>。 2. 确保SqlSessionFactory是通过MybatisSqlSessionFactoryBean创建的,而不是原生的SqlSessionFactoryBuilder。 3. 在非Spring Boot项目中,需要手动配置;在Spring Boot项目中,引入starter并确保Mapper接口被扫描到即可。 相关问题: 1. MyBatis-Plus的BaseMapper提供了哪些默认方法? 2. 如何在MyBatis-Plus中配置分页插件? 3. 如何解决MyBatis-Plus中BaseMapper的默认方法无法调用的问题?</think>### 如何在 MyBatis-Plus 中添加默认的 `selectList` 方法到 Mapper MyBatis-Plus 的 `BaseMapper` 接口已内置了 `selectList()` 方法作为默认实现,无需手动添加。以下是正确使用该方法的完整步骤: --- #### 步骤 1:定义 Mapper 接口继承 `BaseMapper` ```java import com.baomidou.mybatisplus.core.mapper.BaseMapper; public interface UserMapper extends BaseMapper<User> { // 无需手动声明 selectList() // BaseMapper 已提供默认实现 } ``` #### 步骤 2:配置 MyBatis-Plus 的 `SqlSessionFactory`(关键) 必须使用 **MybatisSqlSessionFactoryBean** 而非 MyBatis 原生的 `SqlSessionFactoryBuilder`(引用[1]): ```java @Configuration public class MybatisPlusConfig { @Bean public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception { MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean(); factoryBean.setDataSource(dataSource); // 配置分页插件(引用[3]) factoryBean.setPlugins(mybatisPlusInterceptor()); // 设置实体类包路径(自动类映射) factoryBean.setTypeAliasesPackage("com.example.entity"); return factoryBean.getObject(); // ✅ 关键:使用 MyBatis-Plus 的工厂 } @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } } ``` #### 步骤 3:直接调用 `selectList()` ```java @Service public class UserService { @Autowired private UserMapper userMapper; public List<User> getAllUsers() { // 直接调用 BaseMapper 提供的默认方法 return userMapper.selectList(null); // null 表示无条件查询 } public List<User> getActiveUsers() { // 带条件查询(使用 QueryWrapper) QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq("status", 1); // status=1 的用户 return userMapper.selectList(wrapper); } } ``` --- ### 核心原理说明 1. **自动方法注入** `BaseMapper` 接口已包含 17 个默认 CRUD 方法(引用[2]),其中: ```java List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); ``` 由 MyBatis-Plus 动态实现,无需手动编写 SQL。 2. **配置要求** 使用原生 `SqlSessionFactoryBuilder.build()` 会导致默认方法失效(引用[1]),必须通过 `MybatisSqlSessionFactoryBean` 初始化。 3. **条件构造器** 通过 `QueryWrapper` 构建复杂查询: ```java QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.between("age", 18, 30) .like("name", "张") .orderByDesc("create_time"); List<User> users = userMapper.selectList(wrapper); ``` --- ### 常见问题排查 | 问题现象 | 解决方案 | |---------|---------| | 调用 `selectList()` 报错 `Invalid bound statement` | 检查是否使用了 `MybatisSqlSessionFactoryBean` 而非原生构建器 | | 分页查询失效 | 确认已添加 `PaginationInnerInterceptor`(引用[3]) | | 条件构造器不生效 | 检查字段名是否与数据库列名一致(注意驼峰转换) | --- ### 扩展应用 #### 分页查询(引用[3]) ```java Page<User> page = new Page<>(1, 10); // 第1页,每页10条 QueryWrapper<User> wrapper = new QueryWrapper<User>().eq("dept_id", 101); IPage<User> userPage = userMapper.selectPage(page, wrapper); List<User> records = userPage.getRecords(); // 当前页数据 long total = userPage.getTotal(); // 总记录数 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值