框架学习笔记之Mybatis(二)

一、动态sql

  通过mybatis提供的标签,实现sql语句的拼接。

  1.where

<select id="findUserList" parameterType="user" resultType="user">
        select * from user
               <!--使用where可以自动处理第一个and-->
        <where>
        <if test="id!=null and id!=‘‘">
        and id=#{id}
        </if>
        <if test="username!=null and username!=‘‘">
        and username like ‘%${username}%‘
        </if>
        </where>
</select>

  2.foreach

  场景:当传入参数为一个数组或者集合时,mybatis提供了foreach标签解析

        <if test="ids!=null">
                <!-- 使用foreach遍历传入的ids
                    collection:输入对象中的集合属性
                    item:每次遍历的生成的对象名
                    open:开始遍历时拼接的串
                    close:结束遍历时拼接的串
                    separator:遍历的两个对象中需要拼接的串
                -->
                <!-- 实现以下拼接
                AND(id=1 or id=2 or id=3)
                 -->
                <foreach collection="ids" item="id" open="AND(" close=")" separator="or">
                    id=#{id}
                </foreach>
        </if>

  3.sql片段

  当sql语句重复使用时,我们可以对sql进行抽取,使用时直接引用,提升代码的复用性。

<!-- 传递pojo综合查询用户信息 -->
    <select id="findUserList" parameterType="user" resultType="user">
        select * from user
        <where>
        <if test="id!=null and id!=‘‘">
        and id=#{id}
        </if>
        <if test="username!=null and username!=‘‘">
        and username like ‘%${username}%‘
        </if>
        </where>
    </select>

  对where条件中的sql进行抽取

<sql id="query_user_where">
    <if test="id!=null and id!=‘‘">
        and id=#{id}
    </if>
    <if test="username!=null and username!=‘‘">
        and username like ‘%${username}%‘
    </if>
</sql>

  引用sql

<select id="findUserList" parameterType="user" resultType="user">
        select * from user
        <where>
        <include refid="query_user_where"/>
        </where>
    </select>

二、关联查询(重点)

resultType和resultMap

  resultType指定输出结果类型,可以是基本类型,也可以 是pojo对象。

  mapper.xml文件

    <!-- 根据id查询用户信息 -->
    <select id="findUserById" parameterType="int" resultType="user">
        select * from user where id = #{id}
    </select>

  resultMap 

  resultType可以指定pojo将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功.

  如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 ,resultMap实质上还需要将查询结果映射到pojo对象中。resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。

  

    <!-- 配置resultmap type:为映射结果类型 -->
    <resultMap type="orders" id="user_orders_resultmap">
        <!-- 配置要映射的订单信息 -->
        <!-- id为要查询对象的唯一标识(orders的主键 ) 如果有多个唯一表示都都配置上即可 column:唯一标识的咧 property:为结果类型的属性 -->
        <id column="id" property="id" />
        <result column="user_id" property="userId" />
        <result column="number" property="number" />
        <result column="createtime" property="createtime" />
        <result column="note" property="note" />
        <!-- 配置要映射的关联用户的信息 -->
        <!-- assocation用来映射关联查询单个对象的信息 property:要将关联的信息映射到Orders中的那个属性 -->
        <association property="user" javaType="cn.mycookies.mybatis.demo.po.User">
            <result column="user_id" property="id" />
            <result column="username" property="username" />
            <result column="sex" property="sex" />
            <result column="address" property="address" />
        </association>
    </resultMap>

1.一对一查询

  场景:查询所有订单信息,关联查询下单用户信息。

注意:因为一个订单信息只会是一个人下的订单,所以从查询订单信息出发关联查询用户信息为一对一查询。如果从用户信息出发查询用户下的订单信息则为一对多查询,因为一个用户可以下多个订单

way1:使用resultType定义返回值结果类型 返回结果为Orders的po类 类中有User属性

mapper.xml配置

<select id="findOrdersListResultMap" resultType="Orders">
    SELECT
    orders.*,
    user.username,
    user.address
    FROM
    orders,    user
    WHERE orders.user_id = user.id
</select>

way2:使用resultMap定义返回 结果类型

<!--定义resultMap-->
<resultMap type="orders" id="user_orders_resultmap">
    <!--配置映射的订单信息-->
  <!-- id为要查询对象的唯一标识(orders的主键 ) 如果有多个唯一表示都都配置上即可 column:唯一标识的咧 property:为结果类型的属性 -->
        <id column="id" property="id" />
        <result column="user_id" property="userId" />
        <result column="number" property="number" />
        <result column="createtime" property="createtime" />
        <result column="note" property="note" />
        <!-- 配置要映射的关联用户的信息 -->
        <!-- assocation用来映射关联查询单个对象的信息 property:要将关联的信息映射到Orders中的那个属性 -->
        <association property="user" javaType="cn.mycookies.mybatis.demo.po.User">
            <result column="user_id" property="id" />
            <result column="username" property="username" />
            <result column="sex" property="sex" />
            <result column="address" property="address" />
        </association>
    </resultMap>
