MyBatis框架的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能,它存在的意义是为了解决拼接SQL语句字符串时的痛点问题
动态SQL之if标签
if:根据标签中test属性所对应的表达式决定标签中的内容是否需要拼接到SQL中
DynamicSQLMapper

DynamicSQLMapper.xml

Emp
package com.baidu.mybatis.pojo;
public class Emp {
private Integer eid;
private String empName;
private Integer age;
private String sex;
private String email;
private Dept dept;
public Emp() {
}
public Emp(Integer eid, String empName, Integer age, String sex, String email) {
this.eid = eid;
this.empName = empName;
this.age = age;
this.sex = sex;
this.email = email;
}
/**
* 获取
* @return eid
*/
public Integer getEid() {
return eid;
}
/**
* 设置
* @param eid
*/
public void setEid(Integer eid) {
this.eid = eid;
}
/**
* 获取
* @return empName
*/
public String getEmpName() {
return empName;
}
/**
* 设置
* @param empName
*/
public void setEmpName(String empName) {
this.empName = empName;
}
/**
* 获取
* @return age
*/
public Integer getAge() {
return age;
}
/**
* 设置
* @param age
*/
public void setAge(Integer age) {
this.age = age;
}
/**
* 获取
* @return sex
*/
public String getSex() {
return sex;
}
/**
* 设置
* @param sex
*/
public void setSex(String sex) {
this.sex = sex;
}
/**
* 获取
* @return email
*/
public String getEmail() {
return email;
}
/**
* 设置
* @param email
*/
public void setEmail(String email) {
this.email = email;
}
/**
* 获取
* @return dept
*/
public Dept getDept() {
return dept;
}
/**
* 设置
* @param dept
*/
public void setDept(Dept dept) {
this.dept = dept;
}
public String toString() {
return "Emp{eid = " + eid + ", empName = " + empName + ", age = " + age + ", sex = " + sex + ", email = " + email + ", dept = " + dept + "}";
}
}
SqlSessionUtils
package com.baidu.mybatis.utils;
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 SqlSessionUtils {
public static SqlSession getSqlSession() {
SqlSession sqlSession = null;
try {
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
sqlSession = sqlSessionFactory.openSession(true);
} catch (IOException e) {
throw new RuntimeException(e);
}
return sqlSession;
}
}
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="jdbc.properties"/>
<!— 设置MyBatis的全局配置 —>
<settings>
<!— 将_自动映射为驼峰,比如emp_name映射为empName—>
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!— 开启延迟加载—>
<!— <setting name="lazyLoadingEnabled" value="true"/>—>
</settings>
<typeAliases>
<package name="com.baidu.mybatis.pojo"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<package name="com.baidu.mybatis.mapper"/>
</mappers>
</configuration>
测试
DynamicSQLMapperTest
package com.baidu.mybatis;
import com.baidu.mybatis.mapper.DynamicSQLMapper;
import com.baidu.mybatis.pojo.Emp;
import com.baidu.mybatis.utils.SqlSessionUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class DynamicSQLMapperTest {
public void testGetEmpByCondition() {
SqlSession sqlSession = SqlSessionUtils.getSqlSession();
DynamicSQLMapper mapper = sqlSession.getMapper(DynamicSQLMapper.class);
List<Emp> empByCondition = mapper.getEmpByCondition(new Emp(null, "张三", 28, "男", "zhangsan@example.com"));
System.out.println("empByCondition = " + empByCondition);
}
}



