Mybatis 动态SQL详解

  • Mybatis 特点
    • 开源的优秀的持久层框架
    • SQL 语句与代码分离
    • 面向配置的编程
    • 良好支持复杂数据的映射
    • 动态SQL

  • Mybatis 环境搭建
    • 下载
    • 导入mybatis.jar 
    • 配置Log4j 可以打印出SQL,必须把Log4j的日志级别改为 DEBUG 才能打印出SQL,如:
      • log4j.rootLogger = DEBUG,Console
      • #Console
      • log4j.appender.Console = org.apache.log4j.ConsoleAppender
      • log4j.appender.Console.Layout = org.apache.log4j.PatternLayout
      • log4j.appender.Console.Layout.ConversionPattern = %d [%t] %-5p [%c] - %m%n

      • log4j.logger.java.sql.ResultSet = INFO
      • log4j.logger.org.apache = INFO
      • log4j.logger.java.sql.Connection = DEBUG
      • log4j.logger.java.sql.Statement = DEBUG
      • log4j.logger.java.sql.PreparedStatement = DEBUG

  • Mybatis 的工作流程
    • 概述
      • 读取基本配置文件(包含连数据库的相关信息)
      • 生成SqlSessionFactory 
      • 建立Session
      • 调用 Mybatis 的 API
      • 查询Map配置
      • 返回结果
      • 关闭 SqlSession
    • 配置文件(基本配置文件与Mapper配置文件)
      • 增删改操作相关配置
        • Insert
        • Delete
        • Update
      • 简单查询
        • id :在命名空间中唯一的标识符,可以用来引用这条语句
        • parameterType:将会传入这条SQL语句的参数类的完全限定名或别名
        • parameterMap:这是引用外部parameterMap的已经废弃的方法,使用内联参数映射和ParameterType属性。
        • resultType:从这条语句返回的期望类型的类的完整限定名或别名,注意集合情形,那应该是返回集合的泛型类,而不是集合类,resultType和resultMap不能同时使用
        • resultMap:命名引用外部的resultMap,返回Map是Mybatis最具有力量的特征,能够解决许多复杂映射的情形,如多表联查
        • flushCache:刷新缓存,设置为true的话,不论是什么语句都会清空缓存,默认为false
        • useCache:设置为true,会导致本条语句的结果被缓存,默认为true
        • timeout:设置查询等待数据库返回结果超时的时间,超时会抛出异常,默认不设置,交给驱动器去处理
        • fetchSize:设置每次批量查询返回结果的行数,默认不设置
        • statementType :是否预处理,默认预处理
          • STATEMENT 非预编译
          • PREPARED 预编译
          • CALLABLE 存储过程
    • 通过配置文件建立 SqlSession,SqlSessionFactory
      • SqlSessionFactory 的生命周期是应用级的,随着应用的开启和关闭而开启和关闭
      • SqlSession的生命周期是过程级别的

  • Mybatis 高级查询
    • 关联查询
      • 联合查询
      • 构造查询
      • 子查询
    • 集合查询
    • 鉴别器

  • 动态SQL
    • if标记
      • 如:
        • <if test=“money!=null">
          • and money = #{money}
        • </if>
    • choose标记(类似于Switch)
      • 如:
        • select * from user where 1=1
          • <choose>
            • <when test=“userName!=null">
              • and userName = #{userName}
            • </when>
            • ...
            • <otherwise>
              • and password is not null
            • </otherwise>
          • </choose>

    • where标记
      • 智能条件,相比之下,他不需要where 1 = 1,如:
        • select * from user
        • <where>
          • <if test=“money!=null">
            •  money = #{money}
          • </if>
          • <if test=“userName!=null">
            • userName = #{userName}
          • </if>
        • </where>
    • set标记
      • 用于update操作,智能去除逗号,如:
        • update user
        • <set>
          • <if test = “userName!=null”> userName = #{userName},</if>
          • <if test = “userPass!=null”> userPass = #{userPass},</if>
        • </set>
    • trim标记,格式化标记,可以与其他标记混合使用完成where与set的功能
      • prefix:前缀增加
      • suffix:后缀增加
      • prefixOverrides : 自动判断前缀
      • suffixOverrides :自动判断后缀
        • 代替set,如:
          • <trim prefix=“set” suffix=“where id = #{id}” suffixOverrides=“,">
            • <if test=“userName!=null">
              • userName = #{userName}
            • </if>
            • ……
          • </trim>
    • foreach
      • 属性描述
        • item : 每一次迭代结果
        • collection :循环集合或者指定类型
        • separator :元素之间的分隔符,可选
        • open :开始符号,可选
        • close :关闭符号,可选
        • index :list和数组的序号,可选
      • 循环查询,如:
        • <foreach item=“item” index=“index” collection=“list” open+”(“ close=“)” separator=“,">
          • #{item}
        • </foreach>
      • 循环赋值
        • insert 中的foreach,使用集合一次增加多个用户,如:
          • insert into user (userName,userPass) values
          • <foreach item=“item” index=“key” open=“” close=“” separator=“,">
            • (#{userName},#{userPass}),
          • </foreach>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值