任务一:基本应用
一 框架简介
三层架构
web层
service层
dao层
三层架构中,使用是实体类对象,进行数据的交互
什么是框架?
半成品软件
常见框架
持久层
mybatis
hibernate
spring jdbc
表现层
struts2
spring mvc
全栈(业务层)
spring
二 Mybatis简介
原生JDBC的一些问题
数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能
sql 语句在代码中硬编码,造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变java代码。
查询操作时,需要手动将结果集中的数据手动封装到实体中。
mybatis是一款优秀的持久层框架,封装了jdbc实现细节,让开发者只关注 sql本身。
mybatis是ORM映射框架
ORM(object relation mapping) 对象关系映射关系 ,面向对象的对象模型和关系型数据之间的相互转换,操作对象 就等于操作数据。
MyBatis属于半自动ORM框架
三 Mybatis快速入门
1. 创建mybatis_db数据库和user表
2. 创建java项目,引入MyBatis相关jar包
3. 创建User实体类
4. 编写映射文件UserMapper.xml
5. 编写核心文件SqlMapConfig.xml
6. 编写测试类
四 Mybatis映射文件概述
五 Mybatis增删改查
添加
修改
删除
六 Mybatis核心文件概述
environments标签
数据库环境配置
properties标签
引入第三方配置
typeAliases标签
实体别名配置
mappers标签
加载映射配置
七 Mybatis的API概述
Resources
加载核心配置文件,创建一个用来读取配置文件的 inputStream输入流
SqlSessionFactoryBuilder
解析配置文件,封装configuration, 构建工厂类对象
SqlSessionFactory
生产会话对象
SqlSession
实现与数据库CRUD操作
九 Mybatis实现Dao层的二种方式
传统方式
不会用
需要我们自己写DAO层的实现类
接口代理方式
1。映射文件的命名空间必须是接口的全限定类名
2。接口方法的名称必须与statement标签id一致
3。接口方法参数类型必须与statement标签的parameterType类型一致
4。接口方法返回值类型必须与statement标签的ResultType类型一致
5。接口和映射文件同名,同包
任务二:配置文件深入
一 Mybatis高级查询&映射配置文件深入
resultMap标签
resultType:如果实体的属性名与表中字段名一致,将查询结果自动封装到实体类中
解决:如果实体的属性名与表的字段名不一致,需要使用ResultMap手动进行封装
多条件查询
方式1: 使用 #{arg0}-#{argn} 或者 #{param1}-#{paramn} 获取参数
方式2:使用注解,引入@Param()注解获取参数
findByIdAndUsername2(@Param("id") Integer id,@Param("username") String username)
方式3: 使用pojo对象传递参数
模糊查询
方式1: where username like #{username}
方式2: like "%"#{username}"%"
方式3: where username like '%${value}%'
方式3: like concat(concat('%',#{username}),'%');
${}与#{}区别
${} statement ,SQL的原样拼接,存在SQL注入问题
#{} preparedStatement , 相当于 ? 占位符
二 Mybatis映射文件深入
返回主键
useGeneratedKeys
只适用于主键自增的数据库,mysql和sqlserver支持,oracle不行。
selectKey
动态sql
<if>
条件判断
<where>
去掉第一个条件的 前 and | or
<set>
去掉最后一个条件的 逗号
<foreach>
foreach主要是用来做数据的循环遍历
普通类型 List,collection属性:list
普通类型 Array,collection属性:array
复杂类型pojo对象,collection属性:实体的属性名
<sql>
将公共代码抽取,实现复用性,通常会抽取一些常用的字段
分页插件的使用
①导入通用PageHelper的坐标
②在mybatis核心配置文件中配置PageHelper插件
③测试分页数据获取
三 表关系回顾
四 MyBatis多表查询
一对一
使用<resultMap>+<association>做配置
property: 关联实体属性
javaType: 关联实体类
一对多
使用<resultMap>+<collection>做配置
property: 关联集合属性名
ofType : 关联集合泛型类型(别名)
多对多
使用<resultMap>+<collection>做配置
property
关联集合属性名
ofType
关联集合泛型类型(别名)
五 MyBatis嵌套查询
将原来多表查询中的联合查询语句,拆成多个单表的查询
实现
一对多配置:使用<resultMap>+<collection>做配置,通过column条件,执行select查询
多对多配置:使用<resultMap>+<collection>做配置,通过column条件,执行select查询
任务三:加载策略及注解开发
一 MyBatis加载策略
什么是延时加载
就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据。延迟加载也称懒加载。
优点:先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。
缺点: 因为只有当需要用到数据时,才会进行数据库查询,这样在大批量数据查询时,因为查询工作也要消耗时间,所以可能造成用户等待时间变长,造成用户体验下降。
使用场景:
一对多,多对多:通常情况下采用延迟加载
一对一(多对一):通常情况下采用立即加载
全局延迟加载
局部延迟加载
<association> 和 <collection> 标签
局部的加载策略优先级高于全局的加载策略。
二 MyBatis缓存
为什么要使用缓存
经常查询一些不经常发生变化的数据,使用缓存来提高查询效率
一级缓存
一级缓存是SqlSession级别的缓存,是默认开启的
注意: 一级缓存是SqlSession范围的缓存,执行SqlSession的C(增加)U(更新)D(删除)操作,或者调用clearCache()、commit()、close()方法,都会清空缓存。
二级缓存
是mapper映射级别的缓存,需要手动配置且实体类实现serializable接口
三 Mybatis注解
常用注解
* @Insert:实现新增,代替了<insert></insert>
- @Update:实现更新,代替了
- @Delete:实现删除,代替了
- @Select:实现查询,代替了
- @Result:实现结果集封装,代替了
- @Results:可以与@Result 一起使用,封装多个结果集,代替了
- @One:实现一对一结果集封装,代替了
- @Many:实现一对多结果集封装,代替了
基于注解的二级缓存
@CacheNamespace
注解延迟加载
* fetchType = FetchType.LAZY 表示懒加载 - fetchType = FetchType.EAGER 表示立即加载
- fetchType = FetchType.DEFAULT 表示使用全局配置