mybatits

<update id="updateStatusById" parameterType="java.lang.Integer">
update
nic_techsupport
set status_id = #{0}
where techsupport_id =#{1}
</update>

在MyBatis3.4.4版后不能直接使用#{0}要使用 #{arg0}

<update id="updateStatusById" parameterType="java.lang.Integer">
update
nic_techsupport
set status_id = #{arg0}
where techsupport_id =#{arg1}
</update>

 

不使用@Param注解时,参数只能有一个,并且是Javabean。在SQL语句里可以引用JavaBean的属性,而且只能引用JavaBean的属性。

// 这里id是user的属性

@Select("SELECT * from Table where id = ${id}")
Enchashment selectUserById(User user);

 

转载于:https://www.cnblogs.com/y-blog/p/9165618.html

<think>嗯,用户想了解MyBatis的分页功能。首先,我应该回忆一下MyBatis的基本分页方式,记得早期MyBatis本身不支持物理分页,更多是逻辑分页,也就是用RowBounds或者通过SQL语句的limit和offset来实现。不过现在可能有了插件,比如PageHelper,这个应该挺常用的。 用户可能想知道不同的分页方法,比如手动写SQL分页和使用插件有什么区别。需要分步骤解释,先讲基础的方法,再介绍插件,这样结构更清晰。还要注意提到物理分页和逻辑分页的区别,物理分页是数据库层面,效率更高,而逻辑分页可能会影响性能,特别是数据量大的时候。 可能用户在实际项目中会遇到性能问题,所以需要强调PageHelper这类插件的优势,比如简化代码,自动处理分页参数,生成count查询等。同时,也要提到使用插件时需要注意的依赖配置,比如在Spring中如何整合。 另外,分页参数的处理也很重要,比如前端传递的页码和每页数量,后端如何接收和处理,确保参数合法,避免SQL注入等问题。可能需要给出示例代码,比如在Mapper接口中定义方法,XML里写对应的SQL,或者使用注解方式。 还要考虑不同数据库的分页语法差异,比如MySQL用LIMIT,Oracle用ROWNUM,而PageHelper能自动适配不同的数据库,这点对用户来说可能很有帮助,特别是在多数据库支持的项目中。 用户可能也会关心分页结果的处理,比如返回的数据结构是否包含总记录数、当前页等信息,可以提到PageInfo类,它封装了这些信息,方便前端展示分页导航。 最后,要提醒一些常见问题,比如嵌套查询导致的分页错误,或者排序字段的问题,以及在使用插件时配置是否正确,比如拦截器的设置。可能还需要比较一下MyBatis-Plus的分页功能,如果用户知道这个的话,但根据问题描述,用户主要问的是MyBatis,所以可能不需要深入,但可以稍微提一下。 总结一下,回答的结构应该是先介绍基本的手动分页,然后讲RowBounds的逻辑分页,接着重点介绍PageHelper插件,包括配置和使用示例,最后提到注意事项和常见问题。确保每一步都清晰,代码示例正确,并且用中文口语化表达,避免技术术语过于晦涩。</think>MyBatis的分页功能实现主要分为两种方式:**手动SQL分页**和**插件自动分页**。以下分步骤为您详解: --- ### 一、手动SQL分页(基础方式) **原理**:直接通过SQL的`LIMIT`和`OFFSET`(MySQL)或`ROWNUM`(Oracle)实现物理分页。 #### 示例代码: ```xml <!-- Mapper.xml --> <select id="selectUsers" resultType="User"> SELECT * FROM users ORDER BY id LIMIT #{offset}, #{pageSize} </select> ``` ```java // Java调用 List<User> users = sqlSession.selectList("selectUsers", null, new RowBounds(offset, pageSize)); ``` **缺点**: - 需要手动计算`offset = (pageNum - 1) * pageSize` - 不同数据库语法差异大(需适配) --- ### 二、RowBounds逻辑分页(不推荐) **原理**:MyBatis内置的`RowBounds`对象通过ResultSet游标在内存中过滤数据。 ```java List<User> users = sqlSession.selectList("selectAllUsers", null, new RowBounds(offset, pageSize)); ``` **缺点**: - **性能问题**:本质是查询全部数据后截取片段 - 数据量大时可能导致内存溢出 --- ### 三、PageHelper插件(推荐方案) **原理**:通过拦截器动态修改SQL,自动添加分页语句,并支持多数据库。 #### 使用步骤: 1. **添加依赖**: ```xml <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>最新版本</version> </dependency> ``` 2. **配置拦截器**(MyBatis-config.xml): ```xml <plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <property name="helperDialect" value="mysql"/> <!-- 指定数据库类型 --> </plugin> </plugins> ``` 3. **代码调用**: ```java // 开启分页(紧跟的第一个select方法会被分页) PageHelper.startPage(pageNum, pageSize); List<User> users = userMapper.selectAll(); // 封装分页信息 PageInfo<User> pageInfo = new PageInfo<>(users); ``` **输出结果**: ```json { "total": 100, // 总记录数 "pageNum": 1, // 当前页码 "pageSize": 10, // 每页数量 "list": [...] // 当前页数据 } ``` --- ### 四、MyBatis-Plus分页(扩展方案) 若项目使用MyBatis-Plus,其内置了更简洁的分页API: ```java // 配置分页插件 @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } // 使用分页查询 Page<User> page = new Page<>(pageNum, pageSize); userMapper.selectPage(page, null); ``` --- ### 注意事项 1. **性能优化**:复杂查询建议先优化SQL,避免全表扫描 2. **线程安全**:`PageHelper.startPage()`必须紧跟查询语句,且需确保在同一个线程 3. **嵌套查询问题**:分页对嵌套查询(如`<collection>`)可能不准确 4. **排序安全**:分页时推荐显式指定`ORDER BY`,避免随机排序导致分页混乱 实际项目中推荐使用**PageHelper插件**,它能平衡开发效率和性能需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值