MyBatis是一个流行的Java持久层框架,它可以帮助开发者轻松地操作数据库在MyBatis中,Wrapper是一种灵活且强大的查询构建方式,它允许你在动态SQL中插入额外的查询条件

Wrapper的用法可以分为以下步骤:

1.创建一个Wrapper对象
SqlWrapper wrapper = new SqlWrapper();
2.使用Wrapper对象添加查询条件
wrapper.eq(User_.age, 18) 
    .ne(User_.id, 1) 
    .gt(User_.score, 90) 
    .lt(User_.score, 100);

在上述代码中,我们使用了Wrapper对象的eq、ne、gt、lt等方法来添加查询条件。这些方法的第一个参数是字段名,第二个参数是查询条件。通过这种方式,我们可以方便地添加多个查询条件。

3.将Wrapper对象传递给Mapper方法
List<User> users = sqlSession.selectList("com.example.mapper.UserMapper.selectByWrapper", wrapper);

在上述代码中,我们将Wrapper对象作为参数传递给了sqlSession的selectList方法。该方法会根据Wrapper对象生成相应的SQL语句并执行查询操作。

4.在Mapper XML文件中定义查询语句
<select id="selectByWrapper" parameterType="com.example.wrapper.SqlWrapper" resultType="com.example.model.User"> 
SELECT * FROM user WHERE 1=1 
<include refid="wrapper"></include> 
</select>

在上述代码中,我们在Mapper XML文件中定义了一个查询语句,其中使用<include>标签引用了Wrapper对象。这样,sqlSession在执行查询操作时会自动将Wrapper对象中的查询条件添加到SQL语句中。

在MyBatis中,wrapper的链接条件关键字包括:

在MyBatis中,Wrapper对象提供了许多方法来添加查询条件。以下是常用的方法:

  1. eq: 等于条件,用于匹配等于特定值的记录。
  2. ne: 不等于条件,用于匹配不等于特定值的记录。
  3. gt: 大于条件,用于匹配大于特定值的记录。
  4. lt: 小于条件,用于匹配小于特定值的记录。
  5. ge: 大于等于条件,用于匹配大于或等于特定值的记录。
  6. le: 小于等于条件,用于匹配小于或等于特定值的记录。
  7. like: 模糊匹配条件,用于匹配包含特定子字符串的值。
  8. notLike: 模糊匹配条件,用于排除匹配包含特定子字符串的值。
  9. in: 包含条件,用于匹配在特定集合中的值。
  10. notIn: 不包含条件,用于排除匹配在特定集合中的值。
  11. between: 范围条件,用于匹配在特定范围内的值。
  12. notBetween: 范围条件,用于排除匹配在特定范围内的值。
  13. isNull: 空值条件,用于匹配空值。
  14. isNotNull: 非空值条件,用于匹配非空值。

这些链接条件关键字可以在wrapper中使用,用于设置查询条件并链接多个条件之间的关系。

MyBatis提供了多个Wrapper实现,包括SqlWrapper、MatWrapper以及其他的自定义Wrapper。每个Wrapper都有其特定的用途和特点,可以根据具体的需求选择合适的Wrappe:
  1. SqlWrapper:这是MyBatis中默认的Wrapper实现。它主要基于XML或注解来创建SQL语句,使用链式编程的方式,提供了比较全面的SQL操作方法。
  2. MatWrapper:这是MyBatis中另一个常用的Wrapper实现。它基于Java实现,使用链式编程的方式,能够快速创建SQL语句,而不需要编写大量的XML或注解代码。
  3. AbstractWrapper:这是所有Wrapper类的基类,提供了公共的方法和属性。
  4. BaseWrapper:这是所有基于XML的Wrapper类的基类,提供了XML相关的操作方法。
  5. ResultMapWrapper:这个Wrapper主要用于包装结果集,它继承自BaseWrapper,并添加了对结果集的处理方法。
  6. SelectProviderUpdateProviderDeleteProviderSelectByExampleProvider:这些是MyBatis中专门用于创建查询、更新、删除等操作的Wrapper,它们继承自BaseWrapper,并提供了相应的方法来创建SQL语句。
  7. XMLLanguageDriver:这个Wrapper主要用于包装XML语言相关的操作,它继承自BaseWrapper,并添加了对XML语言处理的方法。
  8. BlobParameterWrapper:这个Wrapper主要用于包装Blob类型的参数,它继承自BaseWrapper,并添加了对Blob类型参数的处理方法。
  9. ClobParameterWrapper:这个Wrapper主要用于包装Clob类型的参数,它继承自BaseWrapper,并添加了对Clob类型参数的处理方法。
示例:MatWrapper
MatWrapper<User> wrapper = MatWrapper.noDeleted();      
wrapper.eq("name", "Kim");       
wrapper.eq("age",20);     
List<User> users = userDao.findUsers(wrapper);


/** UserDao接口,包含一个名为findUsers的方法 */
public interface UserDao {    
    List<User> findUsers(MatWrapper<User> wrapper);    
}

/** <?xml version="1.0" encoding="UTF-8" ?> */
<mapper namespace="com.example.UserDao">    
    <select id="findUsers" parameterType="com.example.MatWrapper&lt;com.example.User&gt;" resultType="com.example.User">    
        SELECT * FROM users    
        WHERE 1=1    
        <foreach item="item" index="index" collection="wrapper">    
            AND '${item.field}' = #{item.value}    
        </foreach>    
    </select>    
</mapper>

代码分析:
MatWrapper<User> wrapper = MatWrapper.noDeleted(); 这行代码创建了一个名为wrapper的MatWrapper对象,并使用noDeleted()方法初始化它。这个方法可能是为了确保wrapper不包含任何已删除的User对象。
wrapper.eq("name", "Kim"); 这行代码在wrapper对象上调用eq方法,添加一个查询条件,即用户的名字(name字段)必须是"Kim"。
wrapper.eq("age",20); 这行代码再添加一个查询条件,即用户的年龄(age字段)必须是20。
List<User> users = userDao.findUsers(wrapper); 这行代码调用userDao对象的findUsers方法,将wrapper作为参数传递进去,然后返回满足查询条件的User对象列表。
在UserDao接口和对应的XML映射文件中:

UserDao接口包含一个名为findUsers的方法,该方法接受一个类型为MatWrapper<User>的参数,并返回一个User对象的列表。
XML映射文件与上面定义的UserDao接口相关联。它包含一个名为“findUsers”的SQL查询,该查询从“users”表中选择所有记录,其中1=1表示所有记录都被选择。然后,如果wrapper不为null,遍历wrapper并将每个条件添加到查询中。条件是“{field} = #{condition}”,其中“{field}”是遍历的字段名,“#{condition}”是相应的条件值。

通过使用Wrapper,我们可以方便地构建动态SQL语句,从而更好地适应不同的查询需求。同时,Wrapper还提供了丰富的查询条件和方法,使得编写复杂的查询语句变得更加容易。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