Mybaits 语法细节

这篇博客主要探讨了Mybatis中like模糊查询、if标签的字符串双等号比较、处理<>号以及使用注解@Param传递多个查询条件的语法细节。作者分享了在实际开发中遇到的问题和解决方案,并提供了相关资料链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Do not go gentle into that good night

开发环境:

Eclipse 4.3  
jdk1.7.0_72  
apache-maven-3.0.4
apache-tomcat-7.0.53
spring-mvc-4.0
spring-beans-4.0
mybatis-3.2.8

在我的理解中Mybaits是一个不算是ORM的model层框架,因为其对sql操作的灵活性导致在大型开发中对其的使用率超过了Hibernate,话是这样说,但作为菜鸟的我其实也没经历过太多大型项目,只是一点个人使用的感觉,下面是一些关于Mybaits的material,第一个是官网API,第二个是某大牛的系列博文,其中对于本文主题动态语法方面也有介绍,希望能帮到大家;

【Mybaits Reference Material】
- http://mybatis.github.io/mybatis-3/
- http://www.yihaomen.com/article/java/302.htm


Mybaits3 like模糊查询匹配字符串

在mysql中可以使用 like ‘%conditionString%’ 来进行条件相关的模糊查询;
但在Mybaits的mapper文件中因为需要用到转义,所以写法有些不同;另外文末的material中提到的空格问题我在使用过程中没有遇到;

xml代码:

<if test="tradeDate!=null">
    AND TRADE_DATE like #{tradeDate,jdbcType=TIMESTAMP} '%'
</if>

这个是Mybatis的写法,在iBatis中还稍有不同,因为之前的项目中也有遇到过,故一并列举一下;
有兴趣的朋友可以研究一下;

iBatis.xml代码

<isNotEmpty property="serviceContent" prepend="and">
   mmc.servicecontent like '%$serviceContent$%'
</isNotEmpty>

不知道这个写法是否和具体环境有关,iBatis的写法在我本文的环境中无法起效;

Mybatis中if标签对于字符串使用双等号进行比较

Mybatis有个特别实用的功能,即动态查询条件的拼接;
可以在 标签中使用 进行where查询条件的拼接;
虽然方便,但因为对其语法不熟悉,所以在实际使用中还是遇到了很多问题;

在查询相关material的时候,发现网上大部分文章都是使用”!=”进行的判断,包括官方文档也是这样写的,但我这里需要使用的是双等号;

本例用到的是需要对传入的字段进行判断,如果符合查询条件即执行块中的语句;

xml代码;

<if test="returnCode == '000000'">
   AND COU.RETURN_CODE = 000000
</if>

这里表示当接入字段returnCode内容为000000时,执行块中语句;
需要注意的是,这里的单引号不能省略,我在具体使用的时候因为没有写单引号导致这条语句没有经过判断被直接执行了,这点让我很困惑,暂时还没找到原因;

另外,在文末的material中有提到这里需要将字符串使用toString()进行处理,否则会报异常,但因为我在使用中并未遇到这样的问题,这里就没有使用;

Mybaits中处理<>号

因为在mapper.xml文件中写sql,这导致了无法使用<>来进行一些数据的比较判断,故此在使用这类条件的时候需要对其进行一下转义;

xml代码;

<if test="offerDate!=null">
  AND T.OFFER_DATE &gt;=  #{offerDate,jdbcType=TIMESTAMP}
  AND T.OFFER_DATE &lt;=  #{offerDateEnd,jdbcType=TIMESTAMP}
</if>

这里的&gt; / &lt;就是在xml中对于<>的转义,英语渣的我最开始死活没记住它们的代表意义,后来一查发现非常好记:

&gt; → greater than → [>] → 大于号

&lt; → less than → [<] → 小于号

Mybatis中使用注解@Param传递多个查询条件

Mybaits的查询条件默认情况下只有两种,一种是一个map集合,另一种是一个固定的java类型,二者任选其一;

在我之前的使用中,当查询条件为多个的时候一般使用一个map集合,用条件name作为key,具体值作为value来进行查询;

前两天在查看同事代码时发现了这种使用方式,可以在Mapper.java的方法中使用@Param注解来完成多个查询条件的传递;

interface代码:

public List<TIndRepayment> selectByAppIdStage(@Param( "appId") Long appId, @Param( "repayStage")Integer repayStage);

可以看到,这个方法通过注解传递了两个参数作为查询条件,即appId 和repayStage;

xml代码:

<select id="selectByAppIdStage" resultMap="BaseResultMap" useCache="false" flushCache="true">
  select 
    <include refid="Base_Column_List" />
  from t_ind_repayment 
  where APP_ID = ${appId}
    AND  REPAY_STAGE = ${repayStage}
</select>

这里的userCache和flushCache是缓存配置,可以不管;
可以看到下面的where语句中,直接获取到了appId和repayStage作为条件进行查询;

这些就是我这两天来遇到的,有关于Mybaits的语法的一些问题;
以后在使用中还会遇到更多的问题,都会抽时间整理成类似博文,希望能对大家有所帮助;同时小弟资历尚浅,学有不足,文章中有纰漏的地方还希望多多指出;

下面是上面案例用到的material,文首列出的不在这里重复;

