一.概述
- 现有jdbc代码的不足
1)代码冗余大(对于不同的表的dao实现类,只有sql命令是不同的)
2)对于结果实体类对象的封装需要程序员手工完成(o-r mapping)
3)jdbc代码没有提供“连接池”功能,需要人为的引入外部的连接池软件
4)jdbc没有提供缓存机制 - Mybatis框架
1)Mybatis框架是一个基于java的,做数据持久化操作的框架。是对现有的jdbc代码
的合理封装,替换jdbc代码完成数据库的访问操作(Dao)。
2)Mybatis提供一种新的机制完成dao接口的实现
二.搭建环境
- 引入相关的jar包
Mybatis-3.2.2.jar(核心jar包) ojdbc5.jar log4j-1.2.17.jar(日志) - 引入相关的配置文件
Mybatis-config.xml — 放置在src目录下,mybatis的配置文件
Log4j.properties ----- 放置在src目录下,日志功能的配置文件 - 初始配置 — mybatis-config.xml
三.第一个Mybatis程序 - 建立数据库表 以及 表对应的实体类
- 定义表所需要的dao接口
- 用mybatis方式给出接口的实现
- 注册映射文件 — 在mybatis-config.xml文件中注册
- 测试(写测试代码)
1)核心API
注意:SqlSession与Connection一一对应
2)测试代码
四.查询的细节处理 - 查询结果是一个集合
- 多参查询
注意:方法的形参名在运行时已经丢失,所以在指定参数时,不能再使用形参名。
1)通过参数的下标来确定引用哪一个参数的值
2)通过注解的形式为形参定义可以长久保留的名字(强烈建议)
3.字段名与实体类的属性名不对等
1)在查询结果封装时,mybatis会采用“结果里的字段名”去为实体类的“同名属性”
赋值,如果没有对应的同名属性,则赋值失败
2)表里的字段名与属性名不对应时,解决方案:在查询过程中为查询结果里的字段
定义“别名”,别名必须与属性名一致
五.数据的增删改(insert update delete)
强调:在使用增删改功能时,mybatis要求必须在代码中显示的手动提交。
- 删除功能
- 更新功能
3. 插入功能 —
六.MyBatis工具类的封装 - SqlSession与jdbc里的Connection一一对应,代表了Connection,每次数据库操作都
需要新的SqlSession - 读配置文件mybatis-config.xml的动作不需要每次构建SqlSession时都执行,启动时执
行一次 — 静态代码块 - SqlSessionFactory对象代表了配置文件信息,重量级组件(内存多,效率差,功能强),
这种对象在应用中只创建一次 - SqlSession等价于Connection(不能再多个线程间共享,最好做到一个线程一个
Connection)
二.Mapper文件细节补充
-
对于查询功能里的 > 和 < 号的处理
1)如果代码中出现< 需要用特殊的字符串代替 ---- < > ≤ ≥
2) 脚本代码里对特殊符号的处理
2. 模糊查询
1)在mapper文件中对sql命令进行拼接
2)在调用函数时,对实参进行拼接
3. 在插入和更新时,实体类的属性为null的处理
三.Mybatis-config.xml文件细节补充 -
Mybatis运行在配置文件中为实体类定义别名
在映射文件中直接使用别名 -
将数据库的连接数据单独配置在一个独立的文件中
四.关联关系数据的处理 -
分类: 一对一 一对多(多对一) 多对多
Student-computer 最多 student – course -
一对多关联关系的解决( Student — Team )
1)在数据库里建表,保存业务数据,并且保存数据关系
2)在java程序中通过实体来封装数据,同时体现数据关系
3)定义Dao接口
StudentDao(insert update delete queryByPk queryAll)
TeamDao(insert update delete queryByPk queryAll)
4)为实体类定义Alias
5)写映射文件
A. 对于Dao接口中的增删改操作只要维护好本表就可以,不用关心关系的维护
B. 查询功能必须查询完整对象数据(最好使用左外表连接查询相关数据)
二.关系数据处理 — 一对一(Student — Computer) -
在db里描述关系数据
-
在java程序中通过实体类来描述关系
3. 定义dao接口 — StudentDao ComputerDao -
Mapper文件 ---- StudentDaoImpl.xml ComputerDaoImpl.xml
- 增删改动作与单表操作基本一致
2)查询动作 — 需要表连接查询,需要resultMap
- 增删改动作与单表操作基本一致
三.关系数据处理 — 多对多(Student — course)
- Db里如何描述
- Java实体类描述
- 定义Dao接口 ---- StudentDao CourseDao
- 定义mapper文件
注意:直接描述多对多,会导致数据库里的表和实体类的数量不对等,此时一般只需
要程序员提供“查询功能”,最好不涉及增删改功能
5. 如果涉及到增删改功能的多对多
1)解决:在程序涉及过程中,会人为的将多对多关系首先拆分成两个一对多。
通过添加一组业务数据的方式拆分
2)案例:Product ---- Order
四.动态SQL(dynamic sql) - …
- 用在条件判断的语句里,作用是去掉第一个条件前多余的and或者or
- 标签 — 用在更新动作里,作用去掉命令后多余的“,”
4. Foreach标签,做循环的
5. 总结 ----- 如何处理增删改查功能中的null值
1)insert — #{name,jdbcType=VARCHAR}
2) update --- <set> 和 <if>
3) delete(批量删除) ---- <foreach>
4) select(查询条件空值) --- <where> 和 <if>
五.缓存机制
- 什么是缓存?好处?
- 缓存与Mybatis的整合
1)Mybatis本身内置了缓存功能 — 全局缓存 — 底层采用HashMap的形式来管理缓
存空间
使用步骤:
A. 打开mybatis的全局缓存设置 ---- mybatis-config.xml
B. 在需要使用缓存功能的mapper文件中添加标签
此时通过当前mapper文件提供的查询功能查到的数据就会被存入缓存
C. 注意:
I. 只有在SqlSession被关闭时,本次查询的数据才会被存入缓存。
II. 当增删改动作发生,commit之后,缓存数据会被清空
III. 缓存一般会有自动“换出”机制(当缓存满了后,会根据某种算法将一些数
据写入硬盘。要求:实体必须实现Serializable接口
思考:有两个mapper文件都设置了缓存,如果调用了其中mapper1提供的delete方
法,并提交。问:清空缓存数据时,
A。清空mapper1的缓存数据,mapper2数据仍然被缓存
B。全部清空
2)一般开发中会引入外部的缓存软件(ehcache)
引入步骤:
A. 打开mybatis的全局缓存设置 ---- mybatis-config.xml
B. 引入相关jar包
C. 引入配置文件 — src