JavaEE简单实例——动态SQL之基本元素<if>

简单介绍:

在开发环境中,我们经常会遇到根据不同的条件拼接SQL语句,拼接SQL语句的时候还要保证不能遗漏必要的空格、标点符号等。这时候就需要使用到MyBatis的动态SQL功能来自动帮我们拼接,检查我们的SQL语句

元素:

动态SQL是MyBatis的强大特性之一,MyBatis采用了功能强大的基于OGNL(Object Graph Navrgation Lanager,即对象导航图语言)的表达式,在MyBatis的映射文件中,开发人员可以通过动态SQL灵活组装SQL语句,这在很大程度上皮棉了但一SQL语句的反复堆砌,提高了SQL语句的复用性。

<if>:判断语句,用于单条件判断

<choose>:(<when>,<otherwise>),相当于Java中的switch…case…default语句,用于多条件判断

<where>:简化SQL语句中的where的条件判断

<set>:用于SQL语句的动态更新

<foreach>:循环语句,常用于in等举列体条件中

<trim>:可以灵活的去除多余的关键字

简单使用:<if>

<select id="唯一标识" parameterType="传入参数类型” resultType=“结果集映射的实体类">

        select * from user where 1=1 

        <if test="判断条件" >

                and 当判断条件为真的时候需要拼接的SQL代码

        </if>

</select>

需要注意的是,在现阶段,我们需要在查询语句的后面加入一个1=1来帮助我们当if标签的条件都达不到的时候依然能正确的实行查询语句,而在if标签里面的需要拼接SQL语句前面都要加入一个and来帮助我们可以正确的拼接SQL语句。

运行结果:

数据库内容:

 我们的id值是唯一的,也就是说当我们以id作为条件进行查询的时候,应该是只能查询出一条信息,我们的name字段有两个值是相同的,也就是“张三"有两个,当我们以张三进行条件进行查询的时候,应该查询出两条结果。

 首先是当我们的查询条件是id的时候,这时候应该是只能查询出一条数据:

 可以看到确实是只查询出了id为1的一条数据。

接下来我们只用name作为条件进行查询,这时候应该会查询出两条name值为张三的信息:

 

 可以看到结果确实出现了我们预想的结果,这时候我们让两个条件都放开,应该也能正常的查询出一条数据:

确实是正常出现了一条数据,说明有两个条件的查询语句也能正常的执行

代码实现:

当我们遇到这样的场景,我们查询一个数据,如果id属性不为空,那么就根据id属性来查找,如果id和姓名都不为空,那么就根据id和name两个属性来查询:

SQL映射文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="Mappers.dynamicSql">
  <select id="selectByIdOrName" parameterType="student" resultType="student">
    select * from student where 1=1
#                             当id的值不等于null并且id的值不是空字符的时候,就会拼接这个SQL语句
        <if test="id != null and id != ''">
          and id = #{id}
        </if>
#                             当name的值不等于null的时候并且name的值不是空字符串的时候,就会拼接这个SQL语句
        <if test="name != null and name != ''">
#                             注意这个地方是使用了一个concat函数将模糊匹配的百分号和参数进行拼接,在使用的时候注意这个地方不要写错
          and name like concat ('%',#{name},'%')
        </if>
  </select>
    <select id="selectAll" resultType="student">
        select * from student;
    </select>
</mapper>

接口文件:

package Mappers;

import com.mybatis.POJO.student;

import java.util.List;

public interface dynamicSql {
    List<student> selectByIdOrName(student s);
}

JOPO实体类:

package com.mybatis.POJO;

public class student {
    private int id;
    private String name;
    private String password;

    @Override
    public String toString() {
        return "student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", password='" + password + '\'' +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public student(int id, String name, String password) {
        this.id = id;
        this.name = name;
        this.password = password;
    }

    public student() {
    }
}

工具类:

package com.mybatis.POJO.Tools;

import Mappers.dynamicSql;
import Mappers.select;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

public class createSqlSession {
//    获取SqlSession对象
    public SqlSession create(){
        try {
            InputStream stream = Resources.getResourceAsStream("mybatis.xml");
            SqlSessionFactory build = new SqlSessionFactoryBuilder().build(stream);
//            在获取SqlSession对象的时候,传递一个true
            return build.openSession(true);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
//    创建的在动态SQL接口有关的对象
    public dynamicSql createdynamicSql(){
        SqlSession session = new createSqlSession().create();
        return session.getMapper(dynamicSql.class);
    }
}

测试类:

package Mappers;

import com.mybatis.POJO.Tools.createSqlSession;
import com.mybatis.POJO.student;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

public class dynamicSqlTest {
    @Test
    public void selectByIdOrName(){
        SqlSession sqlSession = new createSqlSession().create();
        dynamicSql dynamicSql = new createSqlSession().createdynamicSql();
        student s = new student();
//        s.setId(1);
        s.setName("张三");
        List<student> stu = sqlSession.selectList("Mappers.dynamicSql.selectByIdOrName", s);
        for(student student : stu){
            System.out.println(student.toString());
        }
    }
    @Test
    public void selectAll(){
        SqlSession sqlSession = new createSqlSession().create();
        dynamicSql dynamicSql = new createSqlSession().createdynamicSql();
        List<student> list = sqlSession.selectList("Mappers.dynamicSql.selectAll");
        for(student student : list){
            System.out.println(student.toString());
        }
    }
}

注意点: 

需要注意的就是在SQL映射文件中的条件判断和SQL语句的拼接,如果出现了相关的错误首选去检查是否是SQL语句拼错了或者是缺少了某些关键字。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值