zoukankan      html  css  js  c++  java
  • 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会为接口生成一个代理对象
  • 相关阅读:
    NodeJS学习笔记(三) 模块与包_深入学习
    NodeJS学习笔记(二) 模块与包_基础部分
    Java 开发环境搭建
    Quartz.net 定时任务矿建Demo
    MVC AJAX.BeginForm() 页面异步提交
    源码学习分享
    WPF系能优化
    谈如何阅读框架源码
    Linux源码学习(7) 2013-3-1
    Linux源码学习(6) 2013-3-1
  • 原文地址:https://www.cnblogs.com/yfs123456/p/10696271.html
Copyright © 2011-2022 走看看