您的位置:首页 > 其它

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

2019-05-28 15:50 369 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/weixin_43776652/article/details/90607416

什么是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现在如日中天

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: