JAVA----mybatis的动态SQL

本文详细介绍了MyBatis中的动态SQL操作,包括if、where、set、foreach、bind、choose(when/otherwise)、trim及sql和include标签的使用,通过这些标签可以实现SQL语句的灵活拼接。
摘要由CSDN通过智能技术生成

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
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值