MyBatis是一种优秀的持久层框架,它不仅方便使用,而且提供了多种注入参数的方式。
一、基本参数注入方式
MyBatis最基本的参数注入方式是使用$或#作为占位符,在SQL语句中引用Java对象的属性名或方法名。例如:
<select id="findByName" parameterType="java.lang.String" resultType="com.example.User">
SELECT * FROM user WHERE name = #{name}
</select>
其中#{name}是一个参数占位符,它将会被Java对象的getName()方法所替换。
二、动态SQL参数注入方式
MyBatis还提供了一种灵活的参数注入方式,即动态SQL语句。动态SQL语句允许我们使用if、choose、when、otherwise、foreach等语句来创建SQL语句。
<select id="findUsers" parameterType="map" resultType="com.example.User">
SELECT * FROM user
<where>
<if test="name != null">
AND name like '%${name}%'
</if>
<if test="age != null">
AND age = #{age}
</if>
<if test="idList != null">
AND id IN
<foreach item="id" collection="idList" separator=",">
#{id}
</foreach>
</if>
</where>
</select>
在这个例子中,我们使用了if语句检查参数是否为空,并且使用foreach语句遍历参数集合。这种动态构建SQL语句的方式,可以极大地增强MyBatis的灵活性。
三、参数类型别名
MyBatis提供了一种简便的方式来为Java类型创建别名。通过为Java类型创建别名,我们可以为它们使用比较短的、易于理解的名称。
<typeAliases>
<typeAlias type="com.example.User" alias="User" />
</typeAliases>
在这个例子中,我们为com.example.User类型创建了一个别名User。这样,我们就可以在XML文件中使用User作为这个类型的引用名称。
四、参数处理器
MyBatis默认情况下,会根据参数的类型来自动匹配SQL语句中的占位符。如果需要,我们可以为特定的参数类型提供自定义的参数处理器,从而灵活地处理参数。
public class UserHandler extends BaseTypeHandler<User> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, User parameter, JdbcType jdbcType) throws SQLException {
ps.setInt(i, parameter.getId());
ps.setString(i + 1, parameter.getName());
ps.setInt(i + 2, parameter.getAge());
}
@Override
public User getNullableResult(ResultSet rs, String columnName) throws SQLException {
return new User(rs.getInt(columnName), rs.getString("name"), rs.getInt("age"));
}
@Override
public User getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return new User(rs.getInt(columnIndex), rs.getString("name"), rs.getInt("age"));
}
@Override
public User getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return new User(cs.getInt(columnIndex), cs.getString("name"), cs.getInt("age"));
}
}
在这个例子中,我们创建了一个UserHandler参数处理器,它将Java对象映射到SQL语句中的参数,并且将SQL语句中的结果映射成Java对象。
五、参数Map
MyBatis还支持将参数集合封装成一个Map,从而方便地传递多个参数。
<select id="findUsersByMap" resultType="com.example.User">
SELECT * FROM user WHERE name = #{name} AND age = #{age}
</select>
在这个例子中,我们将参数封装成了一个Map,从而实现了简单、方便的参数传递。
六、@Param注解
如果MyBatis无法自动匹配SQL语句中的参数占位符,我们可以使用@Param注解来明确地指定参数名称。
<select id="findUsersByParams" resultType="com.example.User">
SELECT * FROM user WHERE name = #{userName} AND age = #{userAge}
</select>
public List<User> findUsersByParams(@Param("userName") String name, @Param("userAge") int age);
在这个例子中,我们使用@Param注解为方法参数明确指定了参数名称。
七、结语
MyBatis提供了多种注入参数的方式,从基本参数注入到动态SQL构建,从参数类型别名到自定义参数处理器,每一种方式都可以满足特定的开发需求。在使用MyBatis的过程中,我们应该选择合适的方式,从而简化参数传递、提高开发效率。