【十一】Mybatis学习笔记

《小吴同学的Mybatis学习之路》点击此处查看完整项目

  • 1.Mybatis_01_HelloWorld
    • 接口式编程
  • 2.Mybatis_02_config (标签顺序很重要)

    • 2.1mybatis可以使用properties来引入外部properties配置文件的内容
      • resource:引入类路径下的资源
      • url:引入网络路径或者磁盘路径下的资源
        如果 在某个包下 则com/wq/dbconfig.properties
    • 2.2 settings包含很多重要的设置项
      • setting:用来设置每一个设置项
      • name:设置项名
      • value:设置项取值
    • 2.3 typeAlias为某个java类型起别名
      • type:指定要起别名的类型全类名;默认别名就是类名小写;employee
      • alias:指定新的别名
      • package:为某个包下的所有类批量起别名 name:指定包名(为当前包以及下面所有的后代包的每一个类都起一个默认别名(类名小写))
      • 批量起别名的情况下,如果有重复类,则使用@Alias注解为某个类型指定新的别名
    • 2.4environments:环境们,mybatis可以配置多种环境 ,default指定使用某种环境。可以达到快速切换环境。
    • 2.5databaseIdProvider:支持多数据库厂商;
    • 2.6sql映射文件注册到全局配置文件mybatis-config.xml
      • 注册配置文件
        • resource:引用类路径下的sql映射文件 mybatis/mapper/EmployeeMapper.xml
        • url:引用网路路径或者磁盘路径下的sql映射文件 file:///var/mappers/AuthorMapper.xml
      • 注册接口 (一般将mapper文件和dao放在相同的包名下,比如一个在src的包名com.wq.dao,另一个在conf下的包名com.wq.dao中)
        • class
          • 1.有sql映射文件,映射文件名必须和接口同名,并且放在与接口同一目录下;
          • 2.没有sql映射文件,所有的sql都是利用注解写在接口上;
        • 推荐
          • 1.比较重要的,复杂的Dao接口我们来写sql映射文件
          • 2.不重要,简单的Dao接口为了开发快速可以使用注解;
  • 3.Mybatis_03_mapper

    • 3.1 增删改操作,特别是添加时获取插入的主键值

      • mysql支持自增主键,自增主键值的获取,mybatis也是利用statement.getGenreatedKeys();
        useGeneratedKeys="true";使用自增主键获取主键值策略
        keyProperty;指定对应的主键属性,也就是mybatis获取到主键值以后,将这个值封装给javaBean的哪个属性
      • oracle获取非自增主键的值:Oracle不支持自增;Oracle使用序列来模拟自增;每次插入的数据的主键是从序列中拿到的值;
        keyProperty:查出的主键值封装给javaBean的哪个属性
        • Order: "BEFORE":当前sql在插入sql之前运行
          AFTER:当前sql在插入sql之后运行
          • BEFORE运行顺序:
            先运行selectKey查询id的sql;查出id值封装给javaBean的id属性
            在运行插入的sql;就可以取出id属性对应的值
          • AFTER运行顺序:
            先运行插入的sql(从序列中取出新值作为id);
            再运行selectKey查询id的sql;
        • resultType:查出的数据的返回值类型
    • 3.2 mybatis参数处理(详见项目路径下mybatis参数处理.txt)

      • 1.单个参数 ====》#{id}
      • 2.多个参数 ====》#{param1},#{param2}
      • 2.pojo Employee ====》#{e.lastName} 【推荐】
      • 3.Map ====>直接#{id},#{lastName}
      • 4.List====>#{list[0]}
      • ...其余略
    • 3.3 ‘#’与$的区别

      • ‘#{}’:是以预编译的形式,将参数设置到sql语句中;PreparedStatement;防止sql注入
      • ‘${}’:取出的值直接拼装在sql语句中;会有安全问题;
        大多情况下,我们去参数的值都应该去使用#{};
    • 3.4 jdbcType=NULL Oracle的相关配置

      • 在我们数据为null的时候,有些数据库可能不能识别mybatis对null的默认处理。比如Oracle(报错);
        • JdbcType OTHER:无效的类型;因为mybatis对所有的null都映射的是原生Jdbc的OTHER类型,oracle不能正确处理;
          • 由于全局配置中:jdbcTypeForNull=OTHER;oracle不支持;两种办法
            • 1、#{email,jdbcType=OTHER};
            • 2、jdbcTypeForNull=NULL
              <setting name="jdbcTypeForNull" value="NULL"/>
              
    • 3.5 resultType练习

      • 返回list时,resultType设为定义集合中返回元素的类型;
      • 返回Map(key是数据库的字段,value是对应的值)时,resultType设为java.util.Map【别名map】,map是mybatis能识别的别名;
      • 返回Map(指定key,key为JavaBean中的属性名)时,resultType设为JavaBean名称(如:employee);
      • 返回Map集合时,resultType设为定义集合中Map元素的类型;
    • 3.6 resultMap练习【详见EmployeeMapperPlus】

      • 它与resultType只能二选一;
      • 级联属性封装结果集;
      • 使用association定义关联的单个对象的封装规则;
        • property="dept":指定哪个属性是联合的对象
        • javaType:指定这个属性对象的类型【不能省略】
      • 使用association进行分步查询:
        • select:表明当前属性是调用select指定的方法查出的结果
        • column:指定将哪一列的值传给这个方法
        • 流程:使用select指定的方法(传入column指定的这列参数的值)查出对象,并封装给property指定的属性
      • 使用延迟加载(懒加载)(按需加载),在mybatis-config.xml中开启懒加载
        • mybatis-config中配置如下:
          <!--懒加载-->
          <setting name="lazyLoadingEnabled" value="true"/>
          <!--默认是true 会加载全部属性 如果设为False,只加载想要的属性-->
          <setting name="aggressiveLazyLoading" value="false"/>
          
    • 3.7 关联集合collection

      • 不分步:
        • property:集合名字(如:员工列表属性名称emps,必须和部门Javabean中的员工列表属性名一致)
        • ofType:集合中元素的类型(如:com.wq.bean.Employee)
      • 分步:
        • property:集合名字(如:员工列表属性名称emps,必须和部门Javabean中的员工列表属性名一致)
        • select:关联的sql查询,(如:com.wq.dao.EmployeeMapperPlus.getEmpsByDeptId)
        • column:关联的sql里面需要的入参,比如是部门的id("id")
          • 如果多个参数时,column="{key1=column1,key2=column2}"
        • fetchType (即使全局已经配置了懒加载,也可以单独设为eager)
          • lazy:延迟
          • eager:立即
  • 4.Mybatis_04_DynamicSql动态Sql

    • if
    • choose(when,otherwise)
    • trim(where,set)
    • foreach
    • bind
    • include 引入一个通用的sql
      • <include refid="selectSql">
  • 5.Mybatis_05_cache

    • 5.1 一级缓存(SqlSession级别的一个Map)
      • sqlSession级别的缓存。一级缓存是一直开启的;
      • 与数据库同一次会话期间查询到的数据会放在本地缓存中。
      • 失效情况:
        • (1)sqlSession不同
        • (2)sqlSession相同,查询条件不同.(当前一级缓存中还没有这个数据)
        • (3)sqlSession相同,两次查询之间执行了增删改操作(这次增删改可能对当前数据有影响)
        • (4)sqlSession相同,手动清除了一级缓存(缓存清空)
    • 5.2 二级缓存(全局缓存,基于namespace级别)
      • 工作机制:
        • (1)一个会话,查询一条数据,这个数据就会被放在当前会话的一级缓存中;
        • (2)如果会话关闭;一级缓存中的数据会被保存到二级缓存中;新的会话查询信息,就可以参照二级缓存中的内容;
      • 使用:
        • (1)开启全局二级缓存配置:<setting name="cacheEnabled" value="true"/>
        • (2)去mapper.xml中配置使用二级缓存:
          • <cache></cache>
            
        • (3)我们的POJO需要实现序列化接口
    • 5.3 和缓存有关的设置/属性
      • 1)、cacheEnabled=true:false:关闭缓存(二级缓存关闭)(一级缓存一直可用的)
      • 2)、这个始终在前面配置使用二级缓存三大条件不可缺一的情况下测试,每个select标签都有useCache="true";false:不使用缓存(一级缓存依然使用,二级缓存不使用)
      • 3)、【每个增删改标签的:flushCache="true":(一级二级都会清除)】
        • 增删改执行完成后就会清除缓存;
        • 测试:flushCache="true":一级缓存就清空了;二级也会被清除;
        • 查询标签:flushCache="false";如果flushCache=true;每次查询之后都会清空缓存;缓存是没有被使用的;
      • 4)、sqlSession.clearCache();只是清楚当前session的一级缓存;
      • 5)、localCacheScope:本地缓存作用域:(一级缓存SESSION);当前会话的所有数据保存在会话缓存中;STATEMENT:可以禁用一级缓存;
  • 6.Mybatis_06_ssm(Spring+SpringMVC+Mybatis整合测试)

    • 6.1 相关配置
      • 6.1.1 web.xml
        - 监听Spring、SpringMVC配置
      • 6.1.2 applicationContext.xml
        - Spring相关配置:引入数据库配置文件、事务管理、开启基于注解的事务、扫描所有的mapper接口的实现等。
      • 6.1.3 spring-servlet.xml
        - SpringMVC相关配置:扫描控制器、视图解析器等
  • 7.Mybatis_07_mbg(Mybati逆向工程)

  • 8.Mybatis_08_source(源码解读,了解Mybatis工作原理)

    • 工作原理


      图8.1Mybatis工作原理.png
    • 四大对象

      • Executor
      • StatementHandler
      • ParameterHandler
      • ResultSetHandler
