mybatis,mybatis连接池,延迟加载,缓存,二级缓存,注解开发,整合spring思路
JDBC编程
jdbc概念:是一种执行SQL语句的java api.
JDBC存在的问题
麻烦,频繁的释放资源,性能浪费,硬编码,获取到的结果处理麻烦.
Mybatis复习
架构
简单流程 :在mapper.xml中写SQL语句 mapper.java 写对应的接口 .再配置mapper扫描后,(官方推荐方法)可以自动生成mapper接口的实现类.随后用调接口中的方法就可以了.
配置文件介绍
SqlMapConfig.xml:
mybatis的全局配置文件.配置的是mybatis的运行环境等信息,主要是配数据库信息.事务管理
基本配置
后期与spring整合后,这些基本都要废除.sqlmapconfig.xml基本上是空文件
mapper.xml
在该文件中配置SQL语句,在sqlmapconfig.xml中加载mapper.xml
后面详细回顾怎么拼写SQL语句
测试
说明: datasource 用的是sqlmapconfig.xml文件中配置的那个. user类就是定义的那个pojo类
模糊查询
自我理解: #{}是个占位符,直接将代码中传的参放入SQL语句,传到SQL语句块中像是直接传的字符串, 而${}则是字符串拼接,可以在SQL语句中的字符串中镶入传的参数
补充:现在多数用#{}, ${}中只能为value的原因是在源代码中,是map.put(“value”,“xxx”);键的值为value
直接传入参数 username 王
传入参数%王%
补充:
输入输出参数类型和selectone list
补充:ongl表达式把user.getUserName()省略成user.username了,’ .'表示调用(如果里面还有的话)
使用mybatis开发dao有原始dao方法和使用mapper方法.
原始dao方法:dao接口 dao实现类(写session调用selectone等封装好的对数据库操作的方法) SQL映射文件
mapper方法 官方推荐
个人理解 使用mapper方法只需按照规范写接口,和mapper.xml映射文件.mybatis帮我们写mapper接口的实现类
通过getmapper方法获得实例.
sqlmapconfig.xml详细配置
properties:
补充:
typeAliases 别名(常用)
一般我们配包名批量定义 将类名定义为别名
mapper 配置
项目中常用第三个方法(与spring整合后配的扫描包名的方法 真实项目)
mapper.xml的编写相关知识点
个人理解:
mybatis是通过ognl来解析对象字段的.所以可以传pojo 也可以传包装类 只需在SQL语句的编写中在#{}${}中对应的字段属性名就可以了 比如
输出pojo或者pojo列表
mybatis可以指定返回自己定义的pojo类型,只需要字段对应,有多个查询返回就放到列表中
resultmap
个人理解:当数据库查的字段名和返回类型pojo中的名字对应不上时,使用resultmap将两个名字联系在一起 那么返回结果就能正确的映射到pojo返回类上
补充:
根本原因是数据库字段与pojo名不匹配
解决方法1.sql语句中起别名
2.使用resultmap对应起来
补充细节
因为:mysql 在 在 windows 系统中不区分大小写!所以比如数据库中列名username pojo 中userName 能封装成功,而在linnux下 mysql严格区分大小写,此时,这种情况无法封装成功
区分:有关JAVA pojo类的区分大小写(譬如占位符中,if标签判断中是关于pojo的),sql语句中不区分(win下)
mybatis中提供的数据库连接池
区别:
动态拼写sql
当查询条件越多需要编写的SQL语句越多,这显然不合理
适用: 查询输入参数为pojo类的 ,在pojo中设置查询参数
if标签
注意: 字符串类型的需要做不等于 空串的校验 且先判断不等于null 在判断不等于"".(短路).
where标签
补充:SQL片段(抽取重复片段)
引用:
补充细节注意:SQL语句拼写末尾加不加分号都一样,建议不加,比如抽取出的片段有分号但是,后面还要拼接语句会出问题,有时可能会让你找很久bug都找不出来原因
关联查询
一般思路 改造pojo 其他的依照SQL语句规则写就行了 列如
1.继承父类(新写一个pojo)
2.改造pojo
这里采用的 resultmap对应的映射关系
一对多resultmap编写
##mybatis 延迟加载
延迟加载:
就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据。延迟加载也称懒加载.
好处:先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速
度要快。
坏处 :
因为只有当需要用到数据时,才会进行数据库查询,这样在大批量数据查询时,因为查询工作也要消耗
时间,所以可能造成用户等待时间变长,造成用户体验下降。
实现:结果:
同样我们也可以在一对多关系配置的结点中配置延迟加载策略。
结点中也有 select 属性,column 属性。
需求:
完成加载用户对象时,查询该用户所拥有的账户信息。
个人理解:
延迟加载就是把多表查询拆分成多个单表查询.如果客户(java代码中)有查询关联的信息,则再去查询相关信息.
mybatis一级缓存
一级缓存是 SqlSession 级别的缓存,只要 SqlSession 没有 flush 或 close,它就存在。
测试方法:
一级缓存是 SqlSession 范围的缓存,当调用 SqlSession 的修改,添加,删除,commit(),close()等
方法时,就会清空一级缓存
mybatis二级缓存
注意事项:
当我们在使用二级缓存时,所缓存的类一定要实现 java.io.Serializable 接口,这种就可以使用序列化
方式来保存对象。
mybatis注解开发
常用注解
1.实体类编写(与数据库列名不一致)
未完待续
mybatis整合spring
注意点:
别名配置在sqlmapconfig.xml中,其余的sqlsessionfactory datasource交给spring
自己写daoimpl模式的需要把dao交给spring在配属性sqlsessionfactory
mapper代理方法:
自己配 或者开包扫描
mybatis****
适用:单表查询时可以用****直接生成mapper.xml,pojo类和mapper接口.不用自己写
关键点:
修改generatorConfig.xml文件的配置即可
资料
传智黑马
声明
自学的黑马,用途:复习一遍,顺便写个笔记.