MyBatis动态sql:更⽅便的拼接sql语句
if标签
if标签是最常⽤的判断语句,相当于java中的if语句。在MyBatis中使⽤if标签,我们先看⼀下不使⽤if标签的时候会有什么情况。
<!-- 多条件查询⽤过⽤户对象中的条件查询⽤户列表 -->
<select id="selectUserListByUser"parameterType="User"resultType="User">
<!-- 查询⽤户性别模糊查询⽤户名查询⽤户cid 国籍id -->
select *
from user
where
u_sex = #{u_sex}
and u_username like "%"#{u_username}"%"
and u_cid = #{u_cid}
</select>
在上⾯的案例中,多条件查询⽤户性别u_sex,模糊查询⽤户名u_username,查询⽤户国籍c_id,返回⼀个集合。我们在使⽤条sql语句的时候,我们必须把所有的参数传过来,如果出现我只有查询⽤户性别u_sex,模糊查询⽤户名u_username的情况,我们⼜必须再写⼀条sql语句。⽽使⽤了if标签之后可以解决这个问题。
<!-- 多条件查询⽤过⽤户对象中的条件查询⽤户列表 -->
<select id="selectUserListByUser"parameterType="User"resultType="User">
<!-- 查询⽤户性别模糊查询⽤户名查询⽤户cid 国籍id -->
select *
from user
where
<if test="u_sex!=null">
u_sex = #{u_sex}
</if>';l.,
<if test="u_username!=null">
and u_username like "%"#{u_username}"%"
</if>
<if test="u_cid!=null">
and u_cid = #{u_cid}
</if>
</select>
在上⾯的案例中,当参数u_username传递进映射器时,如果参数不为空则再sql语句上拼接上对⽤户
名的模糊查询,如果为空,则不拼接。这样我们就可以不⽤写多条sql语句了。但是,如果我们u_sex为空u_username不为空,在sql语句拼接时就会出现select * from user where and u_username like "%"#{u_username}"%"的错误语法格式。接下来的where标签可以解决这个问题。
where标签
where标签,当标签内的条件成⽴时,才会加⼊where这个SQL关键字到组装的SQL⾥⾯,否则就不加⼊,where还可以去掉⼀些特殊的SQL语法,⽐如说and、or,它去掉的时前缀的and和or。
<select id="selectUserListByUser"parameterType="User"resultType="User">
<!-- 查询⽤户性别模糊查询⽤户名查询⽤户cid 国籍id -->
select *
from user
<where>
<if test="u_sex!=null">
u_sex = #{u_sex}
</if>
<if test="u_username!=null">
and u_username like "%"#{u_username}"%"
</if>
<if test="u_cid!=null">
and u_cid = #{u_cid}
</if>
</where>
</select>
在上⾯的案例中,如果and全写在sql拼接语句的后⾯,当c_cid==null的话,使⽤where语句就去不掉结尾的and。接下来的trim标签可以解决这个问题。
trim标签
trim标签是要去掉⼀些特殊的字符串,它⼜四个属性,prefix、suffix、prefixOverrides、suffixOverrides。下⾯通过⼀个例⼦说⼀下这四个属性分别代表的意义。
<select id="selectUserListByUser"parameterType="User"resultType="User">
<!-- 查询⽤户性别模糊查询⽤户名查询⽤户cid 国籍id -->
select *
from user
<trim prefix="where"suffixOverrides="and">
<if test="u_sex!=null">
u_sex = #{u_sex} and
</if>
<if test="u_username!=null">
u_username like "%"#{u_username}"%" and
</if>
<if test="u_cid!=null">
u_cid = #{u_cid}
</if>
</trim>
</select>
prefix=“where”,的意思是在trim头标签加上where之后再拼接上trim内的SQL语句,如果将其换成suffix="where"的话,就会在trim内的的SQL语句后⾯接上where,显然在上⾯的案例中是不对的。
suffixOverrides=“and”,的意思是去掉拼接语句尾部⼀些不合法的⼀些特殊字符,⽐如说and、or,如果将其换成prefixOverrides="and"的话,就是去掉拼接语句开头⼀些不合法的的特殊字符。
set标签
set标签在跟新表属性的时候,如果遇上不合法的逗号,会将其去掉。例如:
<update id="updateSetUser"parameterType="User">
<!-- 修改⽤户名和⽤户密码以及性别以id为限制 -->
update user
set
<if test="u_username!=null and u_username!=''">
u_username = #{u_username},
</if>
<if test="u_password!=null and u_password!=''">
u_password = #{u_password},
</if>
<if test="u_sex!=null and u_sex!=''">
u_sex = #{u_sex}
</if>
where u_id = #{u_id}
</update>
在上⾯这个案例中,如果if语句最后⼀个不成⽴⽽它上⼀个if语句成⽴的时候,在拼接SQL语句的时候,就会出现SQL语法的错误,⽽使⽤set标签可以很好的解决这个错误。下⾯是使⽤set标签的案例。
<update id="updateSetUser"parameterType="User">
<!-- 修改⽤户名和⽤户密码以及性别以id为限制 -->
update user
<set>
<if test="u_username!=null and u_username!=''">
u_username = #{u_username},
</if>
<if test="u_password!=null and u_password!=''">
u_password = #{u_password},
</if>
<if test="u_sex!=null and u_sex!=''">
u_sex = #{u_sex}
</if>
</set>
where u_id = #{u_id}
</update>
如果最后⼀个条件u_sex!=null and u_sex!=''不成⽴,第⼆个条件u_password!=null and u_password!=''成⽴,则会把第⼆句拼接的SQL语句末尾的逗号去掉。
foreach标签
foreach标签是⼀个循环语句,它的作⽤是遍历集合,它能够很好地⽀持数组和List、Set接⼝的集合,对此提供遍历的功能。
⽐如说,我要查数据库中id为1、3、5的⽤户,SQL语句应该这样写select * from user where u_id in(1,3,5)只能固定查3个id的⽤户,如果要查4个,必须再写⼀条sql语句,⽽foreach可以很好的解决这个问题。
<select id="selectUserListByIds"resultType="User">
select *
from user
where u_id
in
<foreach collection="array"item="id"open="("close=")"separator=",">
#{id}
</foreach>
</select>
collection表⽰传⼊的是数组还是集合是数组⽤array,是集合⽤list、set等,但如果是包装类的话,则需要使⽤包装类⾥⾯数组或集合的字段名。
item表⽰⽤什么表⽰数据或者集合⾥⾯的数,即循环中当前的元素。
open、close表⽰⽤什么元素把集合两端包起来。
separate表⽰⽤什么分隔。
index表⽰当前元素在集合中的位置。
choose、when、otherwise标签
choose、when、otherwise标签类似于java⾥⾯的wsitch…case…default…功能语句。下⾯是⼀个简单的案例。
<select id="selectUserByUser"parameterType="com.xiezhenyu.bean.User"resultType="com.xiezhenyu.bean.User">
select *
from user
<where>
<choose>
<when test="u_id!=null">
and u_id=#{u_id}
</when>
<when test="u_username!=null">
and u_username=#{u_username}
</when>
<otherwise>
and 1=2
</otherwise>
</choose>
</where>
</select>
当传过来的user的id不为空时,按照id为条件去查,当传过来的id为空⽽username不为空时按照username去查,当两个都为空时,查不到。
sql标签
在写sql语句的时候,有很多重复的语句⽚段,⽐如说,select * from user这句话就被重复了很多次,⽽使⽤sql标签可以将这些重复的字段提出来,什么时候⽤就引⼊⼀下就可以了。
<sql id="selectUser">
select *
from user
</sql>
<select id="selectUserListByIds"resultType="User">
<include refid="selectUser"/>
where u_id
in
<foreach collection="array"item="id"open="("close=")"separator=","index="2">
#{id}
</foreach>
</select>
bind标签
bind标签的作⽤是⽤过ONGL表达式去定义⼀个上下⽂变量,这样更⽅便使⽤,例如在进⾏模糊查询时,MySQL需要⽤到%和参数连接。
定义接⼝⽅法
public List<User>selectUserLikeUsername(@Param("str")String str);
定义映射⽂件和⼀个新的变量,然后执⾏模糊查询
<select id="selectUserLikeUsername"parameterType="string"resultType="com.xiezhenyu.bean.User">
<bind name="pattern"value="'%'+str+'%'"/>
select *
from user
where
u_username like #{pattern}
</select>
测试⽅法
@Test
sql中select是什么意思public void Test11()throws IOException {
String resource ="l";
//读取配置⽂件
InputStream in = ResourceAsStream(resource); //需要sqlSessionFactoryBulider
SqlSessionFactoryBuilder ssfb =new SqlSessionFactoryBuilder(); //创建sqlSessionFactory
SqlSessionFactory ssf = ssfb.build(in);
//⽣产⼀个sqlSession
SqlSession session = ssf.openSession();
UserMapper mapper = Mapper(UserMapper.class); List<User> list = mapper.selectUserLikeUsername("王");
for(User u : list){
System.out.println(u);
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论