【JavaEE】之MyBatis与原生JDBC、Hibernate访问数据库的比较
首先来看一下原生JDBC访问数据库的代码:
public static void main(String[] args) {
// 数据库连接
Connection connection = null;
// 预编译的Statement,使用预编译的Statement提高数据库的性能
PreparedStatement statement = null;
// 结果集
ResultSet resultSet = null;
try {
// 加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
// 通过驱动管理类获取数据库的连接
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "123456");
// 定义SQL语句,“?”表示占位符
String sql = "select * from emp where ename = ?";
// 获取预处理的Statement
statement = connection.prepareStatement(sql);
// 设置参数,第一个参数为SQL语句中占位符的序号(从1开始),第二个参数是设置的参数值
statement.setString(1, "smith");
// 向数据库发出SQL进行查询,查询出结果集
resultSet = statement.executeQuery();
// 遍历结果集
while (resultSet.next()) {
System.out.println(resultSet.getInt("empno") + "\t" + resultSet.getString("ename"));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (resultSet != null) {
resultSet.close();
}
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
使用原生JDBC访问数据库,存在以下四个问题:
- 数据库使用时就创建,不使用就释放,即需要对数据库进行频繁的开启和关闭,造成数据库资源的浪费,影响数据库的性能。
- 将SQL语句硬编码到JAVA代码中,如果后期SQL语句发生变化,就需要重新编译JAVA代码,不利于系统的维护。
- PreparedStatement中传入的参数都硬编码进了JAVA代码中,不利于系统的维护。
- 从ResultSet中遍历结果集时,将字段名都进行了硬编码,不利于系统的维护。
针对上面的四个问题,MyBatis都对其进行了一一解决:
- 针对上面的第一个问题,MyBatis使用了数据库连接池进行数据库管理。在SSM框架中,常用的数据库连接池有 dbcp、c3p0、druid 等,现在最常用的是 druid 。
- 针对上面的第二个问题,MyBatis的解决方案是创建Mapper.xml文件对SQL语句进行统一的管理。
- 针对上面的第三个问题,MyBatis的解决方案是将参数以parameterType的方式注入到Mapper.xml中的SQL语句中。
- 针对上面的第四个问题,MyBatis的解决方案是以resultType的方式将结果自动映射成JAVA对象。
以上是MyBatis与JAVA原生JDBC访问数据库的比较。下面介绍一下MyBatis与Hibernate之间访问数据库的比较。
(1)字段注入
- Hibernate是SSH框架(Struts2 + Spring + Hibernate)中的一部分,我们只需要定义与数据表字段相同或基本相同的POJO,就可以在运行的时候动态的将POJO中的字段映射到数据库中,这种方式操作耗时多。
- MyBatis是SSM框架(Spring + SpringMVC + MyBatis)中的一部分,MyBatis是将数据表映射成JAVA对象,通过输入映射、输出映射对数据表进行操作,所有数据和表结构都是从数据库中映射来的,因此MyBatis相比与Hibernate耗时较少。
(2)SQL编写
- Hibernate不需要程序员编写SQL语句,所有的SQL语句都是自动生成的,程序员只需要调用insert、select、update、delete等方法就可以了,但这种方式对SQL优化以及一些比较复杂的SQL语句束手无策,而且如果表结构发生变化,那么Hibernate就需要重新将POJO映射到数据库,耗时很大,因此Hibernate适合那些需求变化不多的中小型项目,如后台管理系统、ERP等等。
- MyBatis需要程序员自己编写SQL语句,这使得系统可以完全轻松的应对复杂的SQL以及SQL优化,而且由于MyBatis是从数据库映射到POJO对象,因此不需要考虑表结构变化后引起的映射耗时,适合需求变化较多的项目,如互联网项目等。
从上面的分析来看,无论从性能、耗时,还是后期的维护角度,MyBatis相比与JDBC和Hibernate,似乎都有一定的优势,也许这就是为什么SSM现在很火的原因吧。
【JavaEE】之MyBatis与原生JDBC、Hibernate访问数据库的比较的更多相关文章
- 使用原生JDBC方式对数据库进行操作
使用原生JDBC方式对数据库进行操作,包括六个步骤: 1.加载JDBC驱动程序 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM.可以通过java.lang.Class类的静态方法forNa ...
- 原生Jdbc操作Mysql数据库开发步骤
原生Jdbc操作Mysql数据库开发步骤 原生的Jdbc就是指,不使用任何框架,仅用java.sql包下的方法实现数据库查询等的操作. 下面是开发步骤: 1.导入数据库驱动包 ...
- JDBC API访问数据库的基本步骤。
JDBC本质:官方定义了一套操作所有关系型数据库的规则(接口),各个数据库厂商实现这个接口,提供数据库驱动jar包. 我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类. 任 ...
- 【JAVA - SSM】之MyBatis与原生JDBC、Hibernate访问数据库的比较
首先来看一下原生JDBC访问数据库的代码: public static void main(String[] args) { // 数据库连接 Connection connection = null ...
- 2017.11.12 web中JDBC 方式访问数据库的技术
JavaWeb------ 第四章 JDBC数据库访问技术 在JavaWeb应用程序中数据库访问是通过Java数据库连接(JavaDateBase Connectivity简称JDBC)数据库的链接一 ...
- Mybatis基于注解的方式访问数据库
1. 使用方式:在Service层直接调用 package com.disappearwind.service; import org.springframework.beans.factory.an ...
- 原生jdbc操作mysql数据库详解
首先给大家说一下使用JDBC链接数据库的步骤 1.加载链接数据库驱动 2.建立数据库链接 3.创建数据库操作对象 4.编写sql语句,执行sql语句 5.获取结果集 6.释放资源 我这边采用的是mav ...
- 通过JDBC API访问数据库的基本步骤
1.获取要访问的数据库的JDBC驱动程序的类库文件,把它放到classpath中. 2.在程序中加载并注册JDBC驱动程序.例如,以下代码用于加载并注册MySQL驱动程序: //加载MySQL Dri ...
- 1、原生jdbc连接oracle数据库简单介绍
一.jbdc的常用API1.Connection:数据库的链接对象2.statement:数据库sql执行对象3.preparedStatment:sql的预编译处理对象,是statement子接口4 ...
随机推荐
- UE4蓝图与C++交互——射击游戏中多武器系统的实现
回顾 学习UE4已有近2周的时间,跟着数天学院"UE4游戏开发"课程的学习,已经完成了UE4蓝图方面比较基础性的学习.通过UE4蓝图的开发,我实现了类似CS的单人版射击游戏,效 ...
- Spring Cloud Eureka源码分析---服务注册
本篇我们着重分析Eureka服务端的逻辑实现,主要涉及到服务的注册流程分析. 在Eureka的服务治理中,会涉及到下面一些概念: 服务注册:Eureka Client会通过发送REST请求的方式向Eu ...
- Logstash 安装及简单实用(同步MySql数据到Elasticsearch)(Windows)
Logstash是一款轻量级的日志搜集处理框架,可以方便的把分散的.多样化的日志搜集起来,并进行自定义的处理,然后传输到指定的位置,比如某个服务器或者文件 Windows环境: 1.下载logstas ...
- Docker 从入门到掉坑
Docker 介绍 简单的对docker进行介绍,可以把它理解为一个应用程序执行的容器.但是docker本身和虚拟机还是有较为明显的出入的.我大致归纳了一下,可以总结为以下几点: docker自身也有 ...
- 运用wxs制作微信小程序左滑功能和跳转,性能更优越
锲子 微信小程序自定义左滑功能加上跳转,换成以往,左滑功能的逻辑一般是在js中实现,但在拖动方面,性能并不是那么的流畅.如今,官方新扩展了一套脚本语言wxs,在IOS设备上运行,性能会比JS快2~20 ...
- Pandas常用数据结构
Pandas 概述 Pandas(Python Data Analysis Library)是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的.Pandas 纳入了大量库和一些标准的数 ...
- 网络安全-主动信息收集篇第二章SNMP扫描
SNMP扫描: snmp在中大型企业中可以用来做网络管理和网络监控的使用,当开启了snmp简单网络管理后,那么客户机就可以通过这个协议向该设备发送snmp协议内容可以轻松查询到目标主机的相关信息. 以 ...
- csp模拟69
考试一眼看出$T3$原题,但是没做过,心态爆炸. 然后去看$T1$,迷之认为它是矩阵快速幂?推了一个小时,发现在转移过程中方案数并不均匀分布,然后就挂了. 决定先去看T3,只会$O(n\sqrt{n} ...
- CSPS模拟 81
Z哥的题,真是见题如见人啊.. T1 实际状态数没有那么多,不要被数字吓倒就是了. 另外为什么吧轮廓线给忘了啊 T3 觉得自己是正解但是被hack了? 考试的时候想到了复杂度对的的解法,但是 spfa ...
- NOIP模拟 11
差点迟到没赶上开题 开题后看了T1,好像一道原题,没分析复杂度直接敲了个NC线段树,敲了个暴力,敲了个对拍,就1h了.. 对拍还对出错了,发现标记下传有点问题,改了以后对拍通过,就把T1扔掉看T2 觉 ...