您的位置:首页 > 数据库

mybatis 动态操作Sql语句

2017-01-16 19:31 447 查看
动态SQL:

动态语句分别适用于什么场合;

实例展示

主要包括:foreach/ where if/
trim if(分组和where查询)/ set if/
choose-when(switch)/ include

【1】如何进行大批量用户的添加:foreach 实现动态添加;

public int batchSaveUserBean(@Param("users")List<userBean>users);

<insert id="batchSaveUserBean" parameterType="java.util.List" useGeneratedKeys="true">

<!-- insert into table (column1,column2,……)values (),(),()…… -->

insert into t_user(user_name,sex,address) values

<foreach collection="users" item="user" separator=",">

(#{user.name},${user.sex},#{user.address})

</foreach>

</insert >

separator: 以什么符号结尾;

1、多参数的对象userbean查询:Map做为参数,则无需再使用其他的参数,因为MAP是可以放多个参数的;

* @param map

public List<UserBean> queryUserListByMap(@Param("map")Map map);

<!-- MAP中取值方式依旧是采用#或者$,但是我们在取值的时候,是通过key取value -->

<select id="queryUserListByMap" resultMap="userMap">

select user_name,address from t_user where user_name like CONCAT(#{map.name},'%') and sex = ${map.sex}

</select>

2、在mybatis可以使用include与sql的组合,来完成重复代码的引用;适用于where、orderby

include里面直接调用sql里面的代码过来;

<select id="countUserToPagerByMap" resultType="int">

select count(id) from t_user

<include refid="commonSql"></include>

</select>

<sql id="commonSql">

<!-- where标签会直接忽略紧随其后的and或者or -->

<where>

<!-- 如果传递的参数是Map,那么test里面的表达式,只能取键来进行比较,不能直接使用#或者$ -->

<if test="map.name
!= null">

and user_name like CONCAT(#{map.name},'%')

</if>

<if test="map.sex != null">

and sex = ${map.sex}

</if>

</where>

</sql>

4、if 多条件筛选的时候使用:因此在这种多条件筛选的时候可以直接加and

public int updateUserBean(@Param("user")UserBean user, @Param("id")Long id);

<update id="updateUserBean">

update t_user

<set> //当user.name不为空的时候user_name = #{user.name};

<if test="user.name != null">

user_name = #{user.name},

</if>

<if test="user.sex != null">

sex = #{user.sex},

</if>

<if test="user.address != null">

address = #{user.address},

</if>

</set>

<where>id = ${id}</where>

</update>

5、<trim><if></if></trim>

<trim prefix="WHERE" prefixOverrides="AND |OR " suffix="order by" suffixOverrides="AND |OR ">

<select id="queryUserListByObject" resultType="UserBean">

select user_name as name,address as address from t_user

<trim prefix="where" prefixOverrides="and|or" suffix="order by" suffixOverrides="and|or"> //以where开始,以order by 结尾;

<if test="user.name != null">

and user_name like CONCAT(#{user.name},'%') and sex = ${user.sex}

</if>

</trim>

id desc;

</select>

6、<choose><when></when></choose> 类似于Swift()

7、修改的时候用<set>,当修改的输入框的时候判断输入的框体有信息的才修改设置

案例4已经使用;

8、在查询大于某天,小于某天的时候,会使用到< >符号,这个和标签很相似,这就需要使用到静态块, <![CDATA[ < ]]> 静态块的语句在解析的时候,会当做字符串来解析,不会当做标签来解析。<![CDATA[ and age>5 and age <10 ]]>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: