MyBatis sql 动态条件查询写法案例

1.对于从多个条件中选择一个的单条件查询的场景,利用分支嵌套就可以实现动态选择单条件:

在MyBatis的Mapper代理中,<choose>相当于switch,<when>相当于case

<select id="selByCondition2" resultMap="rm">
    select *
    from mybatis where
    <choose>
        <when test="status !=null">
            STATUS=#{STATUS}
        </when>
        <when test="companyName !=null and companyName !=''">
            company_name like #{companyName}
        </when>
        <when test="bracdName !=null and bracdName !=''">
            bracd_name like #{bracdName}
        </when>
        <otherwise>1=1</otherwise>
    </choose>
</select>

与多条件查询不同的是,SQL语句中只会有一个分支生效

当用户一个条件都不选时,可以在<otherwise>中写上1=1让语法成立,反之,若选择了条件则会返回正常结果

2.<select id="selByCondition" resultMap="rm">
    select *
    from mybatis
<where>
    <if test="status !=null">
       and STATUS=#{STATUS}
    </if>
    <if test="companyName !=null and companyName !=''">
    and company_name like #{companyName}
    </if>
    <if test="bracdName !=null and bracdName !=''">
    and bracd_name like #{bracdName}
    </if>
    </where>
</select>

<where>标签可以自动帮我们去掉and;另外一种写法是不使用<where>标签,通过where 1 = 1来实现

### MyBatis 常见写法及使用方法 #### 动态 SQL 构建 MyBatis 提供了一种灵活的方式来处理动态 SQL 需求,其中 `<if>` 标签用于根据条件动态拼接 SQL 语句[^1]。这种特性使得开发者可以根据不同的业务逻辑生成对应的查询语句。 以下是基于 `<if>` 标签的一个简单示例: ```xml <select id="getStudentList_if" parameterType="StudentEntity" resultType="Student"> SELECT * FROM student WHERE 1=1 <if test="name != null and name != '' "> AND name = #{name} </if> <if test="age != null"> AND age = #{age} </if> </select> ``` 上述代码展示了如何利用 `<if>` 来动态添加 `WHERE` 子句中的条件。 --- #### 自动生成主键并返回 在实际开发中,自动生成主键是一个常见的需求。对于 Oracle 数据库通常会借助序列来完成此操作;而对于 MySQL,则可以通过内置函数实现自动增长字段的功能[^2]。为了支持这些场景下的主键回传,MyBatis 提供了 `<selectKey>` 标签。 下面分别展示针对不同数据库类型的配置方式: ##### **适用于 Oracle** ```xml <insert id="insertWithSequence" parameterType="User"> <selectKey keyProperty="id" resultType="int" order="BEFORE"> SELECT user_seq.NEXTVAL FROM dual </selectKey> INSERT INTO users (id, username, password) VALUES (#{id}, #{username}, #{password}) </insert> ``` 此处定义了一个名为 `user_seq` 的序列作为新记录 ID 的来源,并将其赋值给对象属性 `id`。 ##### **适用于 MySQL** ```xml <insert id="insertAutoIncrement" useGeneratedKeys="true" keyProperty="id" parameterType="User"> INSERT INTO users (username, password) VALUES (#{username}, #{password}) </insert> ``` 这里启用了 JDBC 自动获取生成的主键功能 (`useGeneratedKeys`) 并指定目标列名映射到实体类成员变量上。 --- #### 调用 Mapper 方法执行查询 当完成了 XML 文件内的 SQL 定义之后,就可以通过调用相应的 Mapper 接口来进行数据交互。例如以下 Java 代码片段演示了如何加载学生列表: ```java // 获取 Student 列表实例化 mapper 对象后即可直接调用其 getStudentList_if 方法传递参数 entity 实现复杂筛选。 List<Student> list = this.dynamicSqlMapper.getStudentList_if(entity); System.out.println(list.size()); ``` 这段程序说明了如何将封装好的请求参数提交至后台服务从而获得满足特定约束的结果集[^3]。 --- ### 总结 以上介绍了三种典型的 MyBatis 应用模式——动态 SQL、主键管理以及基本 CRUD 操作的具体实践案例。每一种都体现了框架的强大灵活性及其对多样化应用场景的支持能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值