任务一:基本应用
    一 框架简介
    三层架构
    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. 七 Mybatis的API概述
    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. 只适用于主键自增的数据库,mysql和sqlserver支持,oracle不行。
    18. selectKey
    19. 动态sql
    20. <if>
    21. 条件判断
    22. <where>
    23. 去掉第一个条件的 前 and | or
    24. <set>
    25. 去掉最后一个条件的 逗号
    26. <foreach>
    27. foreach主要是用来做数据的循环遍历
    28. 普通类型 List,collection属性:list
    29. 普通类型 Array,collection属性: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范围的缓存,执行SqlSession的C(增加)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 表示使用全局配置