<!-- resultMap映射结果查询 -->
    <select id="findOrdersUserResultMap" resultMap="user_orders_resultmap">
        SELECT orders.*
        ,User.username,User.sex,User.address
        from orders ,user
        where
        orders.user_id = user.id
    </select>

2.一对多查询

案例:查询所有订单信息一级订单下的订单明细

  订单与订单明细是一对多的关系

只能用resultMap实现

<!-- 一对多查询 订单与订单明细 -->
    <resultMap type="orders" id="OrdersAndOrderDetailResultMap"
        extends="user_orders_resultmap">
        <!-- 因为出现了重复 我们可以使用restulemap的继承 -->
        <!-- 订单信息 <id column="id" property="id"/> <result column="user_id" property="userid"/>
            <result column="number" property="number"/> <result column="createtime" property="createtime"/>
            <result column="note" property="note"/> 用户信息 <association property="user"
            javaType="user"> <result column="user_id" property="id"/> <result column="username"
            property="username"/> <result column="sex" property="sex"/> <result column="address"
            property="address"/> </association> -->
        <!-- 订单明细信息 property:po类中对应的属性名 ofType映射到list集合属性中的po类型 -->
        <collection property="orderdetailsList" ofType="Orderdetail">
            <id column="ordertaile_id" property="id" />
            <result column="items_id" property="itemsId" />
            <result column="items_num" property="itemsNum" />
            <result column="orders_id" property="ordersId" />
        </collection>
    </resultMap>
<select id="findOrdersAndOrderDetailsresultMap" resultMap="OrdersAndOrderDetailResultMap">
        SELECT orders.* ,
        User.username,
        User.sex,
        User.address,
        orderdetail.id
        ordertaile_id ,
        orderdetail.items_id,
        orderdetail.items_num,
        orderdetail.orders_id
        from orders ,user,orderdetail
        where orders.user_id
        = user.id and orderdetail.orders_id=orders.id
    </select>

3.多对多的查询

 案例:查询用户购买的商品信息。

需要查询用户信息,关联查询订单和订单明细,通过订单明细关联查询商品信息

    <!--用户与items的 多对多映射关系 -->
    <resultMap type="User" id="userAndItemsResultMap">
        <!-- 用户信息 -->
        <id column="user_id" property="id" />
        <result column="username" property="username" />
        <result column="sex" property="sex" />
        <result column="address" property="address" />

        <!-- 用户所购买的订单信息 -->
        <collection property="ordersList" ofType="orders">
            <id column="id" property="id" />
            <result column="user_id" property="userId" />
            <result column="number" property="number" />
            <result column="createtime" property="createtime" />
            <result column="note" property="note" />
            <!-- 订单明细 -->
            <collection property="orderdetailsList" ofType="orderdetail">
                <id column="orderdetail_id" property="id" />
                <result column="items_id" property="itemsId" />
                <result column="items_num" property="itemsNum" />
                <result column="orders_id" property="ordersId" />
                <!-- 商品明细 一个订单包括一个item -->
                <association property="items" javaType="Items">
                    <id column="items_id" property="id" />
                    <result column="items_name" property="name" />
                    <result column="items_detail" property="detail" />
                    <result column="items_price" property="price" />
                </association>
            </collection>
        </collection>
    </resultMap>
    <select id="findUserandItemsResultMap" resultMap="userAndItemsResultMap">
        SELECT
        orders.*,
        User.username,
        User.sex,
        User.address,
        orderdetail.id
        ordertaile_id ,
        orderdetail.items_id,
        orderdetail.items_num,
        orderdetail.orders_id,
        items.price items_price,
        items.detail
        items_detail,
        items.name items_name
        from orders ,user,orderdetail,items
        where orders.user_id = user.id and
        orderdetail.orders_id=orders.id and
        orderdetail.items_id=items.id
    </select>

总结:

resulttype:将查询的结果按照sql列名pojo属性名一致性映射到pojo中。

  使用场景:常见一些明细记录的展示,比如用户购买商品明细,将关联查询信息全部展示在页面上时,此时可直接使用resultType将每一条记录映射到pojo中,在前端页面遍历list即可。

resultMap:使用association和collection完成一对一和一对多高级映射(对结果有特殊要求时使用)

    association:将关联查询信息映射到一个pojo对象中

    使用场景:为了方便查询关联信息可以使用association将关联订单信息映射到用户对象的pojo属性中,比如,查询订单的用户信息。

    collection:将关联查询信息映射到一个list集合中

    使用场景:为了方便查询遍历关联信息可以使用collection将关联信息映射到一个集合中,比如,查询用户权限范围模块以及模块下的菜单,可以使用collection将模块映射到模块list中,将菜单列表映射到模块对象的list属性中,这样做的目的是方便对查询结果集进行遍历查询。

时间: 2024-10-08 03:46:04

框架学习笔记之Mybatis(二)的相关文章

Yii框架学习笔记(二)将html前端模板整合到框架中

