• mybatis 的sql语句及使用mybatis的动态sql mybatis防注入


    由于看到写的比较详细的文档这里将之前的删掉了,只留下一些我认为能帮助理解的和关于动态sql及防注入的一些理解。文档链接  :mybatis官方文档介绍


     1 <!-- 根据条件查询用户 -->
     2 <select id="queryUserByWhere" parameterType="user" resultType="user">
     3     SELECT id, username, birthday, sex, address FROM `user`
     4     WHERE 1=1
     5     <if test="sex != null and sex != ''">
     6         AND sex = #{sex}
     7     </if>
     8     <if test="username != null and username != ''">
     9         AND username LIKE
    10         '%${username}%'
    11     </if>
    12 </select>

    注意字符串类型的数据需要要做不等于空字符串校验。

    上面的sql还有where 1=1 这样的语句,很麻烦 可以使用mybatis的where标签
     5 <!-- 根据条件查询用户 -->
     6 <select id="queryUserByWhere" parameterType="user" resultType="user">
     7     SELECT id, username, birthday, sex, address FROM `user`
     8 <!-- where标签可以自动添加where,同时处理sql语句中第一个and关键字 -->
     9     <where>
    10         <if test="sex != null">
    11             AND sex = #{sex}
    12         </if>
    13         <if test="username != null and username != ''">
    14             AND username LIKE
    15             '%${username}%'
    16         </if>
    17     </where>
    18 </select>

    效果是一样的

    Sql中可将重复的sql提取出来,使用时用include引用即可,最终达到sql重用的目的。 

    然而  然而 然而  引用结果resultMap巨tm诡异resultMap  和其中的参数重复的话会报错 所以关于resultMap一定要慎重填写 必要的时候把属性都填上不要偷懒

     1 <!-- 根据条件查询用户 -->
     2 <select id="queryUserByWhere" parameterType="user" resultType="user">
     3     <!-- SELECT id, username, birthday, sex, address FROM `user` -->
     4     <!-- 使用include标签加载sql片段;refid是sql片段id -->
     5     SELECT <include refid="userFields" /> FROM `user`
     6     <!-- where标签可以自动添加where关键字,同时处理sql语句中第一个and关键字 -->
     7     <where>
     8         <if test="sex != null">
     9             AND sex = #{sex}
    10         </if>
    11         <if test="username != null and username != ''">
    12             AND username LIKE
    13             '%${username}%'
    14         </if>
    15     </where>
    16 </select>
    17 
    18 <!-- 声明sql片段 -->
    19 <sql id="userFields">
    20     id, username, birthday, sex, address
    21 </sql>

    再这个xml中你甚至可以使用别的xml中的sql  加上namespace即可:这样

    关于foreach  这个也很好用,方便:

    这是接口   注意接口方法名和maper.xml的id一致 否则无法自动映射。这是mapper。xml的

    需要了解一下foreach里面都是些什么东西  collection:你传给xml参数的类型  也是需要遍历前的对象 item给遍历出来的结果一个名字,可以参照foreach方法

    index 就是index的意思 open:开始遍历前加上的字符 在这里是 紧跟着 in  后面的  close:遍历结束后加上的字符  separator 每个遍历结果之间的分隔符  那么总的就是  delete from mall_user where  user_id in  ( 1,2,3); mybatis会知道最后一个遍历结果不要加,

     还一个mybatis放sql注入  总得来说就是别用${} 多用#{}详解:mybatis实现防止sql注入总的来说是依靠其预编译过程和存储过程。存储过程就是mybatis提供一组完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过调用存储过程并给定参数(如果该存储过程带有参数)就可以执行它,也可以避免SQL注入攻击。预编译:我们传给mybatis的参数可以理解为占位符,在预编译过程mybatis检查语句的正确性然后将我i们给的占位符放到它预编译的语句的占位符上

    补充说一下关于sqlMapConfig。xml中setting配置  我不怎么用但还是补充介绍一下

     

  • 相关阅读:
    M3U8文件
    线程间的通信方式以及线程与进程的区别
    string类的实现
    进程间的通信方式
    GDB调试多线程
    面向对象与面向过程的优缺点
    同步与异步,阻塞与非阻塞的区别
    计算机cpu、寄存器、内存区别
    Linux下Makefile中动态链接库和静态链接库的生成与调用
    使用session来存储用户的登录信息
  • 原文地址:https://www.cnblogs.com/notably/p/10510524.html
Copyright © 2020-2023  润新知