`
konoha
  • 浏览: 4451 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

【转载】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>

Mybatis基础: 常见问题与FAQ

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

原文日期: 2013-11-10
翻译日期: 2014-09-28
翻译人员: 铁锚


转载来源: http://www.mamicode.com/info-detail-233643.html

分享到:
评论

相关推荐

    mybatis版本:3.5.6(jdk1.8(含)及以上)、3.4.6(jdk1.8以下)

    MyBatis是一个流行的Java持久层框架,它简化了数据库操作,通过XML或注解的方式将SQL语句与Java代码关联起来。在给定的压缩包文件中,我们有两个主要的知识点,即MyBatis的两个不同版本:3.5.6和3.4.6,它们分别对应...

    MyBatis项目:ALL

    JavaWeb框架——MyBatis学习过程(均用Maven) maven01:Mapper代理、基础功能死查询 ...MyBatis_MBG:逆向工程(奢华尊享版)(由数据库逆向自动生成实体类、接口文件、映射文件且附带基础/高级功能)

    MyBatisDemo:MyBatis 框架知识案例

    1.创建第一个 MyBatis 程序案例 ...3.MyBatis 关联查询与懒加载案例 4.MyBatis 缓存案例 5.MyBatis 动态 SQL 标签案例 6.MyBatis Generator 、批量操作与分页查询案例 7.MyBatis 自定义 typeHandler 处理枚举类型案例

    mybatis-paginator-1.2.15-API文档-中文版.zip

    赠送jar包:mybatis-paginator-1.2.15.jar; 赠送原API文档:mybatis-paginator-1.2.15-javadoc.jar; 赠送源代码:mybatis-paginator-1.2.15-sources.jar; 赠送Maven依赖信息文件:mybatis-paginator-1.2.15.pom;...

    mybatis-3.4.5

    在使用MyBatis 3.4.5时,你可能会遇到以下常见问题: - **SQL执行效率**:合理设计SQL语句,避免全表扫描和过多的JOIN操作,以提升执行效率。 - **XML配置错误**:确保XML映射文件的命名空间、ID、参数类型和返回...

    掌握MyBatis核心:自定义SQL执行全攻略

    MyBatis 是一个半自动的持久层框架,用于在 Java 应用程序中简化数据库操作。它提供了一个高级的数据访问 API,使得在应用程序中使用 SQL 语句变得更加容易和直观。MyBatis 允许开发者通过 XML 或注解的方式来配置 ...

    mybatis 3.2.6

    标签"mybatis"进一步确认了该压缩包与MyBatis框架有关,这可能是一个开发人员为了方便下载和使用MyBatis而创建的。 压缩包内的文件名称"mybatis-3.2.6.zip"表示这个文件是MyBatis 3.2.6的压缩文件。要使用这个文件...

    mybatis-3.5.9.zip

    10. **Spring集成**:MyBatis可以方便地与Spring框架集成,通过Spring的TransactionManager进行事务管理,使用Spring的Bean管理实现SqlSessionFactory和Mapper的注入。 在实际开发中,MyBatis的这些特性和功能使得...

    MyBatis入门:Java项目中的数据持久化神器.txt

    mybatis

    idea mybatis插件:mybatispuls 破解 2.9.2版本

    近期idea mybatis插件已经升级至3.x,class文件混淆,基本无破解希望,后来,mybatis把老版本的回退下载入口也疯掉了,这里提供了老版本2.9.2的安装包、mybatis秘钥文件。 目前本人的可用,环境:idea 2017.2.5 、 ...

    springMVC+Spring+Mybatis框架 : 简易博客系统.zip

    说明: 本项目是为springMVC+spring+mybatis的集成项目,使用maven进行项目管理 版本说明:spring3.2 mybatis3.2 mysql5.6 相关接口: 用户接口+角色权限接口+博客接口。

    手写mybatis框架源码由浅入深

    手写mybatis框架源码 不借助其他任何框架,从最底层开始着手,用最简单的代码,将mybatis的底层框架,手写出来,让你对mybatis有一个更加深刻和直观的理解 详见:...

    Mybatis基础知识整合

    Mybatis基础知识,使用方法,视频为b站狂神说java的mybatis

    mybatis-plug.jar和 mybatis-plug的安装说明

    MyBatis-Plus是一个强大的扩展库,它是MyBatis框架的增强工具,旨在简化开发,减少常规 CRUD(创建、读取、更新、删除)操作的代码量。在本指南中,我们将详细介绍如何安装和使用mybatis-plus.jar以及相关的mybatis-...

    mybatisdemo:模拟mybatis

    通过分析mybatisdemo项目,你可以从源码层面深入理解上述知识点,这对于提升MyBatis的使用技巧和解决实际问题大有裨益。同时,参与开源社区,与其他开发者交流,也会使你的编程技能更上一层楼。

    Mybatis-ehcache 1.2.1源码(ehcache-cache-mybatis-ehcache-1.2.1.zip)

    通过阅读源码,我们可以深入理解Mybatis-ehcache如何利用Ehcache实现缓存功能,以及它如何与Mybatis的运行机制无缝对接。这不仅有助于我们定制自己的缓存解决方案,还能帮助我们在实际项目中更高效地使用Mybatis和...

    mybatis基础学习项目源代码

    Mybatis 是一款流行的Java持久层框架,它简化了与数据库交互的过程,提供了强大的SQL映射功能,使得开发者能够更加灵活地操作数据库。本项目源代码是针对Mybatis的基础学习,旨在帮助初学者深入理解Mybatis的工作...

    MyBatis-Flex: 一个优雅的 MyBatis 增强框架

    MyBatis-Flex: 一个优雅的 MyBatis 增强框架。很轻量,MyBatis-Flex 整个框架只依赖 MyBatis,再无其他任何第三方依赖。只增强,MyBatis-Flex 支持 CRUD、分页查询、多表查询、批量操作,但不丢失 MyBatis 原有的...

    mybatis学习总结:基础示例

    【标题】:“mybatis学习总结:基础示例” 在IT领域,MyBatis是一个非常流行的持久层框架,它简化了Java开发中数据库操作的复杂性。这篇“mybatis学习总结:基础示例”旨在帮助初学者理解MyBatis的核心概念,并通过...

    mybatis-3.5.9-API文档-中文版.zip

    Maven坐标:org.mybatis:mybatis:3.5.9; 标签:mybatis、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,...

Global site tag (gtag.js) - Google Analytics