暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

《MyBatis剑谱之谜》—— XML剑宗 vs 注解气宗,谁是持久层真王者?

导语
MyBatis江湖暗藏玄机!
XML剑宗手握千行映射文件,剑气纵横;
注解气宗轻点@Select
指诀,化繁为简。
一个追求SQL显式掌控,一个推崇代码即SQL,
究竟是剑宗招式大开大合更胜一筹,还是气宗内功心法独步天下?
且看今日《MyBatis论剑》——“SQL之道,存乎一心?”


第一幕:门派渊源

XML剑宗

  • 出身:MyBatis开山鼻祖,以mapper.xml
    为剑谱,讲究人剑分离(SQL与代码解耦)。

  • 绝学

    • 动态SQL九剑<if>、<foreach>
      如独孤九剑,见招拆招。

    • 结果集映射大阵<resultMap>
      精准匹配字段,如少林罗汉阵滴水不漏。

  • 口头禅:“SQL不显式,何以安天下?”


注解气宗

  • 师承:MyBatis 3.x后崛起,以@Select
    @Update
    为心法,主张人剑合一

  • 绝技

    • 注解点穴手@Results
      @Result
      直接嵌入Java代码,如六脉神剑无形剑气。

    • Provider秘术@SelectProvider
      动态生成SQL,似乾坤大挪移变幻莫测。

  • 口头禅:“代码即SQL,无招胜有招!”



第二幕:巅峰对决

招式一:基础CRUD

  • XML剑宗

      <select id="selectUser" resultType="User">  
          SELECT * FROM user WHERE id = #{id}  
      </select>  
      • 优势:SQL一目了然,改SQL无需重新编译代码。

      • 劣势:文件切换如翻山越岭,IDEA中Ctrl+左键
        跳转易迷路。

    • 注解气宗

        @Select("SELECT * FROM user WHERE id = #{id}")  
        User selectUser(int id);  
        • 优势:代码与SQL零距离,跳转如凌波微步。

        • 陷阱:SQL过长时,Java代码如裹脚布又臭又长!


      招式二:动态SQL

      • XML剑宗

          <select id="findUsers" resultType="User">  
              SELECT * FROM user  
              <where>  
                  <if test="name != null">AND name = #{name}</if>  
                  <if test="age != null">AND age = #{age}</if>  
              </where>  
          </select>  
          • 剑气纵横:复杂条件组合游刃有余,SQL可读性MAX。


        • 注解气宗

            @SelectProvider(type = UserSqlBuilder.class, method = "buildFindUsersSql")  
            List<UserfindUsers(UserQuery query);  
            // 靠Java代码拼接SQL(容易走火入魔)  
            class UserSqlBuilder {  
                public String buildFindUsersSql(UserQuery query) {  
                    String sql = "SELECT * FROM user";  
                    if (query.getName() != null) sql += " WHERE name = #{name}";  
                    if (query.getAge() != null) sql += " AND age = #{age}";  
                    return sql;  
                }  
            }  
            • 内伤警告:字符串拼接易出错,SQL注入风险暗藏!


          招式三:关联查询

          • XML剑宗

              <resultMap id="userWithOrdersMap" type="User">  
                  <id property="id" column="id"/>  
                  <collection property="orders" ofType="Order"  
                      select="selectOrdersByUserId" column="id"/>  
              </resultMap>  
              • 奥义<collection>
                <association>
                轻松驾驭一对多、多对一。


            • 注解气宗

                @Results({  
                    @Result(column = "id"property = "id"),  
                    @Result(column = "id"property = "orders",  
                            many = @Many(select = "selectOrdersByUserId"))  
                })  
                @Select("SELECT * FROM user WHERE id = #{id}")  
                User getUserWithOrders(int id);  
                • 内功要求:注解嵌套如经脉逆行,稍有不慎则N+1
                  查询暴毙!



              第三幕:隐藏BOSS现世

              MyBatis-Plus少教主

              • 必杀技

                • Wrapper条件构造器QueryWrapper<User> wrapper = new QueryWrapper<>().eq("name", "张三")
                  ,SQL拼接告别手写!

                • ActiveRecord模式user.insert()
                  直接存库,如武当梯云纵一步登天。

              • 挑衅:“剑宗气宗都是旧时代的眼泪,我MP才是真·持久层答案!”


              混合双修魔教长老(XML+注解混用):

              • 邪典心法

                  @Select("<script>SELECT * FROM user <where>  
                          <if test='name != null'>AND name = #{name}</if></where></script>")  
                  List<User> findUsers(UserQuery query);  
                  • 走火入魔:注解中嵌XML动态标签,代码如缝合怪,维护者直呼“妖术”!



                终局:谁是真王者?

                1️⃣ XML剑宗

                • 适用:复杂SQL、动态查询、需要DBA审核SQL的场景。

                • 警世名言:“SQL是程序员对数据库的最后尊严!”


                2️⃣ 注解气宗

                • 适用:简单CRUD、快速原型开发、小团队敏捷项目。

                • 血泪教训:“SQL写在注解里,离职后同事追杀你!”


                3️⃣ MyBatis-Plus少教主

                • 核心理念:“少写SQL,多摸鱼!”

                • 软肋:复杂联表查询仍需手写XML/注解,终究难逃宿命。



                江湖生存指南

                • 大型项目:XML剑宗镇守核心业务,注解气宗处理边缘模块。

                • 快速迭代:MyBatis-Plus少教主+Lambda表达式,效率拉满。


                • 禁忌

                  • 避免XML与注解混用(除非你想练《辟邪剑谱》)。

                  • 动态SQL优先XML,字符串拼接是万恶之源



                互动话题
                你是“XML剑宗死忠”还是“注解气宗信徒”?
                经历过哪些SQL拼接惨案动态SQL真香现场
                留言区Battle,点赞送《MyBatis避坑真经》!

                关注我,学最骚的ORM,吃最甜的瓜! 🍉
                (下期预告:《Redis门派风云》—— String小师弟 vs Hash大师兄,谁是最强数据结构?)


                文章转载自让天下没有难学的编程,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                评论