【mybatis】【映射文件】【动态sql(高级查询)】

映射文件

1.大致结构

1.根节点中命名空间=mapper接口全限名
2.子节点 二级缓存的启动
3.子节点 声明属性和列的对应
4.子节点 sql的语句

<mapper namespace="UserMapper的全限名">
    <!--使用缓存-->
    <cache/>
    <!-- 声明属性和列的对应 -->
    <resultMap/>
    <!-- sql标签 -->
    <insert/>+<select/>+<delete/>+<update/>
</mapper>

2.属性和列的对应

1.<resultMap>标签的属性:

  • rype:表示映射的domain类(本来用全限名,可在配置文件起别名,直接用简单名User)
  • id:该标签的名字, 取为(user_mapping)

2.<resultMap>标签的子标签:

  • <id>:用于声明主键列和属性
  • <result>: 用于声明普通列和属性

3.子标签的属性:

  • column:表示数据库的列名
  • property:表示domain中的属性名
    <!-- 声明属性和列的对应 -->
    <resultMap type="User" id="user_mapping">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="age" property="age"/>
        <result column="birthday" property="birthday"/>
    </resultMap>
<!-- 此处birthday的类型的Date 对应数据库的datetime,但会根据数据库的类型自动转换(比如数据库为time,最后保留时分秒) -->

3.sql标签

1 . 种类 :增删改查

    <insert id="add"></insert>
    <delete id="delete"></delete>
    <select id="get"></select>
    <update id="update"></update>

2.标签的属性

  • keyColumn:  主键列             (添加时候使用)
  • keyProperty:  主键对应的属性         (添加时候使用)
  • useGeneratedKeys:是否数据库生成主键     (添加时候使用)
  • parameterType: 对应Mapper接口方法的形参类型
  • id:    对应Mapper接口方法的名字
  • resultType : 每一行的返回类型(全限名或别名)
  • resultMap : <resultMap >的id值,等价于resultType=resultMap中的type值
  • 文本:sql语句,使用 #{key} 的方式,代替值,
<!-- sql语句 -->
    <!--增-->
    <insert id="add" keyColumn="id" keyProperty="id" useGeneratedKeys="true" parameterType="User">
        insert into user(name,age,birthday) values ( #{name},#{age},#{birthday})    
    </insert>
    <!--删-->
    <delete id="delete" parameterType="Long">
        delete from user where id=#{id}
    </delete>
    <!--改-->
    <update id="update" parameterType="User">
        update user set name=#{name},age=#{age},birthday=#{birthday} where id=#{id}
    </update>
    <!--get查-->
    <select id="get" parameterType="Long" resultMap="user_mapping">
        select * from user where id=#{id}
    </select>
    <!--list查-->
    <select id="list"  resultMap="user_mapping">
        select * from user
    </select>
    <!--计算总数-->
    <select id="count"  resultType="Integer">
        select count(*) from user 
    </select>

动态sql

1. where标签:
 当标签内有文本时候:添加where开头,代替文本中的and 或or
 当标签中无文本时候:不做操作.

2. <if test="条件语">文本</if>
条件语句,一般会用于判断传递的参数是否为空.

高级查询时候使用

//高级查询类
public class UserQueryObject {
private String name;
private Integer min_age;
private Integer max_age;
}

<!--使用动态sql,免去拼接sql的麻烦-->
    <select id="getPageList"  parameterType="UserQueryObject" resultMap="user_mapping">
        select * from user 
        <where>
            <if test="name!=null">and name like #{name}</if>
            <if test="max_age!=null">and age &lt;= #{max_age}</if>
            <if test="min_age!=null">and age &gt;= #{min_age}</if>
        </where>
    </select>
2 . <choose>,<when>,<otherwise> :相等于if +else if +else
<choose>
    <when test="条件语">XXX</when>
    <when test="条件语2">XXX</when>
    <otherwise>XXX</otherwise>
</choose>
3.set标签:
在Hibernate中,更新一个对象前,需要用perpare拦截器提取取值,防止null覆盖不可编辑的列.在mybatis中,可以设置set标签,控制sql,将为null的属性,不写入sql.

作用:
    当文本中有值时,添加set,并去掉最后一个逗号
    当文本没值时,不做操作.
    <update id="update" parameterType="User">
        update user 
        <set>
        <if test="name!=null">name=#{name},</if>
        <if test="age!=null">age=#{age},</if>
        <if test="birthday!=null">birthday=#{birthday} ,</if>
        </set>
        where id=#{id}
    </update>
3.foreach标签

常用于批量删除
标签中的属性

  • ollection:集合无视参数的名,只填list/array
  • open:遍历前,需要添加的字符串
  • close:遍历完,需要添加的字符串
  • seprator,每次遍历完.需要添加的字符串
  • index : 当前遍历的元素的索引 #{index值} ,输出索引
  • item: 当前遍历到的元素 #{item值} ,输出元素
    void delete(Long...ids);
    <delete id="delete">
        delete from user where id in 
        <foreach collection="array" open="(" close=")" item="item" separator=",">
            #{item}
        </foreach>
    </delete>
4.trim标签

该标签是where和set标签的底层
属性:

  • prefix:在内容前加入的字符串
  • suffix:在内容结尾加入的字符串
  • prefixOverrides: 若开头有这个值,就删去
  • suffixOverrides:若末尾有这个值,就删去这个值
<!--模拟where-->
<trim prefix="where" prefixOverrides="AND|OR">文本</trim>

<!--模拟set-->
<trim prefix="set" suffixOverrides=",">文本</trim>
5.提取通用的sql片段

高级查询中,需要查询结果的list,还要查询结果的count.但其条件语句是相同的,可以抽取出来
使用<sql id="myid">文本</sql>抽取
使用<include refid="myid"/>调用

<!--抽取sql判断-->
<sql id="user_condition">
    <where>
        <if test="name!=null">and name like #{name}</if>
        <if test="max_age!=null">and age &lt;= #{max_age}</if>
        <if test="min_age!=null">and age &gt;= #{min_age}</if>
    </where>
<sql>

<!--查询list-->
    <select id="getPageList"  parameterType="UserQueryObject" resultMap="user_mapping">
        select * from user 
        <include refid="user_condition"/>
    </select>

<!--查询count-->
    <select id="getPageCount"  parameterType="UserQueryObject" resultMap="user_mapping">
        select count(*) from user 
        <include refid="user_condition"/>
    </select>
6.分页查询

currentPage:从前台获取当前页
pagesize:从前台获取每页个数
封装成高级查询对象

//高级查询类中 返回limit中的第一个参数(第二个参数就是pagesize)
public int getStart(){
    return (currentPage-1)*pageSize;
} 
<!--在sql语句之后添加-->
LIMIT #{start}, #{pageSize}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值