美文网首页
mybatis的注解开发之三种动态sql

mybatis的注解开发之三种动态sql

作者: 阿垃垃圾君 | 来源:发表于2019-12-20 10:57 被阅读0次

参考资料:https://www.cnblogs.com/guoyafenghome/p/9123442.html

1. 使用xml脚本控制

@Select("<script>select * from user <if test=\"id !=null \">where id = #{id} </if></script>")    
public List<User> findUserById(User user);

类似与在xml文件中进行配置,可读性较差

2. 使用内部类生成动态sql

@Mapper  
public interface MybatisDao {  
    //使用UserDaoProvider类的findUserById方法来生成sql  
    @SelectProvider(type = UserDaoProvider.class, method = "findUserById")  
    public List<User> findUserById(User user);  
      
    class UserDaoProvider {  
        public String findUserById(User user) {  
            String sql = "SELECT * FROM user";  
            if(user.getId()!=null){  
                sql += " where id = #{id}";  
            }  
            return sql;  
        }  
    }
}

通过字符串拼接sql,同时增改删也有对应的@InsertProvider、@UpdateProvider、@DeleteProvider

3. 使用结构化sql

public String findUserById(User user) {      
    return new SQL(){{      
        SELECT("id,name");      
        SELECT("other");      
        FROM("user");      
        if(user.getId()!=null){      
            WHERE("id = #{id}");      
        }      
        if(user.getName()!=null){      
            WHERE("name = #{name}");      
        }      
    //从这个toString可以看出,其内部使用高效的StringBuilder实现SQL拼接      
    }}.toString();      
} 

通过SQL类的结构化sql方法拼接sql,最后通过StringBuilder实现拼接

需要注意:结构化SQL从mybaits3.5.2版本开始支持LIMIT和OFFSET,需要对应的mybaits-spring-boot-starter版本不小于2.1.0

<!-- 引入mybatis -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.1</version>
</dependency>

可以通过LIMIT和OFFSET实现分页

@SelectProvider(type = OrganizationDaoProvider.class, method = "findAll")
    @Results({
        @Result(property = "organizationNo", column = "organization_no"),
        @Result(property = "organizationName", column = "organization_name"),
        @Result(property = "taxFreeType", column = "tax_free_type"),
        @Result(property = "taxFreeValue", column = "tax_free_value"),
        @Result(property = "taxFreeRate", column = "tax_free_rate"),
    })
List<Organization> findAll(int limit, int offset);

class OrganizationDaoProvider {
    public String findAll(int limit, int offset) {
        return new SQL(){{
            SELECT("*");
            SELECT("bin_to_uuid(organization_id) as organizationId");
            FROM("organization");
            if(limit > 0) {
                LIMIT(limit);
            }
            if(offset > 0) {
                OFFSET(offset);
            }
        }}.toString();
    }
}

dao调用

public List<Organization> list(int pageNum, int pageSize) {
    int limit = pageSize;
    int offset = (pageNum - 1) * pageSize;
    return organizationMapper.findAll(limit, offset);
}

相关文章

  • mybatis的注解开发之三种动态sql

    参考资料:https://www.cnblogs.com/guoyafenghome/p/9123442.html...

  • MyBatis 注解方式的基本用法

    什么是MyBatis的注解方式 MyBatis的注解方式就是将SQL语句直接写在接口上。在MyBatis注解SQL...

  • MyBatis的注解开发

    MyBatis的注解开发MyBatis的映射配置除了使用xml配置以外,还支持注解配置sql语句问题: 为什么有了...

  • MyBatis--注解式开发

    MyBatis--注解式开发 MyBatis的注解,主要是用于替换映射文件。而映射文件中无非存放着增删改查的sql...

  • Mybatis注解开发之动态SQL

    Mybatis的开发方式其实有3种: 原始Dao开发(就是把mapper接口、映射文件和实现类都一并开发) xml...

  • MyBatis基于注解开发(动态SQL)

    Emp EmpDynamic EmpDao

  • MyBatis动态SQL

    MyBatis 动态SQL 内容 Mybatis动态SQL在XML中支持的几种标签: if chose trim、...

  • MyBatis亮点

    MyBatis亮点 灵活动态的SQL语句。 强大的ORM映射功能。 提供了二级缓存。 同时支持XML和注解两种配置...

  • MyBatis核心知识点

    (1)Mybatis动态sql是做什么的?都有哪些动态sql?能简述一下动态sql的执行原理不? Mybatis动...

  • MyBatis 动态SQL(*.xml)

    原文参考MyBatis 动态SQL MyBatis的动态SQL大大减少了拼接SQL语句时候的各种格式问题,这里摘录...

网友评论

      本文标题:mybatis的注解开发之三种动态sql

      本文链接:https://www.haomeiwen.com/subject/ptbbnctx.html