任务一:基本应用
一 框架简介
三层架构
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 表示使用全局配置
