文章目录
一、什么是动态 SQL?
在 MyBatis 中提供了动态 SQL 功能。将使用 Java 代码拼接 SQL 语句,改变为在 XML 映射文件中使用标签拼接 SQL 语句。
MyBatis 中动态 SQL 是编写在 mapper.xml 中的,其语法和 JSTL 类似,但是却是基于强大的 OGNL 表达式实现的。
二、 if 标签
if 标签单分支判断语句
1、修改映射配置文件
<!-- 根据用户给定的条件进行查询-->
<select id="selectUsersByProperty" resultType="users">
select * from users where 1=1
<if test="userid != 0">
and userid = #{userid}
</if>
<if test="username != null and username != ''">
and username = #{username}
</if>
<if test="usersex != null and usersex != '' ">
and usersex = #{usersex}
</if>
</select>
2、修改UsersMapper接口
List<Users> selectUsersByProperty(Users users);
3、创建测试类
public class SelectUsersByPropertyTest {
public static void main(String[] args) {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
Users users = new Users();
users.setUsername("aaaaaa");
users.setUserid(8);
List<Users> list = usersMapper.selectUsersByProperty(users);
list.forEach(System.out::println);
}
}
三、 choose、when、otherwise 标签
从多个条件中选择一个使用。
1、修改映射配置文件
<!-- 多选一条件-->
<select id="selectUsersByChoose" resultType="users">
select * from users where 1=1
<choose>
<when test="username != null and username !=''">
and username = #{username}
</when>
<when test="usersex != null and usersex !=''">
and usersex = #{usersex}
</when>
<otherwise>
and userid = 1
</otherwise>
</choose>
</select>
2、修改UsersMapper接口
List<Users> selectUsersByChoose(Users users);
3、创建测试类
public class SelectUsersByChooseTest {
public static void main(String[] args) {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
Users users = new Users();
users.setUsername("aaaaaa");
List<Users> list = usersMapper.selectUsersByChoose(users);
list.forEach(System.out::println);
MybatisUtils.closeSqlSession();
}
}
四、where标签
使用 where 标签,就不需要提供 where 1=1 这样的条件了。如果判断条件不为空则自动添加 where 关键字,并且会自动去掉第一个条件前面的 and 或 or。
1、修改映射配置文件
<!-- 根据用户给定的条件进行查询使用where标签实现-->
<select id="selectUsersByPropertyWhere" resultType="users">
select * from users
<where>
<if test="userid != 0">
and userid = #{userid}
</if>
<if test="username != null and username != ''">
and username = #{username}
</if>
<if test="usersex != null and usersex != '' ">
and usersex = #{usersex}
</if>
</where>
</select>
2、修改UsersMapper接口
List<Users> selectUsersByPropertyWhere(Users users);
3、创建测试类
public class SelectUsersByPropertyWhereTest {
public static void main(String[] args) {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
Users users = new Users();
users.setUsername("aaaaaa");
users.setUserid(8);
List<Users> list = usersMapper.selectUsersByPropertyWhere(users);
list.forEach(System.out::println);
}
}
五、bind标签
bind 标签允许我们在 OGNL 表达式以外创建一个变量,并可以将其绑定到当前的 SQL语句中。一般应用于模糊查询,通过 bind 绑定通配符和查询值。
1、修改映射配置文件
- 未使用bind标签根据用户姓名进行模糊查询
<!-- 根据用户姓名模糊查询-->
<select id="selectUsersByLikeName" resultType="users">
select * from users where username like concat('%',#{name},'%')
</select>
- 使用bind标签根据用户姓名进行模糊查询
<!-- 根据用户姓名模糊查询-->
<select id="selectUsersByLikeName" resultType="users">
<bind name="likename" value="'%'+name+'%'"/>
select * from users where username like #{likename}
</select>
2、修改UsersMapper接口
List<Users> selectUsersByLikeName(String name);
3、创建测试类
public class SelectUsersByLikeNameTest {
public static void main(String[] args) {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
List<Users> list = usersMapper.selectUsersByLikeName("a");
list.forEach(System.out::println);
}
}
六、set标签
set 标签用在 update 语句中。借助 if 标签,可以只对有具体值的字段进行更新。set 标签会自动添加 set 关键字,自动去掉最后一个 if 语句的多余的逗号。
1、修改映射配置文件
<!-- 选择更新-->
<update id="usersUpdate">
update users
<set>
<if test="username != null and username !=''">
username = #{username},
</if>
<if test="usersex != null and usersex != ''">
usersex = #{usersex}
</if>
</set>
where userid = #{userid}
</update>
2、修改UsersMapper接口
void usersUpdate(Users users);
3、创建测试类
public class UpdateUsersTest {
public static void main(String[] args) {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
Users users = new Users();
users.setUserid(1);
users.setUsername("ky");
users.setUsersex("man");
usersMapper.usersUpdate(users);
sqlSession.commit();
}
}
七、 foreach 标签
foreach 标签的功能非常强大,我们可以将任何可迭代对象如 List、Set 、Map 或者数组对象作为集合参数传递给 foreach 标签进行遍历。它也允许我们指定开头与结尾的字符串以及集合项迭代之间的分隔符。
1.1、迭代List、Set
1.2、修改映射配置文件
<!-- 查询用户ID为1或者2的用户-->
<select id="selectUsersByIdUseCollection" resultType="users">
select * from users where userid in
<foreach collection="collection" item="userid" open="(" separator="," close=")">
#{userid}
</foreach>
</select>
1.3、修改UsersMapper接口
List<Users> selectUsersByIdUseCollection(List<Integer> list);
1.4、创建测试类
public class SelectUsersByIdUseCollectionTest {
public static void main(String[] args) {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(4);
List<Users> users = usersMapper.selectUsersByIdUseCollection(list);
users.forEach(System.out::println);
}
}
2.1、迭代数组
2.2、修改映射配置文件
<!-- 查询用户ID为1或者2的用户使用数组传递参数-->
<select id="selectUsersByIdUseArray" resultType="users">
select * from users where userid in
<foreach collection="array" item="userid" open="(" separator="," close=")">
#{userid}
</foreach>
</select>
2.3、修改UsersMapper接口
List<Users> selectUsersByIdUseArray(int[] arr);
2.4、创建测试类
public class SelectUsersByIdUseArrayTest {
public static void main(String[] args) {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
int[] arr = new int[]{1,2,5};
List<Users> users = usersMapper.selectUsersByIdUseArray(arr);
users.forEach(System.out::println);
}
}
3.1、迭代Map
3.2、修改映射配置文件
<!-- 根据给定的条件做计数处理-->
<select id="selectUsersCount" resultType="int">
select count(*) from users where
<foreach collection="suibian" separator="and" item="value" index="key">
${key} = #{value}
</foreach>
</select>
3.3、修改UsersMapper接口
int selectUsersCount(@Param("suibian") Map<String,String> map );
3.4、创建测试类
public class SelectUsersCountTest {
public static void main(String[] args) {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
Map<String,String> map = new HashMap<>();
map.put("username","aaaaaa");
map.put("usersex","male");
int count = usersMapper.selectUsersCount(map);
System.out.println(count);
}
}
八、使用foreach标签完成批量添加
1、修改映射配置文件
<!-- 批量添加用户-->
<insert id="insertUsersBatch">
insert into users values
<foreach collection="collection" item="user" separator=",">
(default ,#{user.username},#{user.usersex})
</foreach>
</insert>
2、修改UsersMapper接口
int insertUsersBatch(List<Users> list);
3、创建测试类
public class InsertUsersBatchTest {
public static void main(String[] args) {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
List<Users> list = new ArrayList<>();
Users users = new Users();
users.setUsername("k1");
users.setUsersex("male");
Users users1 = new Users();
users1.setUsername("k2");
users1.setUsersex("male");
list.add(users);
list.add(users1);
usersMapper.insertUsersBatch(list);
sqlSession.commit();
}
}