【Mybatis】Mybatis使用日期类型参数作为where查询条件遇到的一点小坑

@Data
public class Work {
    private Employee employee;
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date workTime;
    private Date startTime;
    private Date endTime;
    private Integer status;
}

在写修改Work表里的status条件语句的时候,因为这张表中employeeId和workTime均为主键,所以需要将date类型参数作为查询条件。

<update id="updateWorkTime" parameterType="com.alone.hotel.entity.Work" >
        update tb_work
        <set>
            <if test="startTime != null ">start_time = #{startTime},</if>
            <if test="endTime != null ">end_time = #{endTime},</if>
            <if test="status != null ">status = #{status},</if>
        </set>
        where employee_id = #{employee.employeeId} and work_time = #{workTime}
    </update>

写出上面的语句之后发现影响行数始终为0,修改未成功。
查了一晚上发现,需要将where条件修改为:
where employee_id = #{employee.employeeId} and work_time = date(#{workTime})
mybatis接收参数也挺特殊的,一般格式为:#{param,jdbcType=VARCHAR}

Mark

<think>好的,用户现在问的是“怎么学好MyBatis”。之前他问过是否需要单独写MyBatis的配置类,我之前已经解释了Spring Boot中的自动配置,以及什么时候需要手动配置。现在他想知道如何学好MyBatis,可能需要一个学习路径或者方法。 首先,我需要考虑用户可能的背景。他可能已经有一定的Java和Spring Boot基础,因为之前的问题是关于MyBatis在Spring Boot中的配置。但可能对MyBatis本身还不够熟悉,想系统学习。 用户的需求不仅仅是学会使用MyBatis,而是“学好”,所以需要涵盖从基础到高级的内容,包括最佳实践、常见问题解决、源码理解等。需要分步骤,结构清晰,有实操建议。 可能需要包括以下几个方面: 1. **基础学习**:掌握MyBatis的核心概念,比如SqlSessionFactory、Mapper接口、XML映射文件等。用户可能已经知道一些,但需要系统梳理。 2. **实际操作**:通过项目练习,比如CRUD操作,动态SQL使用,关联查询等。 3. **与Spring整合**:虽然之前提过Spring Boot的自动配置,但这里可能需要更深入,比如事务管理、整合配置等。 4. **高级特性**:插件开发、缓存机制、批处理等,这些是提升技能的关键。 5. **源码和原理**:理解内部机制,帮助解决复杂问题。 6. **最佳实践和社区资源**:学习如何高效使用,避免常见错误,参与社区讨论。 还要注意用户可能对某些概念不太清楚,比如动态SQL、缓存配置,需要给出具体例子。同时,建议学习资源,比如官方文档、书籍、在线课程,以及实践项目的重要性。 另外,用户之前的问题涉及到配置类,可能在项目中遇到过配置问题,所以学习过程中要强调配置的不同方式,尤其是XML和注解的对比,以及如何选择。 还要提醒用户注意常见的坑,比如N+1查询问题,缓存配置不当导致的脏数据,事务管理问题等,这些都是在实际开发中容易遇到的,需要重点掌握解决方案。 最后,总结学习路径,鼓励持续实践和参与社区,保持学习动力。要</think>学好 MyBatis,需要结合理论学习和实践操作,并逐步深入其核心机制。以下是系统的学习路径和建议: --- ### **1. 基础入门** #### **核心概念理解** - **ORM 框架是什么**:理解 MyBatis 作为半自动 ORM 框架的特点(灵活性强,SQL 可控)。 - **核心组件**: - `SqlSessionFactory`:MyBatis 的入口,用于创建 `SqlSession`。 - `SqlSession`:与数据库交互的核心对象。 - `Mapper` 接口:通过接口绑定 SQL 映射(XML 或注解)。 - 映射文件(`Mapper.xml`):定义 SQL 语句和结果映射。 #### **基础配置** - **XML 配置**:学习 `mybatis-config.xml` 的配置(数据源、事务、类型别名等)。 - **Spring Boot 整合**:利用 `application.properties` 简化配置(如之前问题所述)。 #### **简单实践** - 实现一个 **CRUD 示例**,例如用户表的增删改查。 - 对比 XML 和注解两种 SQL 定义方式的差异。 --- ### **2. 进阶技能** #### **动态 SQL** - 掌握 `<if>`, `<choose>`, `<foreach>` 等动态 SQL 标签。 - 示例:根据条件动态拼接查询语句。 ```xml <select id="findUsers" resultType="User"> SELECT * FROM user <where> <if test="name != null">AND name = #{name}</if> <if test="age != null">AND age = #{age}</if> </where> </select> ``` #### **关联查询与结果映射** - 学习一对一、一对多关联查询(如用户和订单的关系)。 - 使用 `<resultMap>` 定义复杂结果集映射。 ```xml <resultMap id="userWithOrders" type="User"> <id property="id" column="user_id"/> <collection property="orders" ofType="Order"> <id property="orderId" column="order_id"/> </collection> </resultMap> ``` #### **事务管理** - 理解 MyBatis 如何与 Spring 事务结合(如 `@Transactional` 注解的使用)。 --- ### **3. 高级特性** #### **插件开发(Interceptor)** - 学习编写自定义插件,实现 SQL 日志打印、分页逻辑等。 - 示例:统计 SQL 执行时间: ```java @Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})}) public class SqlTimeInterceptor implements Interceptor { @Override public Object intercept(Invocation invocation) throws Throwable { long start = System.currentTimeMillis(); Object result = invocation.proceed(); System.out.println("SQL 执行耗时:" + (System.currentTimeMillis() - start) + "ms"); return result; } } ``` #### **缓存机制** - **一级缓存**:默认开启的 `SqlSession` 级别缓存。 - **二级缓存**:需手动配置的 `Mapper` 级别缓存,理解缓存失效场景。 - 配置示例: ```xml <cache eviction="LRU" flushInterval="60000" size="512"/> ``` #### **批处理与性能优化** - 使用 `SqlSession` 的 `BATCH` 执行器提升批量操作性能。 - 示例: ```java SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH); UserMapper mapper = sqlSession.getMapper(UserMapper.class); for (User user : userList) { mapper.insert(user); } sqlSession.commit(); ``` --- ### **4. 源码与原理** - **启动流程**:分析 `SqlSessionFactoryBuilder` 如何解析配置文件和映射。 - **SQL 执行过程**:跟踪 `MapperProxy` 动态代理的实现。 - **插件机制**:理解责任链模式在插件中的应用。 --- ### **5. 最佳实践与避坑** #### **常见问题** 1. **N+1 查询问题**:在关联查询使用懒加载或联合查询优化。 2. **参数绑定错误**:区分 `#{}`(预编译防 SQL 注入)和 `${}`(直接替换)。 3. **事务失效场景**:Spring 事务与 MyBatis 的整合注意事项。 #### **代码规范** - SQL 统一写在 XML 中,保持与 Java 代码解耦。 - 使用 `PageHelper` 等插件简化分页逻辑。 --- ### **6. 学习资源** 1. **官方文档**:[MyBatis 官方文档](https://mybatis.org/mybatis-3/zh/index.html)(必读)。 2. **书籍推荐**: - 《MyBatis 从入门到精通》 - 《MyBatis 技术内幕》 3. **实战项目**: - 实现一个包含权限管理、复杂查询的小型系统。 - 尝试将现有 JDBC 项目迁移到 MyBatis。 4. **社区与源码**: - 阅读 MyBatis 源码(从 `SqlSessionFactoryBuilder` 开始)。 - 参与 GitHub 上的 Issue 讨论或 Stack Overflow 解答。 --- ### **总结** - **理论 + 实践**:通过小项目验证每个知识点。 - **深入源码**:理解原理后能更好地解决复杂问题。 - **持续积累**:关注 MyBatis 的版本更新(如 MyBatis 3 的新特性)。 通过以上步骤,逐步从“会用”过渡到“精通”,最终能够在实际项目中灵活应对复杂场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值