Mybatis补充知识

一.对于orm框架的了解

了解orm,先了解以下概念:

1.1什么是“持久化”
持久(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的数据存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等。

1.2什么是 “持久层”
持久层(Persistence Layer),即专注于实现数据持久化应用领域的某个特定系统的一个逻辑层面,将数据使用者和数据实体相关联。

1.3什么是ORM

对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。

ORM是面向对象程序设计语言和关系型数据库发展不同步时的解决方案,采用 ORM框架后,应用程序不再直接访问底层数据库,而是以面向对象的方式来操作持久化对象,而ORM框架则将这些面向对象的操作转换成底层的 SQL 操作。

1.4为什么要做持久化和ORM设计(重要)

在目前的企业应用系统设计中,MVC,即 Model(模型)- View(视图)- Control(控制)为主要的系统架构模式。MVC 中的 Model 包含了复杂的业务逻辑和数据逻辑,以及数据存取机制(如 JDBC的连接、SQL生成和Statement创建、还有ResultSet结果集的读取等)等。将这些复杂的业务逻辑和数据逻辑分离,以将系统的紧耦 合关系转化为松耦合关系(即解耦合),是降低系统耦合度迫切要做的,也是持久化要做的工作。MVC 模式实现了架构上将表现层(即View)和数据处理层(即Model)分离的解耦合,而持久化的设计则实现了数据处理层内部的业务逻辑和数据逻辑分离的解耦合。 而 ORM 作为持久化设计中的最重要也最复杂的技术,也是目前业界热点技术。

简单来说,按通常的系统设计,使用 JDBC 操作数据库,业务处理逻辑和数据存取逻辑是混杂在一起的。
一般基本都是如下几个步骤:
1、建立数据库连接,获得 Connection 对象。
2、根据用户的输入组装查询 SQL 语句。
3、根据 SQL 语句建立 Statement 对象 或者 PreparedStatement 对象。
4、用 Connection 对象执行 SQL语句,获得结果集 ResultSet 对象。
5、然后一条一条读取结果集 ResultSet 对象中的数据。
6、根据读取到的数据,按特定的业务逻辑进行计算。
7、根据计算得到的结果再组装更新 SQL 语句。
8、再使用 Connection 对象执行更新 SQL 语句,以更新数据库中的数据。
7、最后依次关闭各个 Statement 对象和 Connection 对象。

  由上可看出代码逻辑非常复杂,这还不包括某条语句执行失败的处理逻辑。其中的业务处理逻辑和数据存取逻辑完全混杂在一块。而一个完整的系统要包含成 千上万个这样重复的而又混杂的处理过程,假如要对其中某些业务逻辑或者一些相关联的业务流程做修改,要改动的代码量将不可想象。另一方面,假如要换数据库 产品或者运行环境也可能是个不可能完成的任务。而用户的运行环境和要求却千差万别,我们不可能为每一个用户每一种运行环境设计一套一样的系统。

所 以就要将一样的处理代码即业务逻辑和可能不一样的处理即数据存取逻辑分离开来,另一方面,关系型数据库中的数据基本都是以一行行的数据进行存取的,而程序 运行却是一个个对象进行处理,而目前大部分数据库驱动技术(如ADO.NET、JDBC、ODBC等等)均是以行集的结果集一条条进行处理的。所以为解决 这一困难,就出现 ORM 这一个对象和数据之间映射技术。

举例来说,比如要完成一个购物打折促销的程序,用 ORM 思想将如下实现(引自《深入浅出Hibernate》):
业务逻辑如下:
public Double calcAmount(String customerid, double amount) 
{
// 根据客户ID获得客户记录
Customer customer = CustomerManager.getCustomer(custmerid); 
// 根据客户等级获得打折规则
Promotion promotion = PromotionManager.getPromotion(customer.getLevel()); 
// 累积客户总消费额,并保存累计结果
customer.setSumAmount(customer.getSumAmount().add(amount); 
CustomerManager.save(customer); 
// 返回打折后的金额
return amount.multiply(protomtion.getRatio()); 
}
这 样代码就非常清晰了,而且与数据存取逻辑完全分离。设计业务逻辑代码的时候完全不需要考虑数据库JDBC的那些千篇一
律的操作,而将它交给 CustomerManager 和 PromotionManager 两个类去完成。这就是一个简单的 ORM 设计,实际的 ORM 	  
实现框架比这个要复杂的多。

二.半自动框架和全自动框架的区别

2.1为什么说 Mybatis是半自动 ORM框架,而 Hibenate是全自动 ORM框架?
我们先来看看在持久层框架出现以前我们是如何对数据库进行操作的?

毋庸置疑,我们都使用 JDBC(Java Database Connectivity) 对数据库进行操作。操作步骤如下:

1、加载驱动程序

Class.forName(driverClass)
//加载MySql驱动
Class.forName(“com.mysql.jdbc.Driver”)
2、获取数据库连接

DriverManager.getConnection(“jdbc:mysql://localhost:3306/test”, “root”, “root”);
3、创建 Statement / PerparedStatement 对象

conn.createStatement();
conn.prepareStatement(sql);
4、操作数据库

stmt.executeQuery(“…”);
5、关闭连接

stmt.close();
conn.close();
2.2Mybatis的实现机制

1、读取 Mybatis的全局配置文件 mybatis-config.xml

2、创建 SqlSessionFactory会话工厂

3、创建 SqlSession会话

4、执行查询操作

mybatis-config.xml文件中包括一系列配置信息,其中包括标签 ,此标签配置了映射节点,映射节点内部定义了SQL语句。

Mybatis将 SQL的定义工作独立出来,让用户自定义,而 SQL的解析,执行等工作交由 Mybatis处理执行。

2.3Hibenate 的实现机制

1、构建 Configuration实例,初始化该实例中的变量
2、加载 hibenate.cfg.xml 文件到内存
3、通过 hibenate.cfg.xml 文件中的 mapping 节点配置并加载 xxx.hbm.xml 文件至内存
4、利用 Configuration实例构建 SessionFactory 实例
5、由SessionFactory 实例构建 session实例
6、由 session实例创建事务操作接口 Transaction 实例
7、执行查询操作

总结

  传统的 jdbc 是手工的,需要程序员加载驱动、建立连接、创建 Statement 对象、定义SQL语句、处理返回结果、关闭连接等操作。

  Hibernate 是自动化的,内部封装了JDBC,连 SQL 语句都封装了,理念是即使开发人员不懂SQL语言也可以进行开发工作,向应用程序提供调用接口,直接调用即可。

  Mybatis 是半自动化的,是介于 jdbc 和 Hibernate之间的持久层框架,也是对 JDBC 进行了封装,不过将SQL的定义工作独立了出来交给用户实现,负责完成剩下的SQL解析,处理等工

三.动态sql(一对一,一对多,多对多)的理解

    通过Mybatis的学习,我们大致了解了相关知识,并且可以使用基础的sql语句来操作数据库。在关系型的数据库中,表存在  ``
    一对一,一对多,多对多的几种映射关系。映射关系是mysql的核心知识,在今后的工作我们也会经常用到这几种映射关系,
    因此我们需要好好了解。

一、mybatis 一对一映射关系

1.一对一映射关系

  • 什么是一对一映射关系?:从数据库的角度出发就是在任意一个表中引入另外一个表的主键作为外键。在本类的定义中定义另外一个类的对象。
  • 在mybatis中,我们通过resultMap元素的子元素 association来进行处理。
  • association元素具有以下配置属性
  • 属性名称 作用
    property 指定映射到的实体类对象属性,与表字段一一对应
    column 指定表中对应的字段
    select 指定引入嵌套查询的子SQL 语句,该属性用于关联映射中的嵌套查询。
    javaType 指定映射到实体对象属性的类型
    用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户

一对一查询的需求:查询一个订单,与此同时查询出该订单所属的用户
在这里插入图片描述

对应对应的sql语句:

  • select * from orders;

  • select * from user where id=查询出订单的uid;
    使用注解配置Mapper

 @Select("select * from orders")/*因为order 表中有user对象,跟查询的字段都不匹配,所以需要我们人为的封装*/
    @Results({
   
            @Result(column = "id",property = "id"),
            @Result(column = "ordertime",property = "ordertime"),
            @Result(column = "total",property = "total"),
            @Result(
                    property = "user", //要封装的属性名称
                    column = "uid", //根据哪个字段去查询user表的数据
                    javaType = User.class, //要封装的实体类型
                    //select属性 代表查询那个接口的方法获得数据
                    one = @One(select = "mapper.U
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值