简单介绍:
在开发环境中,我们经常会遇到根据不同的条件拼接SQL语句,拼接SQL语句的时候还要保证不能遗漏必要的空格、标点符号等。这时候就需要使用到MyBatis的动态SQL功能来自动帮我们拼接,检查我们的SQL语句
元素:
动态SQL是MyBatis的强大特性之一,MyBatis采用了功能强大的基于OGNL(Object Graph Navrgation Lanager,即对象导航图语言)的表达式,在MyBatis的映射文件中,开发人员可以通过动态SQL灵活组装SQL语句,这在很大程度上皮棉了但一SQL语句的反复堆砌,提高了SQL语句的复用性。
简单使用:
select * from user where 1=1
and 当判断条件为真的时候需要拼接的SQL代码
需要注意的是,在现阶段,我们需要在查询语句的后面加入一个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">
select * from student where 1=1
# 当id的值不等于null并且id的值不是空字符的时候,就会拼接这个SQL语句
and id = #{id}
# 当name的值不等于null的时候并且name的值不是空字符串的时候,就会拼接这个SQL语句
# 注意这个地方是使用了一个concat函数将模糊匹配的百分号和参数进行拼接,在使用的时候注意这个地方不要写错
and name like concat ('%',#{name},'%')
select * from student;
接口文件:
package Mappers;
import com.mybatis.POJO.student;
import java.util.List;
public interface dynamicSql {
List
}
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
for(student student : stu){
System.out.println(student.toString());
}
}
@Test
public void selectAll(){
SqlSession sqlSession = new createSqlSession().create();
dynamicSql dynamicSql = new createSqlSession().createdynamicSql();
List
for(student student : list){
System.out.println(student.toString());
}
}
}
注意点:
需要注意的就是在SQL映射文件中的条件判断和SQL语句的拼接,如果出现了相关的错误首选去检查是否是SQL语句拼错了或者是缺少了某些关键字。
相关文章
发表评论