JDBC原生操作

在早期开发还没有ORM框架时我们要操作数据库都是通过JDBC来操作。

JDBC测试代码:

/**
 * 原生操作JDBC方式
 * @Author: maomao
 * @Date: 2021-04-07 10:59
 */
public class JdbcTest {

    public static final String URL = "jdbc:mysql://127.0.0.1:3306/data_test?useUnicode=true&characterEncoding=utf-8&rewriteBatchedStatements=true";
    public static final String USER_NAME = "root";
    public static final String PASSWORD = "123456";

    @Test
    public void testJdbc(){
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;

        try {
            //打开连接
            connection = DriverManager.getConnection(URL,USER_NAME,PASSWORD);

            //执行SQL
            statement = connection.createStatement();
            String sql = "select * from user_department where id = 1";
            resultSet = statement.executeQuery(sql);

            //获取结果集,并封装到java对象中
            while (resultSet.next()){
                User user = new User();
                user.setId(resultSet.getLong("id"));
                user.setName(resultSet.getString("name"));
                user.setAge(resultSet.getInt("age"));
                System.out.println(user);
            }
            //后续使用逻辑。。。。

        }catch (SQLException e){
            e.printStackTrace();
        }finally {
            //关闭资源
            try {
                if (resultSet != null) resultSet.close();
            } catch (SQLException se2) {
            }
            try {
                if (statement != null) statement.close();
            } catch (SQLException se2) {
            }
            try {
                if (connection != null) connection.close();
            } catch (SQLException se) {
                se.printStackTrace();
            }
        }
    }
}

主要分为以下几步:

  1. 注册数据库驱动
  2. 获取一个Connection连接
  3. 创建一个Statement对象
  4. 执行execute()方法执行sql,获得ResultSet结果集
  5. 通过ResultSet获取数据,给POJO赋值,转为java对象
  6. 最后关闭数据库相关资源,包括ResultSet、Statement、Connection

如果你 有幸 接触过一些早期的老项目,可能会在项目Dao层看到很多这样的操作。

好一点的会将数据库这些操作做一个工具封装,不好的你会看到每个查询方法中就会有类似以上测试代码一样的内容。

你可以想象一下现在每个常规的数据库操作,比如byId()、save()、update()等等这些方法在以前都包装在类似上边测试代码中的样子(瑟瑟发抖)。

ORM框架

ORM(Object Relational Mapping)也就是对象与关系映射

MyBatis 的由来(1)-LMLPHP

在早期诞生的比较主流的一个ORM框架是Hibernate,在2001年时诞生了第一个版本。

它帮我们解决了JDBC时期复杂的对象关系映射问题,简化了数据库开发操作。让开发人员无需再关注数据库连接、对象与数据库表的映射关系转换问题。所以早期主流开发J2EE是从SSH(struts + spring + hibernate)开始的。

hibernate本身功能非常强大,有自己的查询语法HQL可以通过操作对象关系来生成对应的SQL语句,也可以根据数据库方言生成兼容各数据库场景的SQL,所以移植性好。自动管理连接资源,还提供了缓存机制。

所以hibernate毫无疑问成为了当时J2EE开发时的主流ORM框架。

但Hibernate在业务复杂的项目中也存在一些问题:

  1. 需要学习新的HQL语法
  2. 自动生成SQL的方式,如果需要基于SQL去做一些优化的话,非常困难,导致性能优化是一个问题。
  3. 不支持动态SQL,无法根据条件自动生成SQL

基于以上问题,我们需要一个更加灵活的框架。此时就诞生了MyBatis(早期叫iBatis)。

MyBatis

MyBatis官网地址

”半自动化“的ORM框架MyBatis就解决了上边几个问题。”半自动化“是相当于Hibernate全自动化来说的。它的封装程度没有Hibernate那么高,不会自动生成全部的SQL语句,主要解决的是SQL和对象的映射问题。

在MyBatis里,sql和代码是分离的,所以会写SQL基本上就会用MyBatis,没有额外的学习成本。

所以J2EE又迎来了几次架构变更

  • SSI (Struts2 + Spring + iBatis)
  • SSM(Spring MVC + Spring + MyBatis)

MyBatis凭借小巧、简单易学、灵活、sql与代码解耦等特点慢慢取代了Hibernate成为主流ORM框架直到现在。

04-13 08:30