使用MyBatis进行复杂SQL查询和操作是一种常见的需求,这通常涉及到动态SQL的使用。在MyBatis中,你可以使用XML映射文件或注解来构建这些复杂的SQL语句。以下是一些示例,覆盖你所提及的动态查询分页、分组、多表联查等情况。
- 动态查询分页
在MyBatis中实现动态查询分页,你可以使用<if>标签来构建动态条件,并结合limit和offset进行分页处理。
XML映射文件示例:
<select id="selectUsersByDynamicCriteria" parameterType="map" resultType="User">SELECT * FROM users<where><if test="name != null">AND name = #{name}</if><if test="email != null">AND email = #{email}</if></where>ORDER BY id DESCLIMIT #{limit} OFFSET #{offset}
</select>
- 分组查询
使用分组查询统计某些字段的值。
XML映射文件示例:
<select id="countUsersByCountry" resultType="map">SELECT country, COUNT(*) as userCountFROM usersGROUP BY country
</select>
- 多表联查
进行多表查询,通常涉及到JOIN。
XML映射文件示例:
<select id="selectUsersWithPosts" resultType="User">SELECT users.*, posts.titleFROM usersJOIN posts ON users.id = posts.user_id
</select>
- 联查分组
在多表联查的基础上进行分组。
XML映射文件示例:
<select id="selectPostCountByUser" resultType="map">SELECT users.name, COUNT(posts.id) as postCountFROM usersJOIN posts ON users.id = posts.user_idGROUP BY users.name
</select>
- 各种SQL函数使用
例如,使用日期函数、字符串函数等。
XML映射文件示例:
<select id="selectUsersByRegistrationDate" resultType="User">SELECT *FROM usersWHERE YEAR(registration_date) = #{year}
</select>
分页查询的所有方式
1.物理分页:
- .使用SQL的LIMIT和OFFSET子句。
- .适用于MySQL, PostgreSQL等。
. 逻辑分页:
- 在内存中进行分页处理,即先查询所有数据,然后在服务层面进行分页处理。
- 适用于当无法直接在数据库层面进行分页时。
. 游标分页:
使用数据库游标进行分页,适用于处理大量数据且不想一次性加载所有数据的情况。
. 分区分页:
在支持分区的数据库中,通过查询特定分区来实现分页效果。
分页常见语句
- 基本limit
SELECT * FROM table_name LIMIT 10, 10;SELECT * FROM table_name ORDER BY id DESC LIMIT 20, 10;
- 性能分页查询(适用于大数据量) 大量数据时候就会先根据页码 推断出自增id 然后优化
-- 假设我们已知最后一条记录的ID 这样就可以直接获取后10条数据
SELECT * FROM table_name WHERE id > last_id LIMIT 10;
所以对于大型数据库 自增id和数据id是俩个字段便于跳过优化
@Data
@Table("tablename")
public class Award {/** 自增ID */private Long id;/** 抽奖奖品ID - 内部流转使用 */private Integer awardId;/** 奖品对接标识 - 每一个都是一个对应的发奖策略 */private String awardKey;/** 奖品配置信息 */private String awardConfig;/** 奖品内容描述 */private String awardDesc;/** 创建时间 */private Date createTime;/** 更新时间 */private Date updateTime;}