随笔Mybatis加强

Sql映射器Mapper

MyBatis基于动态代理机制,让我们无需再编写Dao的实现。
传统Dao接口,现在名称统一以Mapper结尾,还有我们映射器配置文件要和映射器在同一个包.:

  • 使用映射器步骤

1、根据需求,创建模型相关的Mapper接口(UserMapper)
2、编写映射文件
a)Mapper。Xml的命名空间,必须和接口的“全限定名”一致
b)定义sql标签的id,需要和“接口的方法”一致
3、配置映射文件

高级查询(字符串拼接部分)

  • 使用’ ’ 拼接
  • 使用Mysqlconcat函数
...
<sql id="qqq">
        <!--高级查询引号拼接-->
        <if test="keyWords != null" >
            <!--使用单引号拼接只能使用$符号,不能使用#号,因为#是以?形式接入sql语句-->
            AND productName LIKE '%${keyWords}%' OR brand LIKE '%${keyWords}%'
        </if>
        <!--高级查询使用sql concat函数拼接-->
        <if test="keyWords != null">
            AND productName LIKE concat('%',#{keyWords},'%') OR brand LIKE concat('%',#{keyWords},'%')
        </if>
    </sql>
    ...

结果映射ResultMap

MyBatis提供两种方式处理我们关联对象,嵌套查询和嵌套结果。

  • 嵌套结果: 发送1条SQL,查询所有的信息(本身+关联对象)
  • 嵌套查询:发送1+N条sql。又根据不同情形大致分为四类
多对一,一对一
嵌套结果

这种方式,所有属性都要自己来

<!--嵌套结果 1条sql id 结果Map的值 type:返回类型 -->
    <select id="resultQuery" resultMap="employeeMap">
        select e.id,e.name,e.age,d.id did,d.name dname from employee e JOIN dept d ON e.dept_id=d.id
    </select>
    <resultMap id="employeeMap" type="employee">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="age" property="age"/>
        <association property="dept" javaType="Dept">
            <id column="did" property="id"/>
            <result column="dname" property="name"/>
        </association>
    </resultMap>
嵌套查询

通过执行另外一个SQL映射语句来返回预期的复杂类型。

<!--嵌套查询 1+N条sql-->
    <select id="query" resultMap="empMap">
        select * from employee
    </select>
    <resultMap id="empMap" type="employee">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="age" property="age"/>
        <association property="dept" column="dept_id" select="findDept">

        </association>
    </resultMap>
    <select id="findDept" parameterType="long" resultType="dept">
        select * from dept WHERE id=#{id}
    </select>
一对多,多对多
嵌套结果
 <!--嵌套结果-->
    <select id="resultQuery" resultMap="TeacherMap">
        SELECT  t.id,t.name, s.id   sid, s.age, s.name sname
        FROM teacher t LEFT JOIN student s ON t.id = s.teacher_id
    </select>
    <resultMap id="TeacherMap" type="teacher">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <!--property 类里面属性 javaType集合属性 ofType集合里面类型-->
        <collection property="students" javaType="arraylist" ofType="student">
            <id column="sid" property="id"/>
            <result column="age" property="age"/>
            <result column="sname" property="name"/>
        </collection>
    </resultMap>

缓存

MyBatis支持缓存:
一级缓存: SqlSession级别缓存,缓存对象存储周期为第一次获取,到sqlsession被销毁掉,或是sqlSession().clearCache();

二级缓存: SqlSessionFactory级别缓存,缓存对象存储周期为第一次获取,到SqlSessionFactory被销毁掉(应用停止了);

默认情况下,只开启一级缓存,如果需要开启二级缓存我们需要在Mapper.xml添加一个标签

 <cache>    </cache>

缓存对象必须实现Serializable接口

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值