SSM之Mybatis动态SQL/动态Sql怎么用?动态SQL有什么作用?动态SQL与普通SQL语句哪里不一样

40 篇文章 0 订阅
8 篇文章 0 订阅

写在前面
记录自己的MyBatis学习之旅,若看不懂则建议先看前几篇博客,详细代码可在我的Gitee仓库ssm-learning克隆下载学习使用!

3.8 动态Sql

3.8.1 动态SQl语句

动态 SQL 是 MyBatis 的强大特性之一,可以解决普通SQL操作时的不同条件下的拼接问题。Mybatis3是基于OGNL表达式而实现的,比起以前大大精简了元素种类,只有以下几种元素:

  • if.解决所有SQL语句操作时的拼接问题
  • set.解决修改操作时拼接问题
  • trim.解决插入操作时拼接问题
  • foreach.解决查询操作时拼接问题

3.8.2 项目准备

新建MyBatis项目,和Dao层实现这一节中的项目准备类似,不过使用代理模式来进行Dao层模块!数据库user表中数据如图![[Pasted image 20211215150202.png]]

3.8.3 动态SQL代码操作

3.8.3.1 动态SQL之if标签

在UserMapper.xml中编写条件查询SQL语句,代码如下:

<!-- 使用动态SQL进行条件查询-->  
 <select id="findByCondition" resultType="com.demo.entity.User" parameterType="com.demo.entity.User">  
	 select * from user  
	<where>  
		 <if test="id != 0">  
			 and id = #{id}  
		</if>  
		 <if test="name != null">  
		 	and name = #{name}  
		 </if>  
		 <if test="password != null">  
		 	and password = #{password}  
			</if>  
	 </where> 
</select>

在UserMapper接口层也编写对应的条件查询函数,如图![[Pasted image 20211215145055.png]]
测试代码如下:

// 测试动态SQL之if语句  
 public void test1()  
    {  
        User user = new User();  
		//        user.setId(1);  
		 user.setName("Jerry");  
		 user.setPassword("456");  
		 sqlSession = sqlSessionFactory.openSession();  
		 UserMapper userMapper = sqlSession.getMapper(UserMapper.class);  
		 List<User> userList = userMapper.findByCondition(user);
		 System.out.println(userList);  
		 sqlSession.close();  
 }

测试结果如图![[Pasted image 20211215145937.png]]

3.8.3.2 动态SQL之foreach标签

编写UserMapper接口文件,加入功能函数,如图![[Pasted image 20211215150459.png]]
在UserMapper.xml中加入查询语句,如下:

<!-- 使用动态SQL之foreach语句进行条件查询-->  
<select id="findByIds" resultType="com.demo.entity.User" parameterType="list">  
 		select * from user  
		<where>  
			 <foreach collection="list" open="id in(" close=")" item="id" separator=",">  
			 		#{id}  
			</foreach>  
	 </where>
</select>

测试函数如下:

// 测试动态SQL之foreach语句  
 public void test2()  
    {  
         List<Integer> list = new ArrayList<Integer>();  
		 list.add(0);  
		 list.add(1);  
		 list.add(2);  
		 sqlSession = sqlSessionFactory.openSession();  
		 UserMapper userMapper = sqlSession.getMapper(UserMapper.class);  
		 List<User> userList = userMapper.findByIds(list);  
		 System.out.println(userList);  
		 sqlSession.close();  
 }

结果如图查询成功![[Pasted image 20211215151526.png]]

3.8.3.3 动态SQL之trim标签

在UserMapper接口中加入插入功能函数,如图![[Pasted image 20211215153702.png]]
在UserMapper.xml文件中编写插入动态SQL语句,如下:

<!-- 插入动态SQL语句之trim-->  
 <insert id="insertUser" parameterType="com.demo.entity.User">  
 	insert into user  
     <trim prefix="(" suffix=")" suffixOverrides=",">  
		 <if test="id != 0">  
			 	id,  
		 </if>  
		 <if test="name != null">  
		 		name,  
		  </if>  
		 <if test="password != null">  
		 		password,  
		  </if>  
 	</trim> 
	 <trim prefix="values(" suffix=")" suffixOverrides=",">  
		 <if test="id != 0">  
			 #{id},  
		 </if>  
		 <if test="name != name">  
		 	#{name},  
		  </if>  
		 <if test="password != null">  
		 	#{password},  
		  </if>  
 	</trim> 
</insert>

测试函数如下:

// 测试动态SQL之trim语句  
 public void test3()  
    {  
         User user = new User();  
		 user.setId(5);  
		//        user.setName("赵六");  
		 user.setPassword("478");  
		 sqlSession = sqlSessionFactory.openSession();  
		 UserMapper userMapper = sqlSession.getMapper(UserMapper.class);  
		 userMapper.insertUser(user);  
		 sqlSession.commit();  
		 sqlSession.close();  
		 }  
}

结果如图,数据库中成功修改![[Pasted image 20211215163735.png]]

3.8.3.4 动态SQL之set标签

在UserMapper接口中加入修改功能函数,如图![[Pasted image 20211215161604.png]]
在UserMapper.xml文件中编写修改动态SQL语句,如下:

<!-- 修改动态SQL语句之set-->  
 <update id="updateUser" parameterType="com.demo.entity.User">  
	 update user  
	<set>  
			 <if test="name != null">  
				 name = #{name},  
			</if>  
			 <if test="password != null">  
				 password = #{password},  
			</if>  
	 </set> 
	 <where>
			 <if test="id != 0">  
	 				id = #{id}
			</if>  
	 </where>
</update>

测试函数如下:

// 测试动态SQL之set语句  
 public void test4()  
    {  
         User user = new User();  
		 user.setId(5);  
		 user.setName("赵六");  
		 user.setPassword("996");  
		 sqlSession = sqlSessionFactory.openSession();  
		 UserMapper userMapper = sqlSession.getMapper(UserMapper.class);  
		// 将id为5的人的姓名和密码改为赵六及996  
		 userMapper.updateUser(user);  
		 sqlSession.commit();  
		 sqlSession.close();  
	 }

结果如图,数据库中成功插入。![[Pasted image 20211215161455.png]]

3.8.3.5 SQL语句片段的抽取

作用就是去掉重复SQL语句,便于后期进行维护!
在UserMapper.xml文件中抽取语句select * from user,抽取和引用代码如下:

<!-- 抽取select * from userSQL语句-->  
 <sql id="selectAll">  
 		select * from user  
</sql>

--     引用抽取的SQL语句  
 <include refid="selectAll"></include>

执行foreach测试函数,如图成功运行![[Pasted image 20211215152444.png]]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值