mybatis--注解-分页-批量-batch

批量update

msglink
批量更新link
批量更新link
jdbc:mysql://mysql004.beta.sdbattery.net:3306/sd_retail_goods?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=falselink
link
link
link
link
link
link
link
link
link

@Mapper

添加了@Mapper注解之后这个接口在编译时会生成相应的实现类

@Param

于多个参数来说,每个参数之前都要加上@Param注解

//UserDAO
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import entity.User;

/**
 * 添加了@Mapper注解之后这个接口在编译时会生成相应的实现类
 * 
 * 需要注意的是:这个接口中不可以定义同名的方法,因为会生成相同的id
 * 也就是说这个接口是不支持重载的
 */
@Mapper
public interface UserDAO {

    @Select("select * from user where name = #{name}")
    public User find(String name);

    @Select("select * from user where name = #{name} and pwd = #{pwd}")
    /**
      * 对于多个参数来说,每个参数之前都要加上@Param注解,
      * 要不然会找不到对应的参数进而报错
      */
    public User login(@Param("name")String name, @Param("pwd")String pwd);
}

@Insert

eg1----default

@Insert("insert into tbemployee values(default,#{empName},#{empSex},#{empBirth},#{empSalary},2)")
public void insertEmp(TbEmployee  emp);   

eg2---- 使用 insert可以使用Map作为参数

@Insert("insert into h5_source.cheyipaiBack ( orderId,appKey,callNextUrl)values ( #{orderId},#{appKey},#{callNextUrl})")
Integer addChaCallBack(Map map);

eg3----如何使用注解进行批量插入?

 @Insert("<script>"  +
		 "INSERT INTO user(id,username,sex,frequency,money,chepai,phone,beizhu) "
	 		+ "VALUES <foreach collection=\"list\" item=\"usermap\" index=\"index\" separator=\",\">" + 
	 		"(#{usermap.id},#{usermap.username},#{usermap.sex},#{usermap.frequency},#{usermap.money},#{usermap.chepai},#{usermap.phone},#{usermap.beizhu})" + 
	 		" </foreach>"
	 		+ "</script>")
	 int add(@Param("list") List<Map<String, Object>> list);

使用id来update,没有id,那就插入;
新建表的时候,必须带上:

ALTER  TABLE tb_test add  lastModityTime TIMESTAMP  
null DEFAULT CURRENT_TIMESTAMP on UPDATE CURRENT_TIMESTAMP comment'最后修改时间';
timeCreate  TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',

@Select

eg1----用as

    @Select({
            "SELECT **DISTINCT** c.app_key as appKey,c.create_time as createTime from manager.company_apps as c  RIGHT JOIN (SELECT distinct b.app_id  FROM manager.product as a RIGHT  JOIN manager.app_product_contract as b on b.product_id=a.id WHERE a.api_id=**#{apiId}**) as f on c.id=f.app_id where c.status_flag=1"
            })
    List<App> queryPowerAppKey(**@Param("apiId") Integer apiId**);
优点:
.app_key as **appKey** ,直接用as 查询出来 ,映射到实体的appKey,不用xml,即便需要的字段有点多,也可以这样做;如果可以使用Map接受,那就更加牛逼了

eg2----多行用 +

  @Select({
      "select * from ( SELECT a.id,a.vehicleId,a.lng,a.lat,a.angle,b.vehicle_number as vehicleNumber,a.speed,b.company_id as companyId,b.dev_no as devNo,a.address,FROM_UNIXTIME(a.gpsTime,'%Y-%m-%d %H:%i:%S') as gpsTime FROM basealarm.tb_gps_record a " +
              " LEFT JOIN basealarm.tb_vehicle_snap b ON a.snap_id = b.id " +
              " where  a.gpsTime  BETWEEN #{minTime} and #{maxTime} limit #{account} ) as k where 1=1 order by null limit #{pageStart},#{pageEnd}"
    })
    List<VehicleGpsResDTO> queryGpsRecordPageByHandle(@Param("minTime") Long minTime , @Param("maxTime") Long maxTime ,
                                         @Param("pageStart") Integer pageStart , @Param("pageEnd") Integer pageEnd ,@Param("account") int account);

eg3----map接收

其实使用id查询出单条消息的时候,完全可以使用map接收
eg:

  @Select("select * from h5_source.cheyipaiBack where orderId=#{orderId}")
Map queryBack(@Param("orderId") String orderId);

eg4----如果查询是多条,可用List 接收

@Select("select * from h5_source.cheyipaiBack where orderId=#{orderId}")
List<Map> queryBackx(@Param("orderId") String orderId);

使用@Select动态模糊查询

@Select({"<script>",
            "select * from h5_source.cheyipaiBack where 1=1",
            "<if test='appKey!=null'>",
            "and appKey like '${appKey}%'",
            "</if>",
            "<if test='originalOrderId!=null'>",
            "and originalOrderId like ‘${originalOrderId}%’ ",
            "</if>",
            "</script>"
})
必须加 <script>    .....      </script>
内部用逗号作为拼接符号;like使用$,不能使用#
List<Map> queryBackx(Map map);// 参数和最后接受都用Map

