MyBatis 是一个优秀的持久层框架,它简化了数据库操作的代码量,并且提供了灵活的数据映射机制。在 MyBatis 中,传参方式主要有两种:单个参数传递和多个参数传递。此外,MyBatis 还支持动态 SQL,这是一种构建 SQL 查询的强大工具。
单个参数传递
当只需要传递一个参数给 SQL 语句时,可以直接将该参数作为方法的参数。例如,如果有一个查询用户信息的方法需要通过用户的 ID 来获取信息,可以这样定义方法:
User getUserById(int id);
在对应的 XML 映射文件中,可以直接使用 #{id}
来引用这个参数:
<select id="getUserById" resultType="com.example.User">
SELECT * FROM users WHERE id = #{id}
</select>
多个参数传递
当需要传递多个参数时,可以使用以下几种方式:
- 使用 Map:可以将多个参数封装到一个
Map
对象中,然后在 SQL 语句中通过键名来引用这些参数。
User getUserByIdAndName(Map<String, Object> params);
在 XML 文件中:
<select id="getUserByIdAndName" resultType="com.example.User">
SELECT * FROM users WHERE id = #{id} AND name = #{name}
</select>
- 使用注解 @Param:如果不想使用
Map
,也可以为每个参数添加@Param
注解来指定参数名称。
User getUserByIdAndName(@Param("id") int id, @Param("name") String name);
在 XML 文件中的使用与上面相同。
动态 SQL
动态 SQL 是 MyBatis 的一大特色,它允许根据条件动态地构建 SQL 语句。这通常用于复杂的查询条件,如可选的搜索过滤器等。MyBatis 提供了几种标签来实现动态 SQL:
- if:根据条件包含或排除 SQL 片段。
- choose (when, otherwise):类似于 Java 的 switch 语句,提供了一种选择结构。
- where:自动处理 WHERE 关键字和 AND/OR 开头的问题。
- set:用于更新语句,自动处理逗号分隔符。
- foreach:用于处理集合,常用于 IN 子句。
示例:使用 if 标签构建动态查询
假设我们需要根据用户输入的条件(可能是用户名、邮箱或者两者都有)来查询用户,可以这样做:
<select id="findUsers" resultType="com.example.User">
SELECT * FROM users
<where>
<if test="name != null">
AND name = #{name}
</if>
<if test="email != null">
AND email = #{email}
</if>
</where>
</select>
在这个例子中,只有当 name
或 email
参数不为空时,相应的条件才会被加入到 SQL 语句中。