Mybatis之动态Sql语句
本章节接着上一章的简单的对数据库的增查删改继续
还是熟悉的User.java实体类,内容还是一致(id,username,password)
*
1).动态Sql-----IF语句
*先在UserMapper.java中编写对应的接口(就用查询来写){这里的查询用到了万能Map}
//根据任意一个条件查询满足该条件的全部用户(IF)
List<User> queryUserIF(Map map);
*接下来编写Mapper.xml文件
如果不加if那sql语句应该是Select * from 表名字这种形式,加上IF就是加了一个IF标签,这样写我们就是实现动态的查询满足我们条件的所有结果。一个完整的IF标签应该是
<if test="">
</if>
具体在mapper.xml中应该这样写
<select id="queryUserIF" parameterType="map" resultType="com.cjn.domain.User">
select * from user where 1=1
<if test="id != null">
and id = #{id}
</if>
<if test="username != null">
and username = #{username}
</if>
</select>
写完了我们的Mapper接口还有我们的Mapper.xml文件接下来我们开始测试
先查询一个id让我们看看结果
/**根据任意条件查询满足条件的全部用户(IF)**/
@Test
public void queryUserIF(){
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.queryUserIF(map);
for(User user : users){
System.out.println(user);
}
//释放资源
sqlSession.close();
}
运行结果:
只查询username
/**根据任意条件查询满足条件的全部用户(IF)**/
@Test
public void queryUserIF(){
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.queryUserIF(map);
for(User user : users){
System.out.println(user);
}
//释放资源
sqlSession.close();
}
运行结果:
可以看到只要是满足条件的结果尽数查出这个,就是动态性。
2).动态Sql-----Choose,When,otherwise语句
*这个主要是Choose语句(他的含义就跟Java中的Switch语句一样,Choose必须满足一个条件才可起作用,否则就会出现空值或者错误),我们还是用查询来测试
老样子还是先定义Mapper接口
//根据任意一个条件查询满足该条件的全部用户(Choose,When,otherwise)
List<User> queryUserChoose(Map map);
编写Mapper.xml文件
这里就用到了Choose标签,还有when标签,最后的otherwise标签的意思就和else语法差不多,
这里sql语句的意思是查询全部列表,是否符合给出的id还有username还有password的其中之一,或者符合全部。(注意上面的IF语句中有where标签是因为有1=1这个条件,这里去掉以后加上了where标签性质相同,也可将上述IF语句中的1=1去掉,用where标签包裹IF语句)
<!--根据条件查询满足该条件的全部用户-->
<select id="queryUserChoose" parameterType="map" resultType="com.cjn.domain.User">
select * from user
<where>
<choose>
<when test="id != null">
id = #{id}
</when>
<when test="username != null">
and username = #{username}
</when>
<otherwise>
and password = #{password}
</otherwise>
</choose>
</where>
</select>
接下来咱们开始测试
/**Choose只会选择第一个条件进行查询,自动忽略除了第一个以后的条件**/
@Test
public void queryUserChoose(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
HashMap map = new HashMap();
map.put("id","1");
List<User> users = mapper.queryUserChoose(map);
for(User user : users){
System.out.println(user);
}
//释放资源
sqlSession.close();
}
下面是测试结果
3).动态Sql-----Set语句
通常set语句会在修改语句中出现,所以我们就用修改语句来实现,set标签会自动前置sql语句,并且会
删除无关逗号。(注意必须有一个修改条件可执行)
好了接下来我们继续,oldroad,先写Mapper接口
int updateUser(Map map);
再写Mapper.xml文件
<!--set语句更新-->
<update id="updateUser" parameterType="map">
update user
<set>
<if test="username != null">
username = #{username},
</if>
<if test="password != null">
password = #{password}
</if>
</set>
where id = #{id}
</update>
接下来开始测试
/**Set语句更新**/
@Test
public void updateUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
HashMap map = new HashMap();
map.put("username","南方");
map.put("password","3333333");
map.put("id","1");
int i = mapper.updateUser(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();
}
运行结果:
(注意这里我是将数据修改后添加了一步查询全部信息的操作)
4).动态Sql-----sql片段
接下来咱们说一种不常用的sql片段,就是sql标签
,sql标签的作用的话其实跟html中的div作用类似
。大家可以看到上述的几种sql语句中都出现了
<if test="username != null">
username = #{username},
</if>
<if test="password != null">
password = #{password}
</if>
这个语句,这时候sql语句就有了他存在的意义
我们就可以定义一个SQL标签将他放入其中,等到时候使用,就可以直接拿出来用,一个完整的sql标签是下面这样(id的作用是为了方便引用):
<sql id="">
</sql>
下面我们结合IF查询例子来说明:
oldroad,先写Mapper接口:
//sql片段引入版本查询满足条件的全部用户
List<User> queryUserIf(Map map);
在写Mapper.xml文件
先用sql标签定义公共部分
注意需要使用这段公共部分的时候,这时候就用一个include标签引用即可具体操作看一下语句。
<sql id="if-id-username">
<if test="id != null">
and id = #{id}
</if>
<if test="username != null">
and username = #{username}
</if>
</sql>
然后在写需要用的部分(注意这里的refid就是引用上述的sql的id名字):
<!--(sql片段引用版本)根据条件查询满足该条件的全部用户-->
<select id="queryUserIf" parameterType="map" resultType="com.cjn.domain.User">
select * from user
<where>
<include refid="if-id-username"></include>
</where>
</select>
xml到这里就写完了,下面我们就开始测试:
@Test
public void queryUserIf(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
HashMap map = new HashMap();
map.put("id","1");
List<User> users = mapper.queryUserIf(map);
for(User user : users){
System.out.println(user);
}
//释放资源
sqlSession.close();
}
运行结果:
先到这里,剩下的在Mybatis—动态SQL(2)当中。
以上均是个人所学所得,若有错误欢迎私聊评论指正,谢谢