Mybatis-快速上手及其原理-了解什么是Mybatis(一)

什么是Mybatis:
Mybatis是支持普通SQL查询,存储过程和高级映射的优秀的持久层框架,Mybatis几乎消除了几乎所有的JDBC代码和参数手工设置及对所有的JDBC和参数的手工设置及对结果的检索,Mybatis可以使用简单xml或注解用户配置和原始映射,将接口和Java的POJO映射成数据库中的记录

什么是ORM

对象关系映射(英语:Object Relation Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。

对象-关系映射,是随着面向对象的软件开发方法发展而产生的。面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。

ORM模型的简单性简化了数据库查询过程。使用ORM查询工具,用户可以访问期望数据,而不必理解数据库的底层结构。

简单来说,我们使用ORM可以将我们的对象(或类)去进行映射,使得我们可以去操作对象就能完成对表的操作。

主流持久层框架比较:
jdbc,mybatis,hibernate各自优缺点及区别

jdbc:
我们使用jdbc编程,大概需要这些步骤

1.使用jdbc需要连接数据库,注册驱动和数据库信息

2.操作connection,打开Statemmn对象

3.通过Statemment对象执行sql,返回结果到ResultSet对象

4.使用ResultSet读取数据,然后通过代码转化为具体的POJO对象

5.关闭数据库相关的资源

	// JDBC 驱动名及数据库 URL
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
    static final String DB_URL = "jdbc:mysql://localhost:3306/RUNOOB";
 
    // 数据库的用户名与密码,需要根据自己的设置
    static final String USER = "root";
    static final String PASS = "123456";
 
    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        try{
            // 注册 JDBC 驱动
            Class.forName("com.mysql.jdbc.Driver");
        
            // 打开链接
            System.out.println("连接数据库...");
            conn = DriverManager.getConnection(DB_URL,USER,PASS);
        
            // 执行查询
            System.out.println(" 实例化Statement对象...");
            stmt = conn.createStatement();
            String sql=''SELECT id, name, url FROM user";
            ResultSet rs = stmt.executeQuery(sql);
        
            // 展开结果集数据库
            while(rs.next()){
                // 通过字段检索
                int id  = rs.getInt("id");
                String name = rs.getString("name");
                String url = rs.getString("url");
    
                // 输出数据
                System.out.print("ID: " + id);
                System.out.print(", 名称: " + name);
                System.out.print(",  URL: " + url);
                System.out.print("\n");
            }
            // 完成后关闭
            rs.close();
            stmt.close();
            conn.close();
        }catch(SQLException se){
            // 处理 JDBC 错误
            se.printStackTrace();
        }finally{
            // 关闭资源
              conn.close();
    }

jdbc缺点:
1:通过上面的代码,就可以知道使用jdbc从数据库获取数据,代码很丑陋,而且你每写一条sql,都需要这样写,所以也比较麻烦

2:操作数据库,每次需要创建连接对象,但是创建后连接对象也不主动释放,这也会极大的造成资源的浪费

hibernate:

hibernate是一个轻量的持久层框架,底层封装的JDBC,hibernate也是减少了jdbc大量操作数据库的代码

Hibernate优点:

1、对象化。人员以面相对象的思想来操作数据库。Hibernate支持许多面向对象的特性,如组合,继承,多态等。

2、更好的移植性.对于不同的数据库,开发者只需要使用相同的数据操作即可.

3、开发效率高。hibernate提供了大量的封装(这也是它最大的缺点),很多数据操作以及关联关系等都被封装的很好,开发者不需写大量的sql语句,这就极大的提高了开发者的开发效率。

4、缓存机制的使用。hibernate提供了缓存机制(session缓存,二级缓存,查询缓存),对于那些改动不大且经常使用的数据,可以将它们放到缓存中,不必在每次使用时都去查询数据库,缓存机制对提升性能大有裨益。

session缓存:

二级缓存:

查询缓存;

Hibernate缺点:

一、由于对持久层封装过于完整,导致开发人员无法对SQL进行优化,无法灵活使用JDBC的原生SQL,Hibernate封装了JDBC,所以没有JDBC直接访问数据库效率高。要使用数据库的特定优化机制的时候,不适合用Hibernate。

二、框架中使用ORM原则,导致配置过于复杂,一旦遇到大型项目,比如300张表以上,配置文件和内容是非常庞大的,另外,DTO满天飞,性能和维护问题随之而来

三、如果项目中各个表中关系复杂,表之间的关系很多,在很多地方把lazy都设置false,会导致数据查询和加载很慢,尤其是级联查询的时候。

四、Hibernate在批量数据处理时有弱势,对于批量的修改,删除,不适合用Hibernate,这也是ORM框架的弱点。Hibernate不适用于小型项目。

五、针对单一对象简单的增删查改,适合于Hibernate,而对于批量的修改,删除,不适合用Hibernate,这也是OR框架的弱点;要使用数据库的特定优化机制的时候,不适合用Hibernate

mybatis优点:

1:Mybatis封装底层封装了JDBC,所以几乎不用我们配置什么,也不会像使用jdbc代码那么丑陋,Myabtis可通过映射关系来关联的(dao和xml进行映射),我们在连接数据库的时候,连接信息写在一个配置文件中,这样也避免和jdbc一样写个sql,要写个配置连接信息

2:mybatis也是将代码耦合度减低了,在dao层只需写个接口然后把参数通过映射的方式带给xml,然后在xml根据需要写sql

3:mybatis使用连接池连接数据库,相比较与jdbc的每次连接就创建连接对象耗费性能,Mybatis使用连接池,mybatis需要从连接,就冲连接池中拿取出一个对象,使用过后就会放会连接池,这样就不会很耗费性能

4:mybatis也支持动态编写sql,提高sql灵活度

5:mybati能很好的处理一对一,一对多,多对多的关系,提供内联和额外sql的方式

6:Mybatis缓存机制,能很好的节约性能,Mybatis默认开启的是一级缓存,二级缓存需要配置开启

mybatis缺点:

1:我们自己在xml手写sql,会因为关联的表太多导致编写sql难度增大

2:对数据库进行操作编写的sql必须和数据库的字段表名对应起来,导致我们对数据库的依赖很大,要是更改字段或更换数据库,就会造成很大的麻烦

SpringBoot 使用Mybatis部分代码

//连接数据库
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql:///p2p20180531
spring.datasource.username=root
spring.datasource.password=admin
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

dao类

public interface PaymentScheduleDetailMapper {

int insert(PaymentScheduleDetail record);

PaymentScheduleDetail selectByPrimaryKey(Long id);

int updateByPrimaryKey(PaymentScheduleDetail record);

int batchUpdatePayDate(@Param("psId") Long psId, @Param("now") Date now);}

映射xml
在这里插入图片描述
上述代码我们也能发现使用Mybatis是非常方便的

总结:
JDBC:
原生操作数据太过于繁琐,重复代码太多,还需要配置,好的是原生JDBC比较安全.

Hibernate:
hibernate提供了大量的封装,导致不能自定义sql,就不能很好的优化sql语句,也是这一点,慢慢的被Mybatis超越了

Mybatis:
mybatis现在也是持久层的一个主流框架,虽然打手写sql难度要大一些,但是你能控制你写sql的性能,以及行性能优化,对比hibernate Mybatis最大优势也是能够优化sql性能,而hibernate 则是应为封装功能太多,导致不能对sql进行优化,这也是为什么现在Mybatis现在如日中天

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值