MyBatis小技巧

  • ‘#{}’和’${}’

    • 两者均能用于sql语句中
    • ‘#{}’:底层使用的是preparedStatement,先进行sql语句的编译,再给sql语句的?传值,可以避免sql注入
    • ‘${}’:底层使用的是Statement,先对sql语句进行拼接,再对sql语句进行编译,存在sql注入的问题
    • 注意:#{}和${}用于sql语句中,非sql语句没有必要使用。
  • 优先使用’#{}‘,避免sql注入的问题。

  • 使用#{}取值时,取出来的值默认会带 ‘’ .

  • 使用${}的情况

    • 将sql语句中的关键字进行传输,就要使用’${}’,比如根据用户指定的排序规则(asc,desc)进行数据查询。如果使用’#{asc}‘,那么在sql语句中出现的是’asc’,是一个字符串,而采用后者,会将参数直接拼接到sql语句上,那么出现的就是asc了。

    • 批量删除

      • 批量删除的方法
      • delete from xxx where xx = xx or xx = xx;
      • delete from xxx where xx in(xx,xx,xx);
      • 当使用第二种方法时,我们就可以通过${xx,xx,xx}将参数传入。
    • 模糊查询

      • select * from xxx where xx like …
      • …号处可以用以下值替代
      • ‘${xxx}’
      • “%”#{xxx}”%”
      • concat(‘%’,#{xxx},’%’)
  • 别名

    • 我们可以在mybatis的核心配置文件中给某个类型起别名,可以使用该别名对所有使用该类型的地方进行替换

    • <typeAliases>
          <!--type表示要起别名的类型 alia表示起的别名。该alias属性可以省略不写,这种情况下,该类型的别名就是这个类的简名。比如:com.deng.mybatis.pojo.Car的简名就是car,不区分大小写-->
          <typeAlias type = "" alias="">
          <!--还可以对包起别名,起了别名的包会自动对其内部的类起别名,别名就是这些类的简名,不区分大小写-->
          <package name="com.deng.mybatis.pojo">
      </typeAliases>
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18

      * 所有别名不区分大小写,并且namespace不能使用别名。

      * mybatis-config.xml中的mapper标签

      * mapper标签有3个属性,均用来指定sql配置文件的路径

      * resource:从类的根路径下开始查找资源,sql配置文件必须放在类路径下

      * url:以绝对路径的方式定位资源,可以将sql配置文件放在任意位置。使用file \ \ \ :+路径 格式,这种方式很少用,因为可移植性太差。

      * class:**value值为接口的全限定名(带包名的那种)。思考:这个属性的作用是用来关联mapper.xml文件的,提供接口的全限定名有什么用?表示从该接口所在的包下查找mapper.xml文件,在这种情况下,sql配置文件必须位于接口所在的包下并且名称要和接口名对应。因此我们也可以使用别名技巧,自动给接口起别名**

      * ```xml
      <mappers>
      <!-- <mapper class="com.deng.mybatis.mapper.CarMapper"></mapper>-->
      <package name="com.deng.mybatis.mapper"/>
      </mappers>
  • 注意:在IDEA中resources和java中创建的文件都位于类的根路径下。如果想要在resources下创建多级目录,必须按照com/deng/mybatis的方式,而不是com.deng.mybatis。后者是创建包的方法,而只能在java中创建包。

  • 插入语句时使用自动生成的主键

    • <!--只需在sql配置文件的insert标签中添加以下属性即可。useGeneratedKey="true"表示需要使用自动生成的主键。keyProperty属性表示将生成的主键封装-->
      <insert id="" useGeneratedKeys="true" keyProperty="id">
          ...
      </insert>