Mybatis—动态SQL(2)
我们接着上一章节讲,上一章节我们讲到了SQL片段,动态sql还剩下bind模糊查询,还有foreach,还有一个trim,好了废话不多开始
*
1).concat模糊查询
在讲bind模糊查询之前我们先讲一个用到concat的模糊查询,可以用来对比一下。
我们先写Mapper接口;
List<User> queryUser1(@Param("username") String username,
@Param("password") String password);
在编写接口对应的xml文件:
注意这里的concat("%",#{username},"%")语句只适合mysql数据库,如果底层换成其他数据库就不行了
<!--concat("%",#{username},"%")只会支持mysql,如果底层是其他数据库就不行了-->
<select id="queryUser1" resultType="com.cjn.domain.User">
select * from user where username like concat("%",#{username},"%") and password like concat("%",#{password},"%")
</select>
接下来咱们开始测试:
@Test
public void queryUser1(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> list = mapper.queryUser1("南","3");
for(User user : list){
System.out.println(user);
}
//释放资源
sqlSession.close();
}
运行结果:
*
2).Bind模糊查询
接下来咱们开始用bind编写,bind标签适合所有数据库语言
先写Mapper接口:
//bind模糊查询
List<User> queryUserBind(@Param("username") String username,
@Param("password") String password);
再写对应的xml文件:
注意这里的bind标签中name属性是方便下面的sql语句引用。
<select id="queryUserBind" resultType="com.cjn.domain.User">
<bind name="bindusername" value="'%'+username+'%'"/>
<bind name="bindpassword" value="'%'+password+'%'"/>
select * from user where username like #{bindusername} and password like #{bindpassword}
</select>
在编写测试类:
/**bind模糊查询**/
@Test
public void queryUserBind(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> list = mapper.queryUserBind("南","3");
for(User user : list){
System.out.println(user);
}
//释放资源
sqlSession.close();
}
运行结果:
3).Foreach标签
foreach标签查询满足条件的结果
oldroad,编写mapper接口:
List<User> queryUserForeach(Map map);
再写对应的mapper.xml文件:
<!--foreach标签的使用,查询1-3号用户-->
<!--静态查询语句为
select * from user where 1=1 and (id=1 or id=2 or id=3)
-->
<!--先传递一个万能map,这个map里面可以存在一个集合-->
<!--collection是要遍历集合,item是集合中单个元素的名称,open为拼接sql语句开始,close为结束-->
<!--separator为连接符-->
<select id="queryUserForeach" parameterType="map" resultType="com.cjn.domain.User">
select * from user
<where>
<foreach collection="idlist" item="id" open="and (" close=")" separator="or">
id = #{id}
</foreach>
</where>
</select>
测试:
/**foreach查询id为1-3的用户**/
@Test
public void queryUserForeach(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
HashMap map = new HashMap();
ArrayList<Integer> idlist = new ArrayList<Integer>();
idlist.add(1);
idlist.add(2);
idlist.add(3);
map.put("idlist",idlist);
List<User> users= mapper.queryUserForeach(map);
for(User user : users){
System.out.println(user);
}
//释放资源
sqlSession.close();
}
运行结果:
4).Trim标签(代替Where标签)
Trim标签可以用来替换where标签还有set标签
先替换where标签
mapper接口:
//trim标签(根据需求组织sql语句,可以代替where还有set标签)
//trim标签实现查询满足任意一个条件的全部用户(代替WHERE)
List<User> queryUserTrim(Map map);
mapper.xml文件:
<!--Trim标签实现查询满足任意一个条件的全部用户(代替WHERE)-->
<!--prefix标签前缀,是指配置的where-->
<!--prefixOverrides是指要处理的字符,会删除多余的and还有or-->
<select id="queryUserTrim" parameterType="map" resultType="com.cjn.domain.User">
select * from user
<trim prefix="WHERE" prefixOverrides="AND | OR">
<if test="id != null">
and id = #{id}
</if>
<if test="username != null">
and username = #{username}
</if>
</trim>
</select>
测试类的编写:
/**trim标签实现查询满足任意一个条件的全部用户(代替WHERE)**/
@Test
public void queryUserTrim(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
HashMap map = new HashMap();
//map.put("id","1");
map.put("username","南方");
List<User> users = mapper.queryUserTrim(map);
for(User user : users){
System.out.println(user);
}
//释放资源
sqlSession.close();
}
运行结果:
5).Trim标签(代替Set标签)
下面是代替Set标签
mapper接口:
//trim标签实现更新满足任意一个条件的用户(代替set)
int updateUserTrim(Map map);
接口对应的Mapper.xml文件
注意suffixOverrides属性作用是去掉多余的后缀比如逗号
<!--trim标签实现更新满足任意一个条件的用户(代替set)-->
<!--suffixOverrides标签作用是去掉多余的后缀比如逗号-->
<update id="updateUserTrim" parameterType="map">
update user
<trim prefix="SET" suffixOverrides=",">
<if test="username != null">
username = #{username},
</if>
<if test="password != null">
password = #{password}
</if>
</trim>
where id = #{id}
</update>
测试类:
/**trim标签实现更新满足任意一个条件的用户(代替set)**/
@Test
public void updateUserTrim(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
HashMap map = new HashMap();
map.put("username","南方");
map.put("password","1");
map.put("id","1");
int i = mapper.updateUserTrim(map);
if(i!=0){
System.out.println("修改成功!!");
User user=new User();
List<User> users = mapper.findAll();
if(user != null){
System.out.println(users);
}
}else{
System.out.println("修改失败!!");
}
//如果mybatis进行更新操作,提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
}
运行结果:
同样我在修改操作之后添加了一个查询全部列表的操作。
好了,Mybatis之动态Sql就更新到这里,谢谢观看
以上均是个人所学所得,若有错误欢迎评论指正