mybatis的核心就是动态sql.
什么是动态sql:对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接、组装。
转自:
https://www.cnblogs.com/shenxiaoquan/p/5779631.html
这篇文章讲解sql中的if语句。它可以对查询条件进行判断,如果输入参数不为空才进行查询条件的拼接。这篇文章的核心就是下面的这段代码。
相当于sql语句中的where关键字。
这个标签还有一个功能就是自动会去掉第一个and.,比如下面两句sql代码,如果第一个满足的那么就会去掉and这个关键字。
<where>
<if test="userCustom!=null">
<if test="userCustom.sex!=null and userCustom.sex!=''">
and user.sex= #{userCustom.sex}
</if>
<if test="userCustom.username!=null and userCustom.username!=''" >
and user.username=#{userCustom.username}
</if>
</if>
</where>
下面给出u具体案例:
userMapper.xml代码如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
< mapper namespace="cn.itcast.mybatis.mapper.userMapper">
nanmespace:命名空间。 作用就是对sql进行分类话管理,理解Sal分离
注意:使用mapper代理方式,namespace有特殊重要的作用
< select id="findUserList" parameterType="cn.itcast.mybatis.po.UserQueryVo" resultType="cn.itcast.mybatis.po.UserCustom">
SELECT id ,username FROM USER WHERE user.sex= #{userCustom.sex} AND user.username=#
{ userCustom.username}
< /select>
这里的id要和Mapper接口里面的函数名字一模一样。parameterType表示输入的类型,resultType表示输出的类型,这里是匹配的实体类
<resultMap type="user" id="userResultMap">
<!--
id:表示查询结果集中唯一的标识。
column:**查询出来的列名**
property:type指定的pojo类型中的属性名
最终resultMap对column和property作一个映射关系(对应关系)
-->
<id column="id_" property="id"/>
<result column="username_" property="username"/>
</resultMap>
<!--
以上定义resultMap
将SELECT id id_,username username_ FROM USER 和User类中的属性做一个映射关系
type:resultMap最终映射的java对象类型,可以使用别名
id:对resultMap的唯一标识。
-->
<select id="findUserByResultMap" parameterType="cn.itcast.mybatis.po.UserQueryVo" resultMap="userResultMap">
SELECT id id_,username username_ FROM USER
<!--
where可以自动去掉条件中的第一个and
-->
<where>
<if test="userCustom!=null">
<if test="userCustom.sex!=null and userCustom.sex!=''">
and user.sex= #{userCustom.sex}
</if>
<if test="userCustom.username!=null and userCustom.username!=''" >
and user.username=#{userCustom.username}
</if>
</if>
</where>
</select>
</ mapper>
测试代码Mybatis_mappertest.java代码如下:
package cn.itcast.mybatis.first;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import cn.itcast.mybatis.mapper.userMapper;
import cn.itcast.mybatis.po.User;
import cn.itcast.mybatis.po.UserCustom;
import cn.itcast.mybatis.po.UserQueryVo;
public class Mybatis_mappertest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void setup() throws IOException
{ String resource="SqlMapConfig.xml";
InputStream inputStream= Resources.getResourceAsStream(resource);
//主要是生成SqlsessionFactory。
this.sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testMaper()
{
SqlSession sqlSession=null;
sqlSession=sqlSessionFactory.openSession();
//生成代理类
userMapper userMapper=sqlSession.getMapper(userMapper.class);
//创建包装对象,设置查询条件
UserQueryVo userQueryVo=new UserQueryVo();
UserCustom userCustom=new UserCustom();
// 注意我把这里的sex注销掉了,也就是说sex没有值,那么我们用的是动态的sql语句,就是说sex不会被拼接进去吧
// userCustom.setSex("1");
userCustom.setUsername("王王");
userQueryVo.setUserCustom(userCustom);
userMapper.findUserByResultMap(userQueryVo);
}
}
运行如下:
DEBUG [main] - ==> Preparing: SELECT id id_,username username_ FROM USER WHERE user.username=?
看到没,这里得sql语句中没有 and user.sex= #{userCustom.sex}这条语句。也就是说没有拼接上去。
我们再改一下:干脆把整个userCustom都不输入进去。
结果如下:
DEBUG [main] - ==> Preparing: SELECT id id_,username username_ FROM USER
看到没,这里的sql语句中什么where后面的语句都没有拼接上去了。