mybatis常见查询

使用MyBatis进行复杂SQL查询和操作是一种常见的需求,这通常涉及到动态SQL的使用。在MyBatis中,你可以使用XML映射文件或注解来构建这些复杂的SQL语句。以下是一些示例,覆盖你所提及的动态查询分页、分组、多表联查等情况。

  1. 动态查询分页
    在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 DESC
  LIMIT #{limit} OFFSET #{offset}
</select>

  1. 分组查询
    使用分组查询统计某些字段的值。
    XML映射文件示例:
<select id="countUsersByCountry" resultType="map">
  SELECT country, COUNT(*) as userCount
  FROM users
  GROUP BY country
</select>

  1. 多表联查
    进行多表查询,通常涉及到JOIN。
    XML映射文件示例:
<select id="selectUsersWithPosts" resultType="User">
  SELECT users.*, posts.title
  FROM users
  JOIN posts ON users.id = posts.user_id
</select>

  1. 联查分组
    在多表联查的基础上进行分组。
    XML映射文件示例:
<select id="selectPostCountByUser" resultType="map">
  SELECT users.name, COUNT(posts.id) as postCount
  FROM users
  JOIN posts ON users.id = posts.user_id
  GROUP BY users.name
</select>

  1. 各种SQL函数使用
    例如,使用日期函数、字符串函数等。
    XML映射文件示例:
<select id="selectUsersByRegistrationDate" resultType="User">
  SELECT *
  FROM users
  WHERE 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;

}

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝胖子不是胖子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值