mybatis 动态SQL

if标签

通常使用在where,通过判断参数的值来决定是否使用某个查询条件,或者在update是否使用更新某个字段,在insert 中是否插入某个字段的值

if 标签有一个必要的属性test,test 属性值是OGNL判断表达式
  <if test="name != null and name != ''">
property !=/== null :适用于任何类型的字段,判断属性值是否为空
property !=/== ’ ‘ 仅使用于字符串类型

and 和or  判断条件,

判断字符串的时候先判断是否为null,再去判断是否为空

 

 

但是当两个条件都不满足的时候

会出现类型这样的sql语句 select * from weibo_user where  (不符合规则

可以通过where标签去解决,自动删除and  or

 

choose用法

choose标签是按顺序判断其内部when标签中的test条件出否成立,如果有一个成立,则 choose 结束。当 choose 中所有 when 的条件都不满则时,则执行 otherwise 中的sql。类似于Java 的 switch 语句,choose 为 switch,when 为 case,otherwise 则为 default。

    <select id="selectByIdName" resultType="java.util.HashMap">

        select * from weibo_user
        <where>
            <choose>
                <when test="id != null or id != ''" >
                    id = #{id}
                </when>
                <when test="name != null or name != ''" >
                    and username = #{name}
                </when>
          <otherwise>
            and 1 == 2;
          </otherwise
</choose> </where>
一旦上面的id符合条件,那就不会进行name的判断,直接按照id去查询了
不会再向下判断了,

 

where 标签:

  如果该标签包含的元素中有返回值,就插入一个where 如果where后面的字符串是以and和or开头的,就自动将他们剔除。

        select * from weibo_user
        <where>
            <if test="name != null and name != ''">
                username = #{name}
            </if>
            <if test="id != null and id != ''">
                and id = #{id};
            </if>
        </where>

因为当第一个if条件不成立,第二个if成立的时候,整合的SQL语句是:

select * from weibo_user where and id = #{id} 

但是这里有where标签,会自动剔除and,最后语句正确。

 

 

set标签

和where 一样

 如果标签包含的元素有返回值,就插入一个set,如果set后面的字符串是以逗号结尾的,就将都好剔除

    <update id="updateWeiboUserName" >
        update weibo_user
        <set>
            <if test="username != null and username != ''">
                username = #{username},
            </if>
            <if test="nickname != null and nickname != ''">
                nickname = #{nickname},
            </if>
        </set>
        where id = #{id}
    </update>

 

trim用法

where 和set 标签的功能都可以用trim 标签来实现,并且在底层就是通过
TrimSqlNode 实现的

trim元素的主要功能是,与之对应的属性是

下面的前提条件是,当trim里面的元素有内容的时候,会加入指定的位置和指定的内容

prefix   可以在自己包含的内容前加上某些前缀,

suffix   也可以在其后加上某些后缀

prefixOverrides  可以把包含内容的首部某些内容覆盖

suffixOverrides  也可以把尾部的某些内容覆盖

只需要指定 trim的一些属性

where 标签对应trim 的实现如下。
<trim prefix=”WHERE ” prefixOverrides=” AND |OR ” >
</ trim>

注意:上面的AND空格不能省略!!!

 

foreach

因为我们SQL语句会使用IN关键字:id in (1,2,3)

foreach 可以对数组、Map 或实现了工terable 接口(如List 、Set )的对象进行遍
历。数组在处理时会转换为List 对象,因此foreach 遍历的对象可以分为两大类: Itera ble
类型和Map 类型。这两种类型在遍历循环时情况不一
<select>
select * from sys_user
where 工d in
<foreach collection= ” lis t ” open= ” ( ” close= ” )” separator= ” , ”
item= ” id” index = ” i ” >
#{id}
</foreach>
</ select>

属性分析:

collection : 必填,值为要选代循环的属性名。这个属性值的情况有很多。
item :变量名,值为从法代对象中取出的每一个值。
index :索引的属性名,在集合数组情况下值为当前索引值, 当选代循环的对象是Map
类型时,这个值为Map 的key (键值)。
open:整个循环内容开头的字符串。
close : 整个循环内容结尾的字符串。
separator :每次循环的分隔符。

 

<!--使用foreach元素查询用户信息-->
<select id="selectUserByForeach" resultType="com.po.MyUser" parameterType=
"List">
    select * from user where uid in
    <foreach item="item" index="index" collection="list"
    open="(" separator="," close=")">
        # {item}
    </foreach>
</select>

 

bind

创建并绑定变量到上下文当中,

    <select id="selectByName" resultType="java.util.HashMap">

--         select  * from weibo_user where username like concat(#{name},'%')
        select * from weibo_user where
        <if test="username != name and username != ''" >
            <bind name="usernameLike" value="name+'%'"/>
            username like  #{usernameLike}
        </if>
    </select>

 

resultMap:

查询到的数据库的列,映射成为你喜欢的类型

column    从数据库中得到的列名
property    映射到列结果的字段或属性。如果匹配的是存在的,和给定名称相同的JavaBeans的属性,那么就会使用。否则MyBatis将会找给定名称的字段。
这两种情形你可以使用通常点式的复杂属性导航。比如,你可以这样映射一些东西:“username”,或者映射到一些复杂的东西:“address.street.number”

 

<resultMap id="selectallmap" type="java.util.HashMap">
    <result property="微博用户id" column="id"></result>
    <result property="微博用户" column="username"></result>
    <result property="微博用户别名" column="nickname"></result>
    <result property="微博用户状态" column="status"></result>
    <result property="微博用户创建时间" column="create_at"></result>
    <result property="标记" column="remark"></result>
</resultMap>

查询:

    <select id="selectAll" resultMap="selectallmap"  >
        select * from weibo_user
    </select>

结果:
    {
        "微博用户别名": "",
        "password": "1997",
        "标记": "11",
        "微博用户id": 2,
        "微博用户状态": 1300,
        "微博用户": "quanupdate",
        "微博用户创建时间": "2020-05-05T02:24:20.000+00:00"
    },
    {
        "微博用户别名": "unickname",
        "password": "1111",
        "标记": "22",
        "微博用户id": 3,
        "微博用户状态": 1,
        "微博用户": "zhangsann",
        "微博用户创建时间": "2020-05-05T02:24:24.000+00:00"
    },
    {
        "微博用户别名": "qq",
        "password": "1111",
        "标记": "33",
        "微博用户id": 4,
        "微博用户状态": 1,
        "微博用户": "zhangsan",
        "微博用户创建时间": "2020-05-05T02:24:29.000+00:00"
    },

 

 

 

进行关联查询

评论:

public class WeiboCommont {
    private  int id;
    private String content;
    private Date creat_at;
//    链接到WeiboUser表里面的id的外键
    private int user_id;
    private int weibo_id;

weibouser:
public class WeiboUser {
//    建立与数据库对应的列
    private Integer id;
    private String username;
    private String password;
    private String nickname;
    private short status;
    private Date create_at;
    private String remark;

 

查询:

    <select id="selectById" resultMap="selectallmap" >
        select  wc.content,wu.* from
        weibo_commont wc
        inner join weibo_user wu
        on wc.user_id = wu.id
        where wu.id = #{id}
    </select>
[
    {
        "微博用户别名": "unickname",
        "password": "1111",
        "标记": "22",
        "微博用户id": 3,
        "微博用户状态": 1,
        "content": "zhangsan 评论",
        "微博用户": "zhangsann",
        "微博用户创建时间": "2020-05-05T02:24:24.000+00:00"
    },
    {
        "微博用户别名": "unickname",
        "password": "1111",
        "标记": "22",
        "微博用户id": 3,
        "微博用户状态": 1,
        "content": "zhangsan 评论2",
        "微博用户": "zhangsann",
        "微博用户创建时间": "2020-05-05T02:24:24.000+00:00"
    }
]

 

posted @ 2020-05-29 15:25  小丑quan  阅读(257)  评论(0)    收藏  举报