一、概述
1.现在JDBC代码的问题
1) 存在大量的冗余代码,不同表的DAO操作,操作步骤相同只是SQL语句不同
2) 给?占位符设置麻烦,需要手动完成
3) 针对查询结果的处理比较麻烦,需要手动封装实体
4) SQL语句 写在JAVA代码中,导致SQL的维护麻烦
2.概念
MyBatis框架是一个基于java的 持久层框架,主要用于 对数据库进行增删改查 等操作。
是对现有JDBC-DAO层代码的合理封装,可以自动完成对象关系映射 (ORM),极大的简化开发,提高开发效率。
3.与JDBC的对比
二、环境搭建
1.导jar包
2.配置文件
事务管理用JDBC
连接池:用POOLED
3.测试环境
三、第一个程序(查一个)
开发步骤(查1个) :
1. 根据表结构,定义实体类(同JDBC)
2. 创建DAO接口(同JDBC)
3. 使用mapper映射文件,实现接口【重点】
4. 注册mapper文件(在mybatis-config.xml核心配置文件)【重点】
5. 测试
1.创建实体类
同JDBC。
注意:必须有 默认的公共无参构造方法!
2.创建DAO接口
3.创建mapper文件
4.注册mapper文件
在mybatis-config.xml中,注册mapper文件
5.测试
注意:
- 查询默认不参加事务
- 增删改需要控制事务
注意:查询时,MyBatis根据"查询结果的字段名" 给"同名属性" 赋值! 如果没找到同名属性,则赋值失败!
- 注解:给sql语句字段起别名 别名==实体类的属性名
四、其它CRUD操作
1.查所有
2.模糊查询
3.删除
- 增删改注意要加事务
4.添加
5.增强添加
使用序列自动生成主键值,并且添加成功后,于获取新添加的主键值。
6.修改
五、MyBatisUtil工具类的封装
借鉴jdbcUtil工具类的封装。
六、方法的多参处理
1.特殊字符的处理
1) 使用实体引用
- 小于号<需要替换 大于号>不需要替换
<select id="" >
select ... from ... where price < #{price}
</select>
- 使用CDATA
<select id="" >
<![CDATA[
select ... from ... where price < #{price}
]]>
</select>
2.分页查询
- Mybatis中如果mapper需要从dao层接受多个参数 在dao层的参数需要使用@Param(“别名”)分别给多个参数定义名称
- #{}中只能取值,不能做运算
七、JDBC业务层的修改
八、mybatis对null值的处理
mybatis3.x中,往数据库添加/修改字段值时,如果内容是null,会出现异常信息,如下图所示:无效的1111
解决方法:在mapper文件是给字段赋值时使用jdbcType,语法:#{属性名,jdbcType=类型}
九、核心配置文件的补充
1.类型别名
- 不建议使用 找错 维护不方便
2.引入小配置文件
十、mybatis的关系映射
1.DB中表和表的关系
数据库中,两张表有关联关系,需要使用外键(Foreign Key)进行定义。
1.一对一 学生 和 电脑
2.一对多(多对一) 班级 和 学生 (学生和班级)
3.多对多 学生 和 课程
2.单向多对一
DB中,两张表的关联关系 使用 外键定义!
mybatis中的关系 使用 关系属性!
2.1定义关系属性
2.2定义dao接口
2.3查询结果的手动映射
经典出错案例:
- 没用在mybatis-config.xml中注册mapper.xml的文件位置
2.4添加功能
添加页面:1) 使用下拉列表 列出 所有班级 以供选择,其中每项的value属性值是 班级编号
2) 下拉列表的名称是 对象名.关系属性名.主属性名
Dao接口:
public void insertStudent(Student stu);
mapping映射文件:
在SQL语句中,给FK字段指定值时 使用 #{关系属性名.主属性名}
3.单向一对多
3.1定义关系属性
3.2定义dao接口
3.3查询结果的手动映射
十一、一对一
1.DB中表的关系
2.mybatis的关系映射
2.1定义关系属性
2.2定义dao接口
2.3查询结果的手动映射
2.4添加功能
添加页面:
业务类的处理:
mapper文件:
十二、多对多
1.DB中表的关系
2.mybatis的关系映射
2.1定义关系属性
2.2定义dao接口
2.3查询结果的手动映射
- 修改跳转前查一个,页面超链接标签的href中内容
- 修改查所有查一个跨包跳转
- forward跳转特点:共用一个request作用域
- 页面显示当前用户所在分组
十三、动态SQL
1.SQL片段的复用
2.where标签【重点】
where标签的动态SQL 在开发中 使用在高级搜索功能上。
第二种写法(使用trim标签):
3.set标签
第二种写法(使用trim标签):
4.foreach标签
十四、缓存
1.缓存
缓存,是计算机中的内存存储空间。
内存存储--优:读写效率高
缺:存储量小、不能永久存储
硬盘存储--优:存储量大,永久存储
缺:读写效率低
目前数据库中数据 是存储在硬盘中,所以效率低。
好处:使用缓存可以提高 减少与DB的交互次数,从而提高 DB操作的效率
(用 空间 换 时间)
2.mybatis的缓存分类
mybatis的缓存分类:
一级缓存:SqlSession级别---默认使用
基于同一个SqlSession的操作 可以缓存起来进行使用 提高效率)
二级缓存:SqlSessionFactory级别--默认没使用
基于同一个SqlSessionFactory的操作 可以缓存起来使用 提高效率)
3.mybatis二级缓存的使用
mybatis二级缓存的使用步骤(共三步):
步骤1> 配置启用mybatis的缓存
步骤2> 在Mapper映射文件中使用缓存
步骤3> 实体类必须实现Serializable接口
注意:1) session.close() 时,往缓存中 存内容;
2) session.commit() 时,清空 已有缓存中的 数据。