ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2021-12-17 18:31:13  阅读:179  来源: 互联网

标签:语句 UserMapper SSM sqlSession user SQL 动态


写在前面
记录自己的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项目,和[[## 3.7 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]]

标签:语句,UserMapper,SSM,sqlSession,user,SQL,动态
来源: https://blog.csdn.net/qq_40903378/article/details/121999849

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有