Mybatis update时判断为空的写法和like的写法

本文介绍了一个使用MyBatis动态SQL进行更新操作的例子,展示了如何根据不同的条件更新customcalendarinfo表中的多个字段,如pduname、name、start等。
update zendtao_new.customcalendarinfo a
<set>
    <if test="pdu != null">
        a.pduname = #{pdu,jdbcType=VARCHAR},
    </if>
    <if test="name != null">
        a.name = #{name,jdbcType=VARCHAR},
    </if>
    <if test="start != null">
        a.start = #{start,jdbcType=VARCHAR},
    </if>
    <if test="end != null">
        a.end = #{end,jdbcType=VARCHAR},
    </if>
    <if test="title != null">
        a.title = #{title,jdbcType=VARCHAR},
    </if>
    <if test="url != null">
        a.url = #{url,jdbcType=VARCHAR},
    </if>
    <if test="env != null">
        a.env = #{env,jdbcType=VARCHAR},
    </if>
</set>
where
a.relativeguid = #{guid,jdbcType=VARCHAR}
and
a.name like CONCAT('%',#{symbol,jdbcType=VARCHAR},'%')
<think> 我们正在讨论MyBatisHibernate在Service层Mapper/DAO层的写法区别。 根据引用内容,我们知道MyBatis是一个半自动ORM框架,需要编写SQL(通过XML或注解),而Hibernate是一个全自动ORM框架,通常使用HQL或Criteria API,也可以使用JPA接口。 下面我们分层次讨论: 1. Mapper层(MyBatis) vs DAO层(Hibernate): - MyBatis:我们需要定义Mapper接口,然后在XML文件(或注解)中编写具体的SQL语句。Mapper接口的方法与XML中的SQL语句通过方法名或注解进行映射。 - Hibernate:在传统的Hibernate中,我们通常会编写DAO层,使用Hibernate的SessionFactory来操作。在JPA风格中,我们使用EntityManagerRepository(通过继承HibernateTemplate或使用JPA的EntityManager)。在Spring Data JPA中,我们可以直接定义接口,由Spring自动实现。 2. Service层: - 在Service层,两者都可以使用事务管理。区别在于调用数据访问层的方式不同。 - MyBatis的Service层会注入Mapper接口,然后调用Mapper的方法执行SQL。 - Hibernate的Service层会注入DAO或者Repository(在Spring Data JPA中)来执行数据库操作。 3. 具体写法示例: 我们以查询用户为例。 MyBatis写法: 第一步:定义Mapper接口 ```java public interface UserMapper { User selectUserById(int id); } ``` 第二步:在XML中编写SQL(或使用注解) ```xml <select id="selectUserById" resultType="User"> SELECT * FROM user WHERE id = #{id} </select> ``` 第三步:在Service中注入Mapper并调用 ```java @Service public class UserService { @Autowired private UserMapper userMapper; public User getUserById(int id) { return userMapper.selectUserById(id); } } ``` Hibernate(传统方式)写法: 第一步:定义DAO接口实现 ```java public interface UserDao { User findById(int id); } @Repository public class UserDaoImpl implements UserDao { @Autowired private SessionFactory sessionFactory; @Override public User findById(int id) { Session session = sessionFactory.getCurrentSession(); return session.get(User.class, id); } } ``` 第二步:Service层调用DAO ```java @Service public class UserService { @Autowired private UserDao userDao; public User getUserById(int id) { return userDao.findById(id); } } ``` Hibernate(使用Spring Data JPA)写法: 第一步:定义Repository接口(无需实现) ```java public interface UserRepository extends JpaRepository<User, Integer> { // 可以直接使用继承的方法,如findById } ``` 第二步:Service层调用Repository ```java @Service public class UserService { @Autowired private UserRepository userRepository; public User getUserById(int id) { return userRepository.findById(id).orElse(null); } } ``` 4. 主要区别总结: - MyBatis需要显式编写SQL,控制更灵活,适合复杂SQL场景。 - Hibernate(传统)需要编写DAO实现类,使用Hibernate API操作。 - Spring Data JPA则更加简洁,只需要定义接口,方法名遵循规范即可,几乎不用写实现。 5. 性能方面: - MyBatis由于直接写SQL,可以针对性地优化。 - Hibernate的HQL或Criteria可能会生成不够高效的SQL,但通过调整也可以优化。 6. 开发效率: - 对于简单的CRUD,Spring Data JPA(基于Hibernate)开发效率更高。 - 对于复杂查询,MyBatis虽然需要手写SQL,但更可控。 7. 事务管理:两者都可以使用Spring的声明式事务管理(@Transactional)。 最后注意:MyBatis-Plus进一步简化了MyBatis的开发,提供了很多内置方法,类似于Spring Data JPA的自动实现,但底层仍然是MyBatis。 希望以上解释能帮助你理解两者的区别。 </think> ### MyBatis与Hibernate在ServiceMapper/DAO层的写法区别详解 #### 一、**Mapper层(MyBatis) vs DAO层(Hibernate)** 1. **MyBatis的Mapper层** - 需显式定义SQL语句(XML或注解) - Mapper接口仅声明方法签名: ```java public interface UserMapper { // 注解方式SQL @Select("SELECT * FROM user WHERE id = #{id}") User selectById(int id); // XML方式SQL(对应UserMapper.xml) List<User> selectByCondition(UserCondition cond); } ``` - XML文件需精确映射SQL与对象: ```xml <select id="selectByCondition" resultType="User"> SELECT * FROM user WHERE name LIKE #{name} AND age > #{minAge} </select> ``` 2. **Hibernate的DAO层** - **传统Hibernate**:直接操作`Session` API ```java public class UserDaoImpl { public User findById(int id) { Session session = sessionFactory.getCurrentSession(); return session.get(User.class, id); // 无需SQL } } ``` - **JPA风格**:通过`EntityManager`或Spring Data JPA ```java public interface UserRepository extends JpaRepository<User, Integer> { // 自动实现方法:根据方法名生成查询 List<User> findByNameContaining(String keyword); } ``` --- #### 二、**Service层写法差异** 1. **MyBatis的Service层** - 需手动注入Mapper并调用SQL方法: ```java @Service public class UserService { @Autowired private UserMapper userMapper; // 注入Mapper public User getUserWithOrders(int userId) { User user = userMapper.selectById(userId); // 需手动处理关联查询(如订单) user.setOrders(orderMapper.selectByUserId(userId)); return user; } } ``` 2. **Hibernate的Service层** - 直接操作对象,关联查询自动处理: ```java @Service public class UserService { @Autowired private UserRepository userRepo; // 注入Repository @Transactional // 事务管理更简单 public User getUserWithOrders(int userId) { User user = userRepo.findById(userId).orElse(null); // 关联数据自动加载(需配置@OneToMany) Hibernate.initialize(user.getOrders()); return user; } } ``` --- #### 三、**核心区别总结** | **维度** | **MyBatis** | **Hibernate** | |------------------|----------------------------------------|----------------------------------------| | **SQL控制** | 需显式编写所有SQL | 自动生成SQL,可覆盖优化 | | **对象关联** | 手动处理嵌套查询(N+1问题需注意) | 自动加载关联(`@OneToMany`等注解) | | **事务管理** | 需手动处理复杂事务边界 | 声明式事务更便捷(`@Transactional`) | | **开发效率** | 灵活但冗余代码多 | 简单CRUD效率高,复杂SQL需HQL/Criteria | | **性能优化** | SQL级精准控制 | 需注意缓存懒加载策略 | | **适用场景** | 复杂SQL、遗留数据库结构 | 领域模型驱动、快速迭代 | --- #### 四、**典型场景对比** **场景:更新用户状态** - **MyBatis实现**: ```java // Service层 public void updateStatus(int userId, String status) { userMapper.updateStatus(userId, status); // 调用Mapper方法 logMapper.insertLog(userId, "STATUS_CHANGED"); // 需显式记录日志 } ``` ```xml <!-- Mapper XML --> <update id="updateStatus"> UPDATE user SET status = #{status} WHERE id = #{userId} </update> ``` - **Hibernate实现**: ```java @Transactional public void updateStatus(int userId, String status) { User user = userRepo.findById(userId).orElseThrow(); user.setStatus(status); // 直接修改对象 // 通过事件监听自动记录日志(@PostUpdate) } ``` > **关键区别**: > MyBatis强调**过程式SQL操作**,Hibernate偏向**对象状态管理**。MyBatis需手动维护每个数据变更步骤,而Hibernate通过对象生命周期自动触发关联操作[^1][^2]。 --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值