文章目录
mybatis的SQL语句动态拼接
mybatis的SQL语句动态拼接学习:
问题:
在学习了Mybatis的Sql动态代理后,我们可以很放方便的实现单表的增删改查。
但是我们又发现,很多时候,根据业务需求,无法事先确定要执行的SQL语句。
用户发起请求的数据不同,需要执行的SQL语句也不同,怎么办呢?
解决:
根据不同的参数的值,动态的拼接SQL语句。
传统方式实现:
在DaoImpl层的代码中使用java逻辑代码,判断接受的参数的值,
动态的拼接SQL语句。
Mybatis方式实现:
因为MyBatis的Sql动态代理方式中,Mapper接口的实现是动态生成的
我们无法在其中书写java逻辑代码实现SQL语句的动态拼接。但是我们
是在mapper.xml文件中声明SQL语句的,所以Mybatis希望我们Mapper
.xml文件中完成对Sql语句的动态拼接。
使用:
Mybatis的mapper配置文件的逻辑标签
常用: if标签
where标签
set标签
foreach标签
bind标签
choose when otherwise标签
trim标签
sql标签
include 标签
总结:
其实就是由我们在自己声明的DaoImpl代码中使用java逻辑代码判断实现SQL动态拼接,变成了
在Mapper.xml文件中使用逻辑标签完成SQL动态拼接的判断,但是本质上是一样的。
if标签
根据花卉名称和花卉产地动态查询花卉信息
if标签
作用:根据方法的参数的值,实现SQL语句的拼接,相当于java的单if
使用:
<if test="">
要拼接的内容
</if>
注意:test可以直接书写逻辑判断,但连接符号为 and 或 or
可以使用param1|键名|属性名|注解别名 获取参数的值
如:test="param1 !='' and param1 != null"
<?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="com.sxt.mapper.FlowerMapper">
<select id="query" resultType="flower">
SELECT * FROM flower
<if test="param1 !='' and param1 != null">
WHERE name=#{param1}
</if>
</select>
<select id="query2" resultType="flower">
SELECT * FROM flower WHERE 1=1
<if test="param1 !='' and param1 != null">
and name=#{param1}
</if>
<if test="param2 != '' and param2 != null">
and production=#{param2}
</if>
</select>
//if标签
List<Flower> query(String name,String production);
List<Flower> query2(String name,String production);
测试
public class FlowerTest {
private SqlSession session;
private FlowerMapper flower;
@Before //在所有@Test注解执行之前 执行
public void before() throws IOException{
InputStream in = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
session = factory.openSession();
//getMapper():动态代理 传过去一个接口,返回一个代理对象
flower = session.getMapper(FlowerMapper.class);
}
@After
public void After(){
session.commit();
session.close();
}
@Test
public void te