任务一:基本应用
    一 框架简介
    三层架构
    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映射文件概述

    1. Mybatis增删改查
    2. 添加
    3. 修改
    4. 删除
    5. Mybatis核心文件概述
    6. environments标签
    7. 数据库环境配置
    8. properties标签
    9. 引入第三方配置
    10. typeAliases标签
    11. 实体别名配置
    12. mappers标签
    13. 加载映射配置
    14. MybatisAPI概述
    15. Resources
    16. 加载核心配置文件,创建一个用来读取配置文件的 inputStream输入流
    17. SqlSessionFactoryBuilder
    18. 解析配置文件,封装configuration, 构建工厂类对象
    19. SqlSessionFactory
    20. 生产会话对象
    21. SqlSession
    22. 实现与数据库CRUD操作
    23. Mybatis实现Dao层的二种方式
    24. 传统方式
    25. 不会用
    26. 需要我们自己写DAO层的实现类
    27. 接口代理方式
    28. 1。映射文件的命名空间必须是接口的全限定类名
    29. 2。接口方法的名称必须与statement标签id一致
    30. 3。接口方法参数类型必须与statement标签的parameterType类型一致
    31. 4。接口方法返回值类型必须与statement标签的ResultType类型一致
    32. 5。接口和映射文件同名,同包

    任务二:配置文件深入
    一 Mybatis高级查询&映射配置文件深入
    resultMap标签
    resultType:如果实体的属性名与表中字段名一致,将查询结果自动封装到实体类中
    解决:如果实体的属性名与表的字段名不一致,需要使用ResultMap手动进行封装

    1. 多条件查询
    2. 方式1: 使用 #{arg0}-#{argn} 或者 #{param1}-#{paramn} 获取参数
    3. 方式2:使用注解,引入@Param()注解获取参数
    4. findByIdAndUsername2(@Param("id") Integer id,@Param("username") String username)
    5. 方式3: 使用pojo对象传递参数
    6. 模糊查询
    7. 方式1: where username like #{username}
    8. 方式2: like "%"#{username}"%"
    9. 方式3: where username like '%${value}%'
    10. 方式3: like concat(concat('%',#{username}),'%');
    11. ${}与#{}区别
    12. ${} statement ,SQL的原样拼接,存在SQL注入问题
    13. #{} preparedStatement , 相当于 ? 占位符
    14. Mybatis映射文件深入
    15. 返回主键
    16. useGeneratedKeys
    17. 只适用于主键自增的数据库,mysqlsqlserver支持,oracle不行。
    18. selectKey
    19. 动态sql
    20. <if>
    21. 条件判断
    22. <where>
    23. 去掉第一个条件的 and | or
    24. <set>
    25. 去掉最后一个条件的 逗号
    26. <foreach>
    27. foreach主要是用来做数据的循环遍历
    28. 普通类型 Listcollection属性:list
    29. 普通类型 Arraycollection属性:array
    30. 复杂类型pojo对象,collection属性:实体的属性名
    31. <sql>
    32. 将公共代码抽取,实现复用性,通常会抽取一些常用的字段
    33. 分页插件的使用
    34. ①导入通用PageHelper的坐标
    35. ②在mybatis核心配置文件中配置PageHelper插件
    36. ③测试分页数据获取
    37. 表关系回顾
    38. MyBatis多表查询
    39. 一对一
    40. 使用<resultMap>+<association>做配置
    41. property: 关联实体属性
    42. javaType: 关联实体类
    43. 一对多
    44. 使用<resultMap>+<collection>做配置
    45. property: 关联集合属性名
    46. ofType : 关联集合泛型类型(别名)
    47. 多对多
    48. 使用<resultMap>+<collection>做配置
    49. property
    50. 关联集合属性名
    51. ofType
    52. 关联集合泛型类型(别名)
    53. MyBatis嵌套查询
    54. 将原来多表查询中的联合查询语句,拆成多个单表的查询
    55. 实现
    56. 一对多配置:使用<resultMap>+<collection>做配置,通过column条件,执行select查询
    57. 多对多配置:使用<resultMap>+<collection>做配置,通过column条件,执行select查询

    任务三:加载策略及注解开发
    一 MyBatis加载策略
    什么是延时加载
    就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据。延迟加载也称懒加载。
    优点:先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。
    缺点: 因为只有当需要用到数据时,才会进行数据库查询,这样在大批量数据查询时,因为查询工作也要消耗时间,所以可能造成用户等待时间变长,造成用户体验下降。
    使用场景:
    一对多,多对多:通常情况下采用延迟加载
    一对一(多对一):通常情况下采用立即加载
    全局延迟加载

    1. 局部延迟加载
    2. <association> <collection> 标签
    3. 局部的加载策略优先级高于全局的加载策略。
    4. MyBatis缓存
    5. 为什么要使用缓存
    6. 经常查询一些不经常发生变化的数据,使用缓存来提高查询效率
    7. 一级缓存
    8. 一级缓存是SqlSession级别的缓存,是默认开启的
    9. 注意: 一级缓存是SqlSession范围的缓存,执行SqlSessionC(增加)U(更新)D(删除)操作,或者调用clearCache()、commit()、close()方法,都会清空缓存。
    10. 二级缓存
    11. mapper映射级别的缓存,需要手动配置且实体类实现serializable接口
    12. Mybatis注解
    13. 常用注解
    14. * @Insert:实现新增,代替了<insert></insert>
    • @Update:实现更新,代替了
    • @Delete:实现删除,代替了
    • @Select:实现查询,代替了
    • @Result:实现结果集封装,代替了
    • @Results:可以与@Result 一起使用,封装多个结果集,代替了
    • @One:实现一对一结果集封装,代替了
    • @Many:实现一对多结果集封装,代替了
      基于注解的二级缓存
      @CacheNamespace
      注解延迟加载
      * fetchType = FetchType.LAZY 表示懒加载
    • fetchType = FetchType.EAGER 表示立即加载
    • fetchType = FetchType.DEFAULT 表示使用全局配置