xml配置

<select id="selectConfuse" resultMap="BaseResultMap" parameterType="java.util.Map" >
    select *
    from gateway_system.api_info_public_module as a
    where a.isDelete=0
    <if test="name != null and name !=’’ " >
      and a.name like #{name,jdbcType=VARCHAR}
    </if>
    <if test="type != null" >
      and a.type like #{type,jdbcType=VARCHAR}
    </if>
    order by a.createTime DESC
  </select>

使用update也可以使用Map作为参数

@Update("update h5_source.cheyipaiBack 
set originalOrderId=#{originalOrderId},brandName=#{brandName},result=#{result} 
where orderId=#{orderId}")
Integer update(Map map);

需要分页查询,用pagehelper

one 使用micro的democontroller
//获取参数

        String name = StringUtils.trimToEmpty(query.getName());
        String type = StringUtils.trimToEmpty(query.getType());
        //使用xml格式进行数据的查询
        Map param = new HashMap();
        if (org.apache.commons.lang3.StringUtils.isNotBlank(name))
            param.put("name", org.apache.commons.lang3.StringUtils.wrap(name, "%"));
        if (org.apache.commons.lang3.StringUtils.isNotBlank(type))
            param.put("type", org.apache.commons.lang3.StringUtils.wrap(type, "%"));
        Page memoMessage = PageHelper.startPage(query.getPageNum(), query.getPageSize());
        //doing
        apiInfoPublicModuleMapper.selectConfuse(param);
        return memoMessage.toPageInfo();
<think>我们正在讨论的是在若依(RuoYi)框架中将MyBatis升级为MyBatis-Plus的方法。根据之前的引用,我们已经了解到升级的基本步骤,但用户可能希望得到更详细的指导。下面我将结合引用内容,详细说明升级步骤。 ### 步骤1: 添加MyBatis-Plus依赖 在`ruoyi-common`模块的`pom.xml`文件中添加MyBatis-Plus的starter依赖: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.7</version> <!-- 推荐使用最新稳定版 --> </dependency> ``` 同时,移除原有的MyBatis依赖(如果有)[^1][^4]。 ### 步骤2: 修改配置文件 在`ruoyi-admin`模块的`application.yml`中,将原有的MyBatis配置改为MyBatis-Plus配置: ```yaml # 原有MyBatis配置(注释掉) #mybatis: # mapperLocations: classpath*:mapper/**/*.xml # typeAliasesPackage: com.ruoyi.**.domain # 改为MyBatis-Plus配置 mybatis-plus: mapper-locations: classpath*:mapper/**/*.xml type-aliases-package: com.ruoyi.**.domain configuration: # 其他配置,如日志等 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl ``` ### 步骤3: 创建MyBatis-Plus配置类 在`ruoyi-framework`模块的配置包(如`com.ruoyi.framework.config`)下创建`MybatisPlusConfig.java`,并添加以下内容: ```java @Configuration @MapperScan("com.ruoyi.**.mapper") // 确保扫描到Mapper接口 public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); // 添加分页插件 interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 如果需要多租户,可以在这里添加租户插件(参考之前的回答) return interceptor; } } ``` ### 步骤4: 修改原有代码 #### 4.1 修改Service接口 原有的Service接口中,如果使用了MyBatis的`@Select`等注解,可以保留,但建议逐步迁移到MyBatis-Plus的方式(使用Mapper接口和Service封装的方法)。 #### 4.2 修改ServiceImpl 将ServiceImpl改为继承MyBatis-Plus的`ServiceImpl`: ```java // 原继承 // public class UserServiceImpl implements IUserService // 改为 public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService ``` #### 4.3 修改Mapper接口 让Mapper接口继承MyBatis-Plus的`BaseMapper`: ```java // 原接口 // public interface UserMapper {} // 改为 public interface UserMapper extends BaseMapper<User> {} ``` ### 步骤5: 处理实体类 在实体类中使用MyBatis-Plus的注解,例如: ```java @TableName("sys_user") // 如果表名与实体类名不一致,使用此注解 public class User extends BaseEntity { @TableId(type = IdType.AUTO) // 主键策略 private Long userId; // 其他字段... } ``` ### 步骤6: 修改原有XML文件 如果原有XML文件中有写好的SQL,可以继续使用。但可以逐步将简单的CRUD操作替换为MyBatis-Plus的方法,从而减少XML中的SQL。 ### 注意事项 1. **移除原有配置**:注释或删除原有的`MybatisConfig`配置类[^3]。 2. **分页插件**:MyBatis-Plus的分页插件需要单独配置(已在步骤3中体现)。 3. **多租户**:如果项目需要多租户功能,参考之前的回答配置`TenantLineInnerInterceptor`。 ### 测试 启动项目,进行基本的CRUD操作测试,确保功能正常。 ### 相关问题 1. 升级到MyBatis-Plus后,如何实现动态数据源切换? 2. 若依框架中已有的权限控制如何与MyBatis-Plus结合? 3. 如何利用MyBatis-Plus的Lambda表达式简化代码? 4. 升级过程中常见的兼容性问题有哪些? 通过以上步骤,即可将若依框架中的MyBatis升级为MyBatis-Plus,享受MyBatis-Plus带来的便利[^1][^2][^3][^4]。 </think>### 若依框架中 MyBatis 升级 MyBatis-Plus 完整指南 以下是升级的核心步骤,结合若依框架特性优化配置: #### 1️⃣ 依赖调整 (`ruoyi-common/pom.xml`) ```xml <!-- 移除原有 MyBatis 依赖 --> <!-- <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> </dependency> --> <!-- 添加 MyBatis-Plus 依赖 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.7</version> </dependency> ``` > **注**:检查父模块依赖传递,避免版本冲突[^4] #### 2️⃣ 配置文件修改 (`ruoyi-admin/application.yml`) ```yaml # 原 MyBatis 配置 # mybatis: # mapperLocations: classpath*:mapper/**/*.xml # 改为 MyBatis-Plus 配置 mybatis-plus: mapper-locations: classpath*:mapper/**/*.xml global-config: db-config: id-type: auto # 主键策略 configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # SQL日志 ``` #### 3️⃣ 配置类替换 (`ruoyi-framework/config`) ```java @Configuration public class MybatisPlusConfig { /** * 分页插件 + 多租户插件 */ @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); // 分页插件 (必须) interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 多租户插件 (按需添加) interceptor.addInnerInterceptor(new TenantLineInnerInterceptor( new TenantHandler() { // 实现租户处理器 @Override public String getTenantIdColumn() { return "tenant_id"; } @Override public Expression getTenantId() { return new LongValue(SecurityUtils.getLoginUser().getTenantId()); } @Override public boolean ignoreTable(String tableName) { return "sys_config".equals(tableName); // 排除系统表 } } )); return interceptor; } } ``` > **关键点**:删除原有的 `MybatisConfig` 类[^3] #### 4️⃣ 代码层改造 **实体类优化**: ```java // BaseEntity.java 增加注解 @Data public class BaseEntity implements Serializable { @TableId(type = IdType.AUTO) // 主键策略 private Long id; @TableField(fill = FieldFill.INSERT) // 自动填充 private Date createTime; } ``` **Mapper 层改造**: ```java // 原接口 public interface UserMapper { User selectUserById(Long id); } // 改为继承 BaseMapper public interface UserMapper extends BaseMapper<User> { // 复杂SQL仍需XML定义 @Select("SELECT * FROM sys_user WHERE status = #{status}") List<User> selectByStatus(int status); } ``` **Service 层优化**: ```java // 原实现类 @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; public User getById(Long id) { return userMapper.selectUserById(id); } } // 优化后实现 @Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { // 直接使用基类方法:getById(id)、save(entity)等 } ``` #### 5️⃣ 特殊处理 **忽略租户过滤**: ```java @InterceptorIgnore(tenantLine = "true") // 替代废弃的@SqlParser public List<User> selectAllAdmin() { return baseMapper.selectList(null); } ``` **自定义 SQL 注入**: ```java public class CustomSqlInjector extends DefaultSqlInjector { @Override public List<AbstractMethod> getMethodList(Class<?> mapperClass) { List<AbstractMethod> methods = super.getMethodList(mapperClass); methods.add(new BatchInsert()); // 添加自定义方法 return methods; } } ``` #### 验证步骤 1. 启动时检查控制台是否出现 MyBatis-Plus 的 `_ _ _ _ ___` 标识 2. 执行基础查询:`userService.getById(1L)` 3. 验证分页:`Page<User> page = new Page<>(1, 10); userMapper.selectPage(page, null);` 4. 检查租户SQL:`DEBUG [UserMapper.selectList] - ==> Preparing: SELECT ... WHERE tenant_id = ?` #### 💡 注意事项 1. XML 中避免使用 `resultType` 冲突,优先用 `resultMap` 2. 多租户字段需在所有业务表中存在 `tenant_id` 列 3. 升级后禁用 `@EnableTransactionManagement` 避免冲突 4. 若依数据权限需适配:重写 `DataPermissionInterceptor` --- ### 相关问题 1. 如何实现 MyBatis-Plus 与若依数据权限的集成? 2. 升级后分页插件失效的排查方法有哪些? 3. MyBatis-Plus 如何实现动态表名切换? 4. 多租户环境下如何实现跨租户数据查询? 5. MyBatis-Plus 的乐观锁在若依中如何应用? > 通过以上改造,可充分利用 MyBatis-Plus 的 CURD 自动化、性能优化特性,减少约 60% 的SQL编写量[^1][^3]。建议在测试环境验证所有核心业务接口后再部署生产。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值