持久层技术对比:Mybatis 与 JDBC 的区别到底在哪里

CSDN话题挑战赛第2期
参赛话题:Java技术分享

目录

一、引言

二、原生 JDBC 的使用示例

三、Mybatis 的使用示例

四、原生 JDBC 和 Mybatis 的各自使用场景

五、结语


一、引言

上次写文章是在中秋之前,参加 csdn 的中秋活动,距今将近一个半月。期间有好几次提笔想写一些文字,却提不起兴趣,总觉得写不好。我反思了很久,决定先学习怎么写作。这段时间以来,断断续续的读了几本关于如何写作的书,大概的掌握了一些写作方法,所以今天先写一篇技术文章来练笔。本文会介绍JDBC 和 Mybatis 的开发方式和使用场景,帮助初学者更好的理解持久层技术,并推广 Mybatis 等持久层框架。从现在开始,假设你是初学者。在学习完 JDBC 后,就会继续学习 Mybatis 等持久层框架。在学习的过程中,我们会考虑到一个问题。既然有了JDBC 技术,为什么还会出现持久层框架?

二、原生 JDBC 的使用示例

首先,我们要知道 JDBC 是什么?

JDBC 是一种规范,是一套接口定义,它定义了如何使用JAVA语言操作数据库。然后各大数据库厂商使用Java 语言实现了这一套接口,我们在 Java 项目中就可以通过连接器操作数据库了。最常见的有 Mysql 连接器,不太清楚的可以看我之前写的文章:mysql-connector-java 详解

下面,我们先看一下原生的 JDBC 编程的使用示例,并总结一下只使用 JDBC 编程的不足之处。

public static void main(String[] args) {
    Connection connection = null;
    PreparedStatement preparedStatement = null;
    ResultSet resultSet = null;
    try {
        //加载数据库驱动
        Class.forName("com.mysql.jdbc.Driver");
        //通过驱动管理类获取数据库链接
        connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?characterEncoding=utf-8", "root", "mysql");
        //定义sql语句 ?表示占位符
        String sql = "select * from user where username = ?";
        //获取预处理statement
        preparedStatement = connection.prepareStatement(sql);
        //设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值
        preparedStatement.setString(1, "张三");
        //向数据库发出sql执行查询,查询出结果集
        resultSet = preparedStatement.executeQuery();
        //遍历查询结果集
        while (resultSet.next()) {
            System.out.println(resultSet.getString("id") + "  " + resultSet.getString("username"));
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        //释放资源
        if (resultSet != null) {
            try {
                resultSet.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if (preparedStatement != null) {
            try {
                preparedStatement.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

以上是 JDBC 的编程示例,现在我们来总结一下不足之处,如下面四点所示:

1、在创建连接,关闭连接,异常处理的时侯有很多冗余、重复的代码,导致一个很长的方法中业务代码只占一小部分

2、Sql 语句在代码中硬编码,不易维护

3、Sql 输入参数需要自己映射,要手动处理sql中的占位符,将输入参数和占位符对应起来

4、获取数据库返回的数据时,需要手动创建对象,再遍历结果集,将数据放到对象中

三、Mybatis 的使用示例

首先,我们要知道 Mybatis 是什么?

Mybatis 是一个持久层框架,它对 JDBC 的操作数据库的过程进行封装,使开发者只需要关注 Sql 本身,而不需要花费精力去处理例如注册驱动、创建 connection、创建 statement、手动设置参数、检索结果集等繁琐的过程。Mybatis 简化了原生 JDBC 的开发过程,弥补了原生 JDBC 的不足之处。

下面,我们先看一下 Mybatis 编程的使用示例。

/**
 * 用户实体
 */
public class User {
private int id;
private String username;// 用户姓名
private String sex;// 性别
private Date birthday;// 生日
private String address;// 地址
}

/**
 * 用户管理mapper
 */
public interface UserMapper {
//查询用户列表
public List<User> findUserByUsername(String username);
}

 <!-- 映射文件 -->
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.test.mybatis.mapper.UserMapper">
<!-- 查询用户列表 -->
<select id="findUserByUsername" parameterType="java.lang.String" 
resultType="cn.itcast.mybatis.po.User">
   select * from user where username = #{username} 
</select>
</mapper>

/**
 * 用户管理service
 */
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;
    
    /**
     * 查询用户列表
     */
    @Override
    public List<User> findUserByUsername(String username){
        return userMapper.findUserByUsername(username);
    }
}
 

以上是使用 Mybatis 操作数据库的示例,在最后的 service 中可以看到操作数据库很简单,没有冗余的创建连接,关闭连接,处理异常代码。sql 的输入参数会自动映射到sql中,并且 sql 的输出结果集会自动映射到 Java 对象中。让我们可以更加专注于业务代码,不用考虑与业务无关的代码。

四、原生 JDBC 和 Mybatis 的各自使用场景

原生 JDBC 的使用场景有两方面。

一方面是在刚开始学习 Java 技术的时候,我们会在项目中使用原生 JDBC 。

另一方面,在一些非常老的项目中会用到原生的 JDBC ,因为历史原因,在开发这些老项目时,还没有出现持久层框架。如果这些老项目做了技术升级,就会逐步的将原生 JDBC 替换成持久层框架。

总的来说,Mybatis 简化了 JDBC 的开发过程。作为初学者,我们在学习技术时,要充分的理解和学习好 JDBC。但是在正式项目中,为了更好、更快的开发项目,一般都会使用 Mybatis 等持久化框架。

五、结语

最后,做一个总结,原生 JDBC 是使用 Java 语言操作数据库的基础,一定要认真学习,掌握了基础才能更好的学习框架,理解框架的原理。

只有当我们了解到使用原生的 JDBC 操作数据库的不足之处,才能更好的体会到 Mybatis 等持久层框架的优越性。

再说一下后续的规划,我会尝试写一些系列化、系统化的技术文章,将之前写的文章由一个个独立的点串起来成为一条线,使读者能够更好的理解相关技术。

如果有任何问题,欢迎在评论区留言,我会一一解答的。

猜你喜欢

转载自blog.csdn.net/keyboard_/article/details/127477755
今日推荐