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