zoukankan      html  css  js  c++  java
  • Mybatis基金会: 经常问的问题FAQ

    Mybatis基金会: #{...} 和 ${...} 差额

    MyBatis将 #{…} 解释为JDBC prepared statement 参数标记。而将 ${…} 解释为一个字符串替换。非常实用的, 由于在某些SQL语句中并不能使用參数标记(parameter markers)。

    比方,我们不能在表名(table name)的位置使用參数标记。
    如果有以下的代码:
    Map<String, Object> parms = new HashMap<String, Object>();
    parms.put("table", "foo"); // 表名
    parms.put("criteria", 37); // 查询过滤条件
    List<Object> rows = mapper.generalSelect(parms);
    <select id="generalSelect" parameterType="map">
      select * from ${table} where col1 = #{criteria}
    </select>

    MyBatis生成的SQL语句(prepared statement)例如以下所看到的:
    select * from foo where col1 = ?


    重要提示: 请注意,使用$ {…} (字符串替换)时可能会有SQL注入攻击的风险。

    另外,字符串替换在处理复杂类型也可能经常发生故障,如日期类型。由于这些因素,我们建议您尽可能地使用 #{…} 这样的方式。

    要使用LIKE语句该怎么写?


    有两种使用LIKE的方法。(推荐使用)第一种方法是,在Java代码中加入SQL通配符。

    演示样例一:
    String wildcardName = "%Smi%";
    List<Name> names = mapper.selectLike(wildcardName);
    <select id="selectLike">
      select * from foo where bar like #{value}
    </select>

    另外一种方式是在SQL语句中拼接通配符。

    这样的方法相对来说安全性要低一些,由于可能会被SQL注入攻击。
    演示样例二:

    String wildcardName = "Smi";
    List<Name> names = mapper.selectLike(wildcardName);
    <select id="selectLike">
      select * from foo where bar like '%' || '${value}' || '%'
    </select>

    重要提示: 请注意两种方式中 $# 的使用!

    怎样运行批量插入?


    首先,创建一个简单的insert语句:
    <insert id="insertName">
      insert into names (name) values (#{value})
    </insert>

    然后在Java代码中像以下这样运行批处理插入:
    List<String> names = new ArrayList<String>();
    names.add("Fred");
    names.add("Barney");
    names.add("Betty");
    names.add("Wilma");
    
    // 注意这里 ExecutorType.BATCH
    SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
    try {
      NameMapper mapper = sqlSession.getMapper(NameMapper.class);
      for (String name : names) {
        mapper.insertName(name);
      }
      sqlSession.commit();
    } finally {
      sqlSession.close();
    }

    怎样获取自己主动生成的(主)键值?


    insert 方法总是返回一个int值 - 这个值代表的是插入的行数。而自己主动生成的键值在 insert 方法运行完后能够被设置到传入的參数对象中。
    演示样例:
    <insert id="insertName" useGeneratedKeys="true" keyProperty="id">
      insert into names (name) values (#{name})
    </insert>
    Name name = new Name();
    name.setName("Fred");
    
    int rows = mapper.insertName(name);
    // 完毕后,id已经被设置到对象中
    System.out.println("rows inserted = " + rows);
    System.out.println("generated key value = " + name.getId());

    在mapper中怎样传递多个參数?

    Java的反射机制并不能让框架获取到參数的名字(方法签名中仅仅有參数类型,能够说是为了优化,也能够说设计就是如此,总之名字无意义), 所以MyBatis默认的命名为: param1,param2……
    如果想给他们指定名称,能够使用 @param 注解:
    import org.apache.ibatis.annotations.Param;
    public interface UserMapper {
       User selectUser(@Param("username") String username, 
                       @Param("hashedPassword") String hashedPassword);
    }

    然后,就能够在xml像以下这样使用(推荐封装为一个Map,作为单个參数传递给Mapper):
    <select id=”selectUser” resultType=”User”>
      select id, username, hashedPassword
      from some_table
      where username = #{username}
      and hashedPassword = #{hashedPassword}
    </select>

    原文链接: What is the difference between #{...} and ${...}?

    原始日期: 2013-11-10
    翻译日期: 2014-09-28
    翻译者: 锚的

  • 相关阅读:
    Python修饰器 ,控制授权,通过ini配置文件 使用密钥 给函数限制试用期和过期后试用次数
    excel vba 自定义函数 使用正则表达式提取字符串
    python 值比较判断,np.nan is np.nan 却 np.nan != np.nan ,pandas 单个数据框/单元格 值判断nan
    python 读取中文CSV 'gbk' codec can't decode bytes in position 2-3:illegal multibyte sequence
    python ipython [Errno 22] invalid mode ('rb') or filename 、IDE工作路径
    windows下 python 添加PYTHONPATH 环境变量
    pandas(python2) 读取中文数据,处理中文列名
    qq邮箱 微信提醒不通知
    python :import error
    python推荐淘宝物美价廉商品 2.0
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4802835.html
Copyright © 2011-2022 走看看