图8.2 mybatis-sqlSessionFactory-init时序图.png
图8.3 mybatis-openSession时序图.png
图8.4 Mybatis-getMapper时序图.png
图8.5 Mybatis-invoke(上).png
图8.6 Mybatis-invoke(下).png

其他

Jar.png
ssm项目jar.png

💙注: 本文长期更新。此笔记纯个人学习记录整理,如有错误之处,欢迎指正!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,525评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,203评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,862评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,728评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,743评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,590评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,330评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,244评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,693评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,885评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,001评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,723评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,343评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,919评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,042评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,191评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,955评论 2 355

推荐阅读更多精彩内容

  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 5,523评论 0 4
  • 1 Mybatis入门 1.1 单独使用jdbc编程问题总结 1.1.1 jdbc程序 上边使...
    哇哈哈E阅读 3,307评论 0 38
  • 《独玉》 词:梅溪仙子 像花瓣似的山峰痛饮着阳光 然后变成了五颜六色的琅玕 琢玉人住进自己雕画的房子 挥起那把随音...
    梅溪仙子阅读 216评论 0 0
  • ① 齐鲁壹点济南3月24日报道,3月23日上午,有网友在微博爆料,称22日下午四点,在开往彭庄方向的K19路公交车...
    少爷写春秋阅读 373评论 0 4
  • 今天上午,我和哥哥骑着电车到26层楼那边。 那边有人住,所以电梯也可以用。我们坐上电梯,按26,过了一...
    天佑655阅读 139评论 0 1