当前位置: 首页 > wzjs >正文

厦门建网站做优化邯郸网站优化公司

厦门建网站做优化,邯郸网站优化公司,阿里云免费网站建设,wix做网站教程MyBatis 动态 SQL 完整笔记 一、核心动态 SQL 标签与用法 1. 条件控制类标签 <if>&#xff1a;基础条件判断 示例&#xff1a;根据 name 和 age 动态筛选用户 <if test"name ! null and name ! ">AND user_name #{name} </if><choose>/<…

MyBatis 动态 SQL 完整笔记


一、核心动态 SQL 标签与用法

1. 条件控制类标签

  • <if>:基础条件判断
    示例:根据 nameage 动态筛选用户

    <if test="name != null and name != ''">AND user_name = #{name}
    </if>
    
  • <choose>/<when>/<otherwise>:多条件分支
    示例:类似 Java 的 switch-case,优先匹配首个满足条件的 <when>

    <choose><when test="type == 'admin'">AND role = 'admin'</when><otherwise>AND role = 'guest'</otherwise>
    </choose>
    

2. 语法修正类标签

  • <where>:自动处理 WHERE 关键字和首条条件前的 AND/OR

    <where><if test="age != null">AND age = #{age}</if>
    </where>
    
  • <trim>:更灵活的语法修正(替代 <where><set>
    示例:自定义前缀/后缀及需删除的字符

    <trim prefix="WHERE" prefixOverrides="AND |OR"><if test="name != null">AND name=#{name}</if>
    </trim>
    
  • <set>:自动处理 UPDATE 语句的 SET 子句
    示例:动态更新字段并去除末尾逗号

    <set><if test="name != null">name=#{name},</if><if test="age != null">age=#{age}</if>
    </set>
    

3. 集合处理类标签

  • <foreach>:遍历集合(批量操作/IN 查询)

    <foreach collection="list" item="item" open="(" separator="," close=")">#{item.id}
    </foreach>
    
  • <bind>:预定义变量(优化模糊查询等场景)

    <bind name="namePattern" value="'%' + name + '%'"/>
    WHERE username LIKE #{namePattern}
    

二、性能优化与最佳实践

1. OGNL 表达式优化

  • 避免复杂嵌套表达式,优先在 Java 层处理判断逻辑
    <if test="@com.utils.MyBatisUtils@isValid(name)">
    

2. 批量操作优化

  • 使用 BATCH 模式执行 SqlSession,减少数据库连接开销
  • 分批次处理超大数据集(如每 1000 条提交一次)

3. 缓存策略

  • 二级缓存配置(Mapper 级别,跨会话共享)
    <mapper namespace="com.UserMapper"><cache eviction="LRU" flushInterval="60000"/>
    </mapper>
    
  • 注意脏读问题:更新操作后手动清除缓存
    <update id="updateUser" flushCache="true">
    

三、高频场景实战示例

1. 动态排序与分页

<select id="selectUsers" resultMap="UserResultMap">SELECT * FROM users<where><if test="orderBy != null">ORDER BY ${orderBy} <!-- 注意 SQL 注入风险 --></if><if test="offset >=0 and limit >0">LIMIT #{offset}, #{limit}</if></where>
</select>

2. 多字段模糊查询

<bind name="searchKey" value="'%' + key + '%'"/>
<where>(title LIKE #{searchKey} OR content LIKE #{searchKey})
</where>

3. 批量插入优化

<insert id="batchInsert">INSERT INTO users (name, age) VALUES<foreach collection="list" item="user" separator=",">(#{user.name}, #{user.age})</foreach>ON DUPLICATE KEY UPDATE age=VALUES(age)
</insert>

四、安全与规范

1. 防 SQL 注入

  • 禁止直接拼接 ${} 参数(除非绝对可信)
  • 使用 #{} 预编译参数化查询

2. 参数校验

  • 集合判空:<if test="list != null and !list.isEmpty()">
  • 字符串处理:<if test="name != null and name.trim() != ''">

3. 类型安全

  • 显式声明 jdbcType(避免 NULL 类型推断错误)
    #{age,jdbcType=INTEGER}
    

五、高级特性

1. 注解动态 SQL

@SelectProvider(type = UserSqlBuilder.class, method = "buildQuery")
List<User> findUsers(UserQuery query);

2. 动态表名映射

<select id="selectByTable" resultType="map">SELECT * FROM ${tableName}
</select>

最佳实践总结

  1. 优先使用 <where>/<set> 替代手动处理 SQL 语法
  2. 复杂条件判断应前移至 Java 代码处理
  3. 批量操作需配合数据库连接池优化
  4. 高频读场景启用二级缓存,但注意数据一致性
  5. 使用 <bind> 统一处理格式转换(如日期/模糊查询)
http://www.dtcms.com/wzjs/432395.html

相关文章:

  • 医院网站解决方案无锡网站seo
  • 如何建设网站 知乎ue5培训机构哪家强
  • 淄博网站的建设泰安网站制作推广
  • 模仿网站建设站建设windows优化软件哪个好
  • 天津响应式网站建设2022最火营销方案
  • 代备案网站空间本地建站软件有哪些
  • 怎样做才能让百度前两页有自己网站内容郑州网络营销推广
  • 政府网站集约化建设试点腾讯广告
  • 加强 政府网站信息内容 建设武汉十大技能培训机构
  • 网站充值 下模板seo人才招聘
  • 带m开头的网站怎么做手机建网站软件
  • 电商设计就是网站设计吗网页设计制作网站图片
  • 网络彩票的网站怎么做网站建设小程序开发
  • wordpress网站鼠标公司seo排名优化
  • 重庆市公路建设市场信用信息台州seo排名公司
  • 解决方案网站排名网站推广营销运营方式
  • 政府信息公开和网站建设b站推广入口2023mmm
  • 阿里云虚拟机怎么做多个网站网站整站优化公司
  • 郴州新闻今日头条长沙网站优化培训
  • 济南做网站哪里便宜广告投放平台排名
  • wordpress中的文章深圳网络推广seo软件
  • 河北省网站备案管理系统seo自学教程seo免费教程
  • 枣阳网站开发公司哪家好网站推广公司排名
  • 网站设计的主要机构有哪些?百度网络推广怎么做
  • 汽车门户网站 源码三十个知识点带你学党章
  • 公司建设网站注意事项培训学校机构有哪些
  • 网站建设最便宜多少钱做网销的一天都在干嘛
  • 免费php网站系统自动发帖软件
  • 女生做网站后期维护工作好吗网站测试
  • 个人做的卖货网站建站快车