小言_互联网的博客

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

312人阅读  评论(0)

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 编程的不足之处。


  
  1. public static void main (String[] args) {
  2. Connection connection = null;
  3. PreparedStatement preparedStatement = null;
  4. ResultSet resultSet = null;
  5. try {
  6. //加载数据库驱动
  7. Class.forName( "com.mysql.jdbc.Driver");
  8. //通过驱动管理类获取数据库链接
  9. connection = DriverManager.getConnection( "jdbc:mysql://localhost:3306/test?characterEncoding=utf-8", "root", "mysql");
  10. //定义sql语句 ?表示占位符
  11. String sql = "select * from user where username = ?";
  12. //获取预处理statement
  13. preparedStatement = connection.prepareStatement(sql);
  14. //设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值
  15. preparedStatement.setString( 1, "张三");
  16. //向数据库发出sql执行查询,查询出结果集
  17. resultSet = preparedStatement.executeQuery();
  18. //遍历查询结果集
  19. while (resultSet.next()) {
  20. System.out.println(resultSet.getString( "id") + " " + resultSet.getString( "username"));
  21. }
  22. } catch (Exception e) {
  23. e.printStackTrace();
  24. } finally {
  25. //释放资源
  26. if (resultSet != null) {
  27. try {
  28. resultSet.close();
  29. } catch (SQLException e) {
  30. // TODO Auto-generated catch block
  31. e.printStackTrace();
  32. }
  33. }
  34. if (preparedStatement != null) {
  35. try {
  36. preparedStatement.close();
  37. } catch (SQLException e) {
  38. // TODO Auto-generated catch block
  39. e.printStackTrace();
  40. }
  41. }
  42. if (connection != null) {
  43. try {
  44. connection.close();
  45. } catch (SQLException e) {
  46. // TODO Auto-generated catch block
  47. e.printStackTrace();
  48. }
  49. }
  50. }
  51. }

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

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

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

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

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

 

三、Mybatis 的使用示例

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

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

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


  
  1. /**
  2. * 用户实体
  3. */
  4. public class User {
  5. private int id;
  6. private String username;// 用户姓名
  7. private String sex;// 性别
  8. private Date birthday;// 生日
  9. private String address;// 地址
  10. }
  11. /**
  12. * 用户管理mapper
  13. */
  14. public interface UserMapper {
  15. //查询用户列表
  16. public List <User> findUserByUsername(String username);
  17. }
  18. <!-- 映射文件 -->
  19. <?xml version="1.0" encoding="UTF-8" ?>
  20. <!DOCTYPE mapper
  21. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  22. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  23. <mapper namespace="com.test.mybatis.mapper.UserMapper">
  24. <!-- 查询用户列表 -->
  25. <select id="findUserByUsername" parameterType="java.lang.String"
  26. resultType= "cn.itcast.mybatis.po.User">
  27. select * from user where username = #{username}
  28. </select>
  29. </mapper>
  30. /**
  31. * 用户管理service
  32. */
  33. public class UserServiceImpl implements UserService {
  34. @Autowired
  35. private UserMapper userMapper;
  36. /**
  37. * 查询用户列表
  38. */
  39. @Override
  40. public List <User> findUserByUsername(String username){
  41. return userMapper.findUserByUsername(username);
  42. }
  43. }

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

 

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

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

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

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

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

 

五、结语

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

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

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

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

 

 

 

 


转载:https://blog.csdn.net/keyboard_/article/details/127477755
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场