简单介绍:

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

元素:

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

:判断语句,用于单条件判断

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

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

:用于SQL语句的动态更新

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

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

简单使用:

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

运行结果:

数据库内容:

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

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

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

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

 

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

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

代码实现:

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

SQL映射文件:

PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

接口文件:

package Mappers;

import com.mybatis.POJO.student;

import java.util.List;

public interface dynamicSql {

List 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 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 list = sqlSession.selectList("Mappers.dynamicSql.selectAll");

for(student student : list){

System.out.println(student.toString());

}

}

}

注意点: 

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

相关文章

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。