选择Yii 2.0版本框架的7个理由 http://blog.chedushi.com/archives/8988 刚接触Yii谈一下对Yii框架的看法和感受 http://bbs.csdn.net/topics/390807796 更多内容 百度:yii 前端 http://my.oschina.net/u/1472492/blog/221085 摘要 Yii框架学习笔记(二)将html前端模板整合到框架中 原文地址:http://www.ldsun.com/1309.html 上一节成功将Y

Java集合框架学习笔记之集合与Collection API

一.CollectionAPI 集合是一系列对象的聚集(Collection).集合在程序设计中是一种重要的数据接口.Java中提供了有关集合的类库称为CollectionAPI. 集合实际上是用一个对象代表一组对象,在集合中的每个对象称为一个元素.在集合中的各个元素的具体类型可以不同,但一般说来,它们都是由相同的类派生出来的(而这一点并不难做到,因为Java中的所有类都是Object的子类).在从集合中检索出各个元素是,常常要根据其具体类型不同而进行相应的强制类型转换. Collection

mybatis学习笔记(14)-mybatis整合ehcache

mybatis学习笔记(14)-mybatis整合ehcache mybatis学习笔记14-mybatis整合ehcache 分布缓存 整合方法掌握 整合ehcache 加入ehcache的配置文件 ehcache是一个分布式缓存框架 分布缓存 我们系统为了提高系统并发,性能.一般对系统进行分布式部署(集群部署方式) 不使用分布缓存,缓存的数据在各各服务单独存储,不方便系统开发.所以要使用分布式缓存对缓存数据进行集中管理. mybatis无法实现分布式缓存,需要和其它分布式缓存框架进行整合.

JavaSE中线程与并行API框架学习笔记1——线程是什么?

前言:虽然工作了三年,但是几乎没有使用到多线程之类的内容.这其实是工作与学习的矛盾.我们在公司上班,很多时候都只是在处理业务代码,很少接触底层技术. 可是你不可能一辈子都写业务代码,而且跳槽之后新单位很可能有更高的技术要求.除了干巴巴地翻书,我们可以通过两个方式来解决这个问题:一是做业余项目,例如在github上传自己的demo,可以实际使用:二是把自己的学习心得写成博客,跟同行们互相交流. 3.1 线程的初窥门径 我们在之前的文章里提到的程序其实都是单线程程序,也就说启动的程序从main()程

YMP框架学习笔记(三)------处理器、控制器、拦截器

一.处理器 1.事件处理器 添加类WebEventHandler.java并继承IWebEventHandler public class WebEventHandler implements IWebEventHandler { public void onInitialized() { } public void onRequestReceived(IRequestContext context) { } public void onRequestCompleted(IRequestCont

windows下scrapy框架学习笔记—&#39;scrapy&#39; 不是内部或外部命令

最近几天在深入的学习scrapy框架,但是装完各种需要的基础包之后却发现scrapy命令在别的路径下都用不了,我一开始是把python安装在F:\Python路径下的,安装了scrapy后它默认都会安装在这个路径下,scrapy在路径F:\Python\Scripts路径下,我的scrapy命令只能在此路径下用,因此创建什么工程也都只能在此文件下. 想了一下它的工作原理:它在F:\Python\Scripts路径下,就会在Scripts文件下存在一个scrapy批处理文件,那么在DOS下想要命令

SaltStack 学习笔记 - 第十二篇: SaltStack Web 界面

SaltStack 有自身的用python开发的web界面halite,好处是基于python,可以跟salt的api无缝配合,确定就比较明显,需要个性化对web界面进行定制的会比较麻烦,如果喜欢体验该界面的可以参考下面的文章  http://rfyiamcool.blog.51cto.com/1030776/1275443/ 我是运用另一个python+php来进行web开发,具体需要的工具有在我的另一篇文章里面介绍过,这里再重新进行整个开发介绍 首先介绍php 跟python通信的工具 pp

【Unity 3D】学习笔记四十二:粒子特效

粒子特效 粒子特效的原理是将若干粒子无规则的组合在一起,来模拟火焰,爆炸,水滴,雾气等效果.要使用粒子特效首先要创建,在hierarchy视图中点击create--particle system即可 粒子发射器 粒子发射器是用于设定粒子的发射属性,比如说粒子的大小,数量和速度等.在创建完粒子对象后,在右侧inspector视图中便可以看到所有的粒子属性: emit:是否是使用粒子发射器. min size:粒子最小尺寸. max size:粒子最大尺寸. min energy:粒子的最小生命周期

马哥学习笔记三十二——计算机及操作系统原理

缓存方式: 直接映射 N路关联 缓存策略: write through:通写 write back:回写 进程类别: 交互式进程(IO密集型) 批处理进程(CPU密集型) 实时进程(Real-time) CPU: 时间片长,优先级低IO:时间片短,优先级高 Linux优先级:priority 实时优先级: 1-99,数字越小,优先级越低 静态优先级:100-139,数据越小,优先级越高 实时优先级比静态优先级高 nice值:调整静态优先级   -20,19:100,139   0:120 ps