写在前面:
记录自己的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表中数据如图
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接口层也编写对应的条件查询函数,如图
测试代码如下:
// 测试动态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();
}
测试结果如图
3.8.3.2 动态SQL之foreach标签
编写UserMapper接口文件,加入功能函数,如图
在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();
}
结果如图查询成功
3.8.3.3 动态SQL之trim标签
在UserMapper接口中加入插入功能函数,如图
在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();
}
}
结果如图,数据库中成功修改
3.8.3.4 动态SQL之set标签
在UserMapper接口中加入修改功能函数,如图
在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();
}
结果如图,数据库中成功插入
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测试函数,如图成功运行