IDEA JavaMybatis动态sql

Sql语句在开发时很多时候都是不固定的,所以Mybatis应要求就有了动态sql语句。sql的内容是变化的,可以根据条件获取到不同的sql语句。主要是where部分发生变化。动态sql的实现,使用的是mybatis提供的标签, <if> ,<where>,<foreach>

1、<if>标签的使用:<if>是判断条件的

   语法:

<if test="判断java对象的属性值">

            部分sql语句

 </if>

    Dao:

 public List<Student> selectStudentIf(Student student);

    mapper文件中:

注:test写的是判断的内容

<select id="selectStudentIf" resultType="com.gx.pojo.Student">
    select * from student
    where 1=1
    <if test="name != null and name != ''">
        and name=#{name}
    </if>
    <if test="age > 0">
        or age>#{age}
    </if>
</select>

    测试:

public void testSelectStudentIf(){
    //获取SqlSession对象
    SqlSession sqlSession = MyBatisUtil.getSqlSession();
    //使用mybatis动态代理
    StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
    //准备参数
    Student student = new Student();
    student.setName("鲁班大师");
    student.setAge(18);
    //执行
    List<Student> students = studentDao.selectStudentIf(student);
    //关闭SqlSession
    sqlSession.close();
    //遍历输出
    for(Student stu : students){
        System.out.println("if查询的学生="+stu);
    }
}

    结果:

    使用<if>存在缺陷,会造成sql语句错误,1=1是为了弥补缺陷的<where>标签也可以弥补该缺陷
例如:select student_id,name,sex,age,email from student or age> ?

 

2、<where>标签的使用:<where> 用来包含 多个<if>的, 当多个if有一个成立的, <where>会自动增加一个where关键字,并去掉 if中多余的 and ,or等。

语法:

<where>

                 多个<if>标签
</where>

Dao:

                  

public List<Student> selectStudentWhere(Student student);

mapper文件中:

<select id="selectStudentWhere" resultType="com.gx.pojo.Student">
    select * from student
    <where>
        <if test="name != null and name != ''">
            name=#{name}
        </if>
        <if test="age>0">
            or age>#{age}
        </if>
    </where>
</select>

测试:

public void testSelectStudentWhere(){
    //获取SqlSession对象
    SqlSession sqlSession = MyBatisUtil.getSqlSession();
    //使用mybatis动态代理
    StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
    //准备参数
    Student student = new Student();
    student.setName("鲁班大师");
    student.setAge(18);
    //执行
    List<Student> students = studentDao.selectStudentWhere(student);
    //关闭SqlSession
    sqlSession.close();
    //遍历输出
    for(Student stu : students){
        System.out.println("where查询的学生="+stu);
    }
}

结果:

3、<foreach>标签的使用:

<foreach> 循环java中的数组,list集合的。主要用在sql的in语句中。

例如查询:学生id是 1001,1002,1003的三个学生。

语法:

注:

collection:指定循环的类型,数组类型用array,list集合类型用list
item:自定义,代表数组或集合的成员变量
open:循坏开始拼接的字符
close:循环结束拼接的字符
separator:成员之间的分隔符

也可以传入java对象,#{item值 . 属性名称}

 

<foreach collection="list" item="myId" open="(" close=")" separator=",">
    #{myId}
</foreach>

Dao:

                  

public List<Student> selectStudentForeachOne(List<Integer> idList);

mapper文件中:

<select id="selectStudentForeachOne" resultType="com.gx.pojo.Student">
    select * from student where student_id in
    <foreach collection="list" item="myId" open="(" close=")" separator=",">
        #{myId}
    </foreach>
</select>

 

测试:

public void testSelectStudentForeachOne(){
    //获取SqlSession对象
    SqlSession sqlSession = MyBatisUtil.getSqlSession();
    //使用mybatis动态代理
    StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
    //准备参数
    List<Integer> idList = new ArrayList<>();
    idList.add(1002);
    idList.add(1003);
    idList.add(1004);
    //执行
    List<Student> listStudent = studentDao.selectStudentForeachOne(idList);
    //关闭SqlSession
    sqlSession.close();
    //遍历循环
    for(Student stu : listStudent){
        System.out.println("ForeachOne查询学生="+stu);
    }
}

 

结果:

<foreach>标签可以使用的很灵活,例如不需要open="(" close=")" separator=","这三个属性,直接在sql语句中拼接也是可以的,脑洞有多大使用就有多广。

### 回答1: Mybatis是一种流行的Java持久化框架,它通过提供一个简单的编程模型和动态SQL实现了将关系型数据库和对象映射起来的功能。在使用Mybatis时,SQL语句是至关重要的,因为它们是从数据库中检索数据的载体。在编写SQL时,我们会遇到黄线,这通常表示SQL语句有一些问题,需要我们检查和修复。 一些可能导致黄线出现的原因包括语法错误、参数类型不匹配、表或字段名称拼写错误等等。为了解决这些问题,我们可以通过查看错误消息、仔细检查代码、使用MySQL客户端工具等方法来排除问题。除此之外,我们还可以利用Mybatis提供的日志和调试功能来定位并解决黄线问题。 总之,黄线是Mybatis中SQL编写过程中常遇到的一些问题,我们需要借助工具和技巧来解决它们,以确保我们能够从数据库中正确地检索到数据。 ### 回答2: Mybatis是一种优秀的持久层框架,它能够极大地简化我们在Java应用中使用SQL的代码工作,同样让DBA更加容易管理SQL语句。而黄色的线是Mybatis SQL Mapper XML中的一种标记,它的作用是分隔不同的SQL语句,让SQL语句更容易阅读和维护。 在Mybatis SQL Mapper XML中,我们可以使用“<sql>”标签来定义一个SQL片段,然后在其他SQL语句中使用“<include>”标签来导入这个SQL片段。这样的好处在于提高了SQL语句的可读性和可维护性,同时也减少了代码的冗余。 黄线在Mybatis SQL Mapper XML中的作用类似于语法高亮,使得我们能够更容易地看清SQL语句的各个部分,从而更好地理解SQL语句的含义。它是Mybatis团队为开发人员提供更好的开发体验而设计的。 因此,使用Mybatis框架可以有效地提高Java应用的开发效率和可维护性。而黄线则是Mybatis框架中的一个重要特性,可以让我们更加方便地进行SQL开发、理解和维护。 ### 回答3: Idea是一种常见的Java IDE,它对于Java项目的开发和调试都非常方便。MyBatis是一种Java持久层框架,它提供了一种简单而强大的方式来访问数据库。SQL则是一种结构化查询语言,用于对数据库进行操作。然而,在使用Idea开发MyBatis项目时,可能会遇到黄线的问题。 黄线通常表示Idea对于某些代码的警告或错误提示。在MyBatis中,使用XML文件来配置SQL语句,如果XML文件中出现了错误,Idea就会在该处添加黄色的波浪线。这时需要仔细检查XML文件的语法,确保没有错误。 另外,黄线还可能表示了代码中存在潜在的问题。例如,可能使用了过时的方法或类,或者变量没有被正确地初始化。在这种情况下,需要检查代码并进行修复,以避免潜在的错误和异常。 总之,当我们在使用Idea开发MyBatis项目时遇到黄线问题时,需要认真检查代码和XML文件,并且修复其中存在的问题。这样可以确保项目的正确性和稳定性,使得我们能够更好地完成Java项目的开发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值