目录
概述
动态SQL:SQL语句会随着用户输入或外部条件的变化而变化 。
例如:我们在做多条件查询的时候,编写SQL语句的查询操作,我们并不知道用户实际操作时会选择多少条件进行查询,假如有三个条件(日期,大小,名字)供用户选择后查询,如果用户只选择了一个条件(大小)进行查询,那么我们应该动态的进行SQL语句的编写。
再例如:当做信息修改时,可修改信息有 用户名,密码,性别,爱好。用户如果全部修改,这当然没什么好说的。但是如果用户只修改某些信息,并没有全部修改。如果我们还用修改全部的那一套SQL语句,那么没有修改到的信息在SQL语句中对应值就会为null。这明显有问题,所以我们需要使用到动态SQL。
再再例如:我们做批量删除,我们在编写SQL语句时,并不知道用户实际操作时选择多少条数据,所以我们使用SQL语句就可以解决这样的问题。
动态多条件查询
环境准备:mybatis环境正常,完善数据表和pojo类。
我们在做动态多条件时,SQL语句中需要判断用户输入了哪些条件,没有输入哪些条件,但是我们不能使用Java的判断语法,MyBatis对动态SQL有很强大的支撑,给我们提供了一系列的标签供我们使用。
例如 <if> 、<choose>、<set>、<where>、<foreach>等,如何使用呢?看案例。
现有一张数据表,表中有三个字段:用户名,密码,账户余额。
案例需求:用户通过用户名,密码这两条件进行模糊查询,也可以只用单个条件进行查询,在此演示只通过用户名中包含"A"为条件进行查询用户信息。
数据层接口方法
List<User> selectByCondition(User user);
SQL映射文件-SQL语句
-
<select id="selectByCondition" resultType="User">
-
select *
-
from user_table
-
<!--需要使用where标签,否则两个条件为空时,会存在sql语法错误 -->
-
<where>
-
<if test="user != null and user != ''">
-
user like #{user}
-
</if>
-
<if test="password != null and password != null">
-
and password like #{password}
-
</if>
-
</where>
-
-
</select>
测试方法
-
/**
-
* 动态条件查询:
-
* 用户输入的可能不是全部参数,而是部分参数
-
* 动态SQL
-
*/
-
@Test
-
public
void
ConditionSelectTest
()
throws IOException {
-
//模拟前端传入参数
-
String
userName
=
"A";
-
//String password = "4";
-
-
//处理参数-配置为模糊查询形式
-
userName =
"%"+ userName +
"%";
-
//password = "%"+ password + "%";
-
-
//封装成对象的形式传入
-
User
user
=
new
User();
-
user.setUser(userName);
-
//user.setPassword(password);
-
-
String
resource
=
"mybatis-config.xml";
-
InputStream
is
= Resources.getResourceAsStream(resource);
-
-
SqlSessionFactory
build
=
new
SqlSessionFactoryBuilder().build(is);
-
-
SqlSession
sqlSession
= build.openSession();
-
-
UserMapper
mapper
= sqlSession.getMapper(UserMapper.class);
-
//调用方法
-
List<User> users = mapper.selectByCondition(user);
-
-
users.forEach(System.out::println);
-
-
}
原始数据:
执行方法:查询user中存在"A"的记录信息。
动态修改
案例需求:通过用户名进行修改密码或账户余额。可以只是修改一个,也可以修改全部。
说明:
当前案例,只是对于数据层的测试,不做业务层和表现层的功能实现,所以我们都是通过模拟前端传入数据来进行测试。
数据层接口方法
-
//动态修改
-
void
alterRecordByName
(User user);
SQL映射文件-SQL语句
-
<update id="alterRecordByName">
-
update user_table
-
<!--set标签 代表的就是set-->
-
<set>
-
<!--if标签 判断用户是否输入,不输入就不进行修改-->
-
<if test="password != null and password != ''">
-
password = #{password},
-
</if>
-
<if test="balance != null ">
-
balance = #{balance}
-
</if>
-
</set>
-
where user = #{user};
-
-
</update>
if标签中的test属性,用于填写条件判断。
测试方法
-
/**
-
* 修改部分-动态SQL
-
*/
-
@Test
-
public
void
testAlterCondition
()
throws IOException {
-
//模拟前端传入参数
-
String
userName
=
"BB";
-
//密码和账户余额修改任意,当前只修改账户余额
-
//String password = "123456";
-
int
balance
=
5000;
-
-
//封装成对象的形式传入,只将账户余额进行对象封装,密码不变
-
User
user
=
new
User();
-
user.setUser(userName);
-
// user.setPassword(password);
-
user.setBalance(balance);
-
-
String
resource
=
"mybatis-config.xml";
-
InputStream
is
= Resources.getResourceAsStream(resource);
-
-
SqlSessionFactory
build
=
new
SqlSessionFactoryBuilder().build(is);
-
-
//获取SqlSession对象的时候,openSession空参时:autoCommit = false
-
SqlSession
sqlSession
= build.openSession();
-
-
UserMapper
mapper
= sqlSession.getMapper(UserMapper.class);
-
mapper.alterRecordByName(user);
-
System.out.println(
"修改成功...");
-
-
//需要手动提交,或者设置:openSession(true)
-
sqlSession.commit();
-
}
原始数据:
执行方法后数据:成功。
动态批量删除
案例需求:根据传进来的账户余额锁定用户,都进行删除。
数据层接口方法
-
//参数为数组,可接收多个值
-
void
deleteByBalances
(@Param("balance") int[] balance);
SQL映射文件-SQL语句
-
<!--批量删除-->
-
<delete id="deleteByBalances">
-
delete from user_table
-
where balance in
-
<foreach collection="balance" separator="," item="balance" open="(" close=")" >
-
#{balance}
-
</foreach>;
-
</delete>
foreach标签属性说明:
//collection:代表遍历对象
//item:代表每一次获取的对象
//separator:分隔符,数组中元素就是,为分隔符
//open,close:代表开始和结束位置需要填写的括号()
测试方法
删除账户余额为2000,3000的。
-
/**
-
* 批量删除
-
*/
-
@Test
-
public
void
testDeletes
()
throws IOException {
-
//模拟前端传入参数
-
int[] balances =
new
int[]{
2000,
3000};
-
-
String
resource
=
"mybatis-config.xml";
-
InputStream
is
= Resources.getResourceAsStream(resource);
-
-
SqlSessionFactory
build
=
new
SqlSessionFactoryBuilder().build(is);
-
-
//获取SqlSession对象的时候,openSession空参时:autoCommit = false(默认)
-
SqlSession
sqlSession
= build.openSession();
-
-
UserMapper
mapper
= sqlSession.getMapper(UserMapper.class);
-
mapper.deleteByBalances(balances);
-
System.out.println(
"删除成功---->");
-
-
//需要手动提交,或者设置:openSession(true)
-
sqlSession.commit();
-
}
原始数据:
执行方法后数据:
转载:https://blog.csdn.net/m0_60155232/article/details/127381884