Mybatis和JDBC区别

今天面试中问了这个问题,当时答的不好,现在整理一下。

JDBC 是 Java 提供的一个操作数据库的 API;

MyBatis 是一个支持普通SQL查询存储过程高级映射的优秀持久层框架。MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索封装。MyBatis 可以使用简单的XML 或注解用于配置和原始映射,将接口和 Java 的 POJO(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。

MyBatis 是对 JDBC 的封装。相对于 JDBC,MyBatis 有以下优点:

1. 优化获取和释放

我们一般在访问数据库时都是通过数据库连接池来操作数据库,数据库连接池有好几种,比如 C3P0、DBCP,也可能采用容器本身的 JNDI 数据库连接池。我们可以通过 DataSource 进行隔离解耦,我们统一从 DataSource 里面获取数据库连接,DataSource 具体由 DBCP 实现还是由容器的 JNDI 实现都可以,所以我们将 DataSource 的具体实现通过让用户配置来应对变化。

C3P0 xml 配置:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"       
      destroy-method="close">      
   <property name="driverClass" value="oracle.jdbc.driver.OracleDriver"/>      

   <property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:ora9i"/>      
   <property name="user" value="admin"/>      
   <property name="password" value="1234"/>      
</bean> 

DBCP xml 配置:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"       
       destroy-method="close">       
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />      
    <property name="url" value="jdbc:mysql://localhost:3309/sampledb" />      
    <property name="username" value="root" />      
    <property name="password" value="1234" />      
</bean>

DURID xml 配置:

 

<bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource">  

  <property name="driverClassName">  

    <value>com.mysql.jdbc.Driver</value>  

  </property>  

  <property name="url">  

    <value>${jdbc_url_gx}</value>  

  </property>  

  <property name="username">  

    <value>${jdbc_username_gx}</value>  

  </property>  

  <property name="password">  

    <value>${jdbc_password_gx}</value>  

  </property

</bean>

2.SQL 统一管理,对数据库进行存取操作

我们使用 JDBC 对数据库进行操作时,SQL 查询语句分布在各个 Java 类中,这样可读性差,不利于维护,当我们修改 Java 类中的 SQL 语句时要重新进行编译。

Mybatis 可以把 SQL 语句放在配置文件中统一进行管理,以后修改配置文件,也不需要重新就行编译部署。

3. 生成动态 SQL 语句

我们在查询中可能需要根据一些属性进行组合查询,比如我们进行商品查询,我们可以根据商品名称进行查询,也可以根据发货地进行查询,或者两者组合查询。如果使用 JDBC 进行查询,这样就需要写多条 SQL 语句。

Mybatis 可以在配置文件中通过使用 <if test=””></if> 标签进行 SQL 语句的拼接,生成动态 SQL 语句。比如下面这个例子:

<select id="getCountByInfo" parameterType="User" resultType="int">
        select count(*) from user
        <where>
            <if test="nickname!=null">
                and nickname = #{nickname}
            </if>
            <if test="email!=null">
                and email = #{email}
            </if>
        </where>

</select>

就是通过昵称或 email 或者二者的组合查找用户数。

4. 能够对结果集进行映射

我们在使用 JDBC 进行查询时,返回一个结果集 ResultSet, 我们要从结果集中取出结果封装为需要的类型

在 Mybatis 中我们可以设置将结果直接映射为自己需要的类型,比如:JavaBean 对象、一个 Map、一个 List 等等。像上个例子中就是将结果映射为 int 类型。