zoukankan      html  css  js  c++  java
  • Mapper XML的写法 [Mybatis]

    Mapper XML的写法 [Mybatis]

    MyBatis是半ORM(java对象 & DB数据  映射)框架,封装JDBC。(Hibernate全自动ORM不用写SQL,MyBatis要写SQL)

    MyBatis的强大在于映射语句,针对SQL构建,比JDBC节约代码。

    SQL映射文件的顶级元素:

    cache、cache-ref

    resultMap 自己写ORM映射

    最复杂最强大的元素,用来描述如何从数据库结果 集中来加载对象。
    sql 可被其他语句引用的 可重用语句块

        <resultMap id="resultMapInput" type="domain.InputDo" >
            <id column="PARAM_ID" property="paramId"/>
            <result column="PLAN_ID" property="planId"/>
            <result column="PARAM_NAME" property="paramName"/>
            <result column="VALUE" property="value"/>
            <result column="PARAM_UNIT" property="paramUnit"/>
        </resultMap>
    //使用resultMap进行映射:左边一排colomn是数据库里面的名称,右边是java后端里面的驼峰式;

    然后可以在后面多次使用:

        <select id="getParamInput" resultMap="resultMapInput">
            select ID as PARAM_ID,PARAM_NAME,PARAM_UNIT,PARAM_PART from t_biz_params
            where PARAM_MODULE = #{paramModule} and DEL_FLAG = 0 order by ORDER_NUM
        </select>
    
        <select id="getParamInputAndValue" resultMap="resultMapInput">
            select t_biz_params.ID as PARAM_ID,t_biz_params.PARAM_NAME,t_biz_params.PARAM_UNIT,t_biz_params.PARAM_PART,t_biz_plan_input.VALUE
            from t_biz_params,t_biz_plan_input
            where t_biz_plan_input.PLAN_ID=#{planId}
            and t_biz_plan_input.PARAM_ID = t_biz_params.ID
            and t_biz_params.PARAM_MODULE = #{paramModule}
            and t_biz_plan_input.DEL_FLAG =0 and t_biz_params.DEL_FLAG=0
            order by t_biz_params.ORDER_NUM
        </select>

      


    namespace

      

      这个要与dao文件对应起来,类似于mapper.xml来实现dao文件里的抽象方法

    select 

    <select id="selectPerson" parameterType="int" resultType="hashmap">
      SELECT * FROM PERSON WHERE ID = #{id}
    </select>    

    id: 对应方法的名字(与dao文件中的方法名字对应) selectPerson,
    parameterType: 接受一个 int(或 Integer)类型的参数,
    resultType: 返回一个 HashMap 类型的对象,

    insert  update  delete

     

     

     

     动态SQL

      动态SQL根据不同条件生成不同的SQL语句。

      动态 sql 语句的编写往往就是一个拼接的问题,为了保证拼接准确,我们最好首先要写原生的 sql 语句出来,然后在通过 mybatis 动态sql 对照着改,防止出错。

    • if
    • choose (when*n,otherwise)
    • trim (prefix,suffix)
    • foreach

    if  条件SQL语句(满足条件才执行)

       

     select会用到where:

      

     update会用到set (不举例了)

    choose (when*n个,otherwise)相当于switch

      相当于java里面的switch  case break;(遇到符合的一个后不会继续往下,而普通的case需要break来拦截继续向下)

      

    trim prefix,suffix)自定义拼凑SQL

      trim用于改写上面的where、set:

    • where-->trim
    • set-->trim

      

      

       

       

    foreach 用于遍历

      

      1)

       

      

       2)

       

      

     建议是先把SQL语句写出来,再转换成Mybatis.xml里面的"条件SQL语句"


     内嵌SQL


     对mybatis 之数据库 include refid ="base_column_list" 的粗略见解:

    <sql>用来封装SQL语句, <include refid>来调用

    如果用了refid="base_column_list"则:

    1、首先定义一个sql标签,一定要定义唯一id<sql id="Base_Column_List" >字段名1,字段名2</sql>
    2、然后通过id引用
    <select id="selectAll">
    select
    <include refid="Base_Column_List" />
        from 表名
    </select>

    这时<include refid="Base_Column_List" />会自动把上面的代码贴过来。

    数据库中查询的语句就可以解析为:select 字段名1,字段名2  from 表名


    <include refid="Base_Column_List" > 这个在MyBatis查询数据库的sql中经常会出现。它的在上面已经定义,作用相当于 * ,

    Base_Column_List是固定的几个字段,而用*号的话会降低查询效率,因为后期数据库的字段会不断增加。

     Mybatis缓存

    适合缓存的场景:

      查询多,改变少【读多写少】

    Mybatis缓存

      

     

      查询时:

        先找二级缓存(硬盘) ==》一级缓存(内存)==》数据库

        一级缓存在内存,二级缓存在硬盘

    一级缓存(默认,内存上,1个CRUD)

       

      一级缓存是个Map

      使用场景:一个用户不断刷新页面

    二级缓存(手动开启,硬盘上,1个Mapper.xml——多个CRUD)

      

      在mapper.xml里面加上:

      60s刷新,最多512个引用,返回对象只读

      

      我们需要使用SqlSession对象的close()方法(关闭连接),达到手动序列化:

    session.close();//手动序列化二级缓存:关闭会话,让一级缓存==》二级缓存中

    ehcache  用在Hibernate多;

    后面重点学redis就好了

    https://www.bilibili.com/video/BV1NE411Q7Nx?p=30

    日志

    日志工厂

       如果数据库操作,出现bug,日志帮助排错

    下面是两种常用的日志: 

    STDOUT_LOGGING  标准日志输出

       在中引入:

      

    打印整个使用数据库的流程:

        

    Log4j  

    配置步骤:

      1.  导入log4j的包(maven)

      2.  log4j.properties(详细配置)

      3.  在中引入:注意:LOG4J全大写

    使用步骤:

      

       

       

        


    其他

    多对一 association

      比如多个学生对应一个老师

      在domain里面:

      

     查询学生信息,以及学生对应老师的信息:

       

     完整的pid子查询(重要,记忆):

     对应的mapper.xml:

      1.  按照查询嵌套(子查询)处理:

       

     

      

       2.  按照结果嵌套(联表查询)处理:

        结果是Student类型:

        

       

     一对多 collection

       

       

     不清楚再回去看看:https://www.bilibili.com/video/BV1NE411Q7Nx?p=21

     



    sqlSessionFactory

      我写的时候并没有遇到??

    配置解析

      核心配置文件mybatis-config.xml

      

       https://www.bilibili.com/video/BV1NE411Q7Nx?p=6      1:47



     Junit中测试代码:

    (不写测试类行不行??)

    我写的时候,因为mabatis和controller、service层都比较简答,所以就直接全部走通、用postman来测试的;

    如果各个部分比较复杂的话,可以从中间切断、直接像这样来测dao+mybatis部分的代码:

      

    增删改(查不用)需要提交事务:

       


     一些杂碎的技术细节:

      mybatis.xml里面 &amp;相当于and

     

     resource用斜杠隔开;class用点隔开;


    ${} 解析参数 => 存在sql注入的风险。

    • 如果传入的是基础数据类型; 大括号中只能写一个叫做value, 也就是说${value};
    • 如果传入的pojo或者map类型, 那么只能写属性名或key名:${username};

    #{} 拼接参数 => 防止sql注入风险

      如果传入的是字符串;预编译时会自动带上单引号'


    Select 书写顺序

    SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY

    Select  执行顺序(select调后,到排序前)

    FROM → WHERE → GROUP BY → HAVINGSELECT → ORDER BY

    HAVING和WHERE的区别:在GROUP BY的前后

    GROUP BY的作用是按属性(列)进行分组【通常针对COUNT/MAX/...】

    HAVING和WHERE都是针对行的筛选


    JOIN 和 UNION 的理解:

    • 表的加法 (UNION)  //行数变多
    • 以列为单位对表进行联结 (JOIN)     //属性变多(横向扩展)//如果没有where进行筛选,就是笛卡尔积

    //内连接:两张表的连接id都有的记录(行)才可以

    //左连接:左表的每行只多不少,不匹配的就使右表相应字段为空

     

  • 相关阅读:
    ipandao markdown mathjax版本
    我们是不是太关注于语法而忽略了算法
    SVGG.JS 入门教程
    关于ipandao编辑器手机访问换行问题
    启明星采购系统新版发布
    仿MSDN的帮助系统
    十分钟打造一款在线的数学公式编辑器
    Search Filter Syntax
    从华为养猪说起,聊聊我对中国计算机发展的一个遗憾-为何我们没有开发出自己的编程语言
    从.NET看微软的焦虑
  • 原文地址:https://www.cnblogs.com/qyf2199/p/13817000.html
Copyright © 2011-2022 走看看