【Reference Material】
- http://blog.163.com/mr_liuyong/blog/static/1234243762012828540904/
- http://blog.youkuaiyun.com/dchjmichael/article/details/8860039
- http://blog.youkuaiyun.com/zheng0518/article/details/10449549
- http://my.oschina.net/u/1014212/blog/120652


【End】

04-10
<think>好的,我需要处理用户关于MyBatis的技术资料和常见问题解决的查询。首先,用户提到的引用内容涵盖了MyBatis返回行数、动态SQL、参数传递、依赖配置以及MyBatis-Plus的功能。根据这些内容,我应该整理出MyBatis的主要使用指南和常见问题。 第一步,确认用户的需求是查找使用指南或常见问题解决,可能需要分点回答。引用中有提到返回行数的问题,默认情况下MySQL返回的是匹配行数而非受影响行数,这可能导致误判。需要说明如何通过配置useAffectedRows=true来解决,或者在无法配置时的其他方法,比如检查更新内容的变化。 接下来是动态SQL部分,用户可能想知道如何正确使用if、choose等标签,避免逻辑错误。需要引用动态SQL的示例,比如在XML中如何使用<if>标签,并注意条件判断的准确性。 参数传递方面,引用中提到多参数必须使用@Param注解,否则MyBatis无法识别参数名称。需要给出示例代码,并说明在XML中如何引用参数名称,比如#{age}和#{name}。 依赖配置部分,用户可能遇到启动器或分页插件的问题。需要列出正确的依赖配置,包括MyBatis的Spring Boot启动器和PageHelper的版本,确保兼容性。 MyBatis-Plus的功能如全局ID生成策略和逻辑删除也是常见内容,需要简要说明配置方法,比如在application.properties中设置id-type和logic-delete-field。 常见问题方面,返回行数的误判、动态SQL的条件错误、参数绑定异常、依赖冲突以及逻辑删除配置都是需要强调的点。每个问题需要对应解决方案,并引用相关文献支持。 最后,生成相关问题时要覆盖用户可能进一步询问的方向,比如返回行数的具体配置步骤、动态SQL的复杂用法、参数传递的替代方法、分页插件的使用以及逻辑删除的实现细节。 需要确保回答结构清晰,分点列出使用指南和常见问题,每个部分都有对应的引用标注,并且语言简洁明了。同时,检查是否有遗漏的引用内容,确保覆盖用户提供的所有信息。</think>### MyBatis 使用指南与常见问题解决方案 #### 一、核心配置与依赖管理 1. **依赖配置** Spring Boot 中需手动添加 MyBatis 官方启动器,并注意分页插件版本兼容性: ```xml <!-- MyBatis 启动器 --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.3</version> </dependency> <!-- PageHelper 分页插件 --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.3</version> </dependency> ``` 若出现依赖冲突,需排查 JDBC 或其他 ORM 框架的版本[^4]。 2. **全局配置** MyBatis-Plus 支持全局 ID 生成策略和逻辑删除配置: ```properties # 指定 UUID 为主键生成策略 mybatis-plus.global-config.db-config.id-type=assign_uuid # 启用逻辑删除(字段名为 deleted) mybatis-plus.global-config.db-config.logic-delete-field=deleted ``` 逻辑删除需在实体类字段添加 `@TableLogic` 注解[^5]。 --- #### 二、动态 SQL 与参数绑定 1. **动态 SQL 编写** 使用 OGNL 表达式实现条件查询,避免 SQL 拼接错误: ```xml <select id="findUser" resultType="User"> SELECT * FROM user <where> <if test="name != null">AND name = #{name}</if> <if test="age > 0">AND age = #{age}</if> </where> </select> ``` 注意:`<if>` 条件需严格校验空值和范围[^2]。 2. **多参数传递** 必须通过 `@Param` 注解声明参数名称,否则 MyBatis 无法正确映射: ```java public List<User> findByAgeAndName( @Param("age") int age, @Param("name") String name ); ``` XML 中引用参数时需使用 `#{age}` 而非 `#{param1}`[^3]。 --- #### 三、常见问题与解决方案 1. **返回行数误判** - **问题**:MySQL 默认返回匹配行数(如 UPDATE 未实际修改数据时返回 0)。 - **解决**:在 JDBC URL 添加 `useAffectedRows=true`,强制返回受影响行数: ```properties spring.datasource.url=jdbc:mysql://localhost:3306/test?useAffectedRows=true ``` 若无法修改配置,需在代码中额外校验数据变更[^1]。 2. **参数绑定异常** - **问题**:未使用 `@Param` 导致参数名称为 `arg0`、`arg1`,与 XML 不匹配。 - **解决**:显式声明参数名或改用 `Map` 封装参数[^3]。 3. **动态 SQL 条件失效** - **问题**:`<if test="status">` 误判为 `false`(当 `status=0` 时)。 - **解决**:使用 `!= null` 或明确判断值范围,如 `<if test="status != null">`[^2]。 --- #### 四、性能优化技巧 1. **批量操作** 使用 `SqlSession` 的 `BATCH` 执行模式提升插入/更新效率: ```java SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH); UserMapper mapper = sqlSession.getMapper(UserMapper.class); for (User user : userList) { mapper.insert(user); } sqlSession.commit(); ``` 2. **缓存配置** 启用二级缓存减少数据库查询: ```xml <cache eviction="LRU" flushInterval="60000" size="512"/> ``` --- 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值