mybatis(视频)

ORM(object relation mapping)对象(Javabean)与数据库中的关系记录映射的机制。

hibernate缺点:

  • 优于SQL都是框架生成的,所以无法优化SQL;
  • 对于某些复杂查询,是需要自定义的,框架力不从心。(hibernate的HQL支持自定义SQL)
  • 全映射。如只想查询Student表中的username,hibernate会将所有的字段都给查询了。

mybatis:

  • SQL语句不是由框架生成,而是由开发者写入xml配置文件中。(SQL与Java代码分离)
  • 半自动框架(hibernate为全自动框架)
  • 轻量级框架

 mybatis的配置文件

  • mybatis-config.xml全局配置文件
    • 映射文件需要在全局配置文件中注册
      • 使用mapper标签注册
        • resource属性(类路径下的SQL映射文件)
        • url属性(网络路径或磁盘路径下的SQL映射文件)
        • class属性(引用接口)
          • 映射文件名需要和接口同名,且同属一个目录;或者在conf文件夹下建立一个和接口Java文件同包名的包名。
          • class=“包名.接口名”
          • 主要用于注册“在接口上直接写注解”的方式
      • package标签批量注册
        • name属性(指定接口文件包名)
    • databaseIdProvider标签
      • type=“DB_VENDOR”
      • property标签为不同数据库厂商起别名
    • 使用多个不同厂商的数据库
      • environment中要配置transactionManager,DataSource
      • properties文件的使用(DataSource的属性值可以独立于全局配置文件)
      • SQL映射语句通过其databaseId来指定该语句的执行环境
      • 数据库环境的切换
        • 由environments的default属性控制
    • properties标签(引用外部property文件内容)
    • settings标签
      • mapUnderscoreToCamelCase(驼峰标记法)
        • 数据库中标准的字段(如last_name)自动转化为Java代码的标准字段(如lastName)
    • typeAliases标签
      • 为Java类型起别名,如com.atguigu.mybatis.bean.Employee--->employee
  • Mapper.xml SQL语句映射文件
    • 主要写一些增删改查的SQL语句
      • 获取SQL语句的返回值(改变接口函数的返回值即可)
      • mysql中获取自增主键
      • SQL语句的占位符#{}
      • ${}
        • 比#{}更强大,可以在#{}不支持占位符的地方使用${}作为占位符
          • 如select * from ${table_name} where ···
        • 使用JavaType规则
          • 说明:在Oracle中以OTHER类型插入NULL,而mysql是以类型NULL插入,为使两者兼容可以指定#{email,jdbcType=NULL}
      • mapper标签的全类名namespace(接口的全类名)
      • SQL映射语句
        • select
          • id(接口函数名),resultType(小写类名),databaseId(数据库类型)
        • insert
          • id,parameterType(可省略),useGeneratedKeys,keyProperty(存放获取的自增主键值)
        • update
        • delete
    • 接口编程
      • 定义接口dao文件,里面含有对数据库操作的方法,通过SQL映射语句id属性与方法名的一一对应,将接口与SQL映射文件绑定。主程序使用时:接口对象 = SqlSession.getClass(接口类名.class)。通过接口对象来执行SQL语句。
    • 获取<select>查询的结果集<resultMap>
      • 结果集为一个Javabean对象
        • <id>封装主键属性
        • <result>封装普通属性
          • <result>定义了查询出的字段名与Javabean类属性的一一对应关系
        • select标签属性
          • id是接口中定义的方法名
          • resultType是返回的Javabean对象的全类名
          • 标签体写SQL语句
      • 结果集为一个Javabean对象,但Javabean对象中有其他对象属性
        • Javabean对象中的对象属性通过<association>进一步单独封装
      • 结果集为一个Javabean对象,但Javabean对象中有一个属性是对象的List集合
        • 非list对象属性通过id,result正常定义
        • list对象使用<collection>定义封装规则(<association>替换为<collection>)
      • 结果集为一个Javabean对象list
        • 与结果集为一个Javabean对象的写法相同
      • 结果集为一个map对象
        • 除了resultType=“map”,其他与结果集为一个Javabean对象的写法相同
    • <resultMap>标签
      • 属性
        • type属性(一般是返回的Javabean对象的全类名)
        • id属性(用于指定select标签的resultMap属性)
      • 内含标签
        • <id>
          • column属性(指定哪一列是主键列)
          • property属性(指定与主键列对应的Javabean中的属性名称)
        • <result>
          • column属性(属性指定select查询出的字段名)
          • property属性(指定与字段名相匹配的Javabean中的属性名称)
            • <result column="last_name" property="lastName"/>
            • 数据库中字段为last_name的值为赋值到Javabean对象的lastName属性中
            • column与property也可以不对应,比如<result column="email" property="lastName"/>也是可以的,数据库中email字段的值赋值为Javabean对象的lastName属性
        • <association>
          • 用于封装嵌套的Javabean对象(关联对象)
          • 两种使用方式
            • 使用延迟加载
              • 须设置property,select,column属性
            • 使用id,result标签定义内联对象的封装规则
              • 须设置property(内联对象属性名称),JavaType属性(内联对象的全类名)
          • property属性(指定Javabean对象中关联对象属性的名称)
          • JavaType属性(指定Javabean对象中关联对象的全类名)
          • 支持延迟加载(分步查询)
          • 延迟加载是指我用到的时候才去查询,比如我只用到Javabean对象的属性值,不需要关联对象的属性值,使用延迟加载,在查询的时候mybatis只查询除了内联对象属性之外的属性值,等用到内联对象时mybatis再去查询。
          • 延迟加载的property属性(指定Javabean对象中关联对象属性的名称)
          • 延迟加载的select属性(指定内联对象的可以调用哪个接口函数可以查得,使用延迟加载后,用到内联对象的信息时,mybatis再去调用select指定的方法),重用select映射语句。
          • 延迟加载的column属性(Javabean对象和数据库中的表是一一映射的,延迟加载这种情况相当于多表查询,指定的传入参数(列名),column属性就是指定查询与Javabean对象关联的内联对象需要的参数(column值是内联对象对应数据库表中的字段名))
          • 使用延迟加载,外层的SQL映射语句将不用关心内联对象的查询。
          • 如employee对象中包含department内联对象,在外层的映射语句写select * from employee where id = #{id}就可以。
          • 内含标签(用于定义内联对象的封装规则)
            • <id>
            • <result>
        • <collection>
          • 应用场景:例如,有Javabean对象(employee),其内联对象为department(员工所属部门),需求:查询部门时将部门对应的所有员工信息也查询出来。一个部门可能对应多个employee。department Javabean对象会添加一个list<Employee>属性用于存放该部门对应的多个员工信息。
          • 按照SQL映射语句查询出的字段封装
            • 封装部门信息
            • 使用collection标签封装多个员工信息
              • property属性(指定department的list<employee>属性)
              • ofType属性(指定list<employee>元素的全类名(即元素类型))
              • 内含标签(定义 员工属性的封装规则)
                • id
                • result
          • collection的分步查询(延迟加载)
            • 与association一样,需要指定collection的property,select,column属性
        • <collection>封装的是对象数组,<association>封装的单个对象
      • <discriminator>标签
        • 根据查询出的某列(列A)的值,来改变封装规则
        • 如封装employee:
          • 若查出的是女生,就把他的部门信息查询出来,否则不查询
          • 若是男生,就把last_name赋值给email
        • JavaType属性(指定列(列A)值对应的Java类型)
        • column属性(指定判定的列名(列A的字段名))
        • 内含标签:
          • case
            • value属性(列A字段的取值)
            • resultType属性
    • SQL映射语句的参数问题
      • 传入单个参数
        • #{parameterName}, parameterName拼写任意
      • 传入多个参数
        • #{param1}, #{param2}, ···
      • 命名参数
        • 接口文件的函数声明中,在参数前加上@Param(“新名字”)
      • POJO
        • 传入的参数正好可以组装成一个Javabean
        • #{属性名}取出POJO的属性值
      • Map
        • 传入多个参数且不能组装成一个Javabean
        • 将多个参数封装为一个Map
        • #{key} 取值
      • TO
        • 参数太多,封入map繁琐
        • 使用TO(Transfer object)传递数据
      • 特殊情况
        • public Employee getEmp(@Param("id")Integer id, String lastName);
          取值:id==> #{id/param1} lastName==>#{param2}

        • public Employee getEmp(Integer id, @Param("e")Employee emp);
          取值:id==>#{param1} lastName==>#{param2.lastName / e.lastName}

        • 参数为Collection(List,Set)或数组
          • mybatis自动封装为map
          • Collection==>collection
          • List==>list
          • 数组==>array
          • public Employee getEmpById(List<Integer> ids);
            取值:
                 取出第一个id的值,#{list[0]}

主程序

  • 加载主配置文件
  • 获取SqlSessionFactory对象
  • 获取SqlSession对象
    • SqlSession对象的两种使用方式
      • SqlSession.selectOne(“映射语句全类名”,“SQL语句参数”)
      • 使用接口
        • mapper接口对象 = SqlSession.getMapper(xxxMapper.class)
        • 通过mapper接口对象调用SQL语句
    • SqlSession的自动 / 手动提交
    • SqlSession对象在try-finally块中关闭
    • SqlSession代表和数据库的一次会话,用完须关闭,SqlSession是非线程安全的
    • mapper没有实现类,mybatis会为接口生成一个代理对象

 

posted @ 2019-04-12 15:20  赤云封天  阅读(197)  评论(0编辑  收藏  举报