• 【MyBatis深入剖析】应用分析与最佳实践


    ##### 文章目标
    1. 了解ORM框架的发展历史,了解MyBatis特性
    2. 掌握MyBatis编程式开发方法和核心对象
    3. 掌握MyBatis核心配置含义
    4. 掌握MyBatis的高级用法与扩展方式
    ---

    ##### 文章定位
    * 适用已掌握MyBatis基本用法且希望对MyBatis进一步深入了解的人群
    * 掌握MyBatis的核心特性,以及如何用好MyBatis
    ---

    ##### 为什么要用MyBatis?
    我们先来回顾一下,在我们Java程序中,当我们要操作数据库,不仅限于MySQL、SqlServer、oracle等数据库,我们最简单、最原始的方式是什么?我想大部分人想到的都是JDBC?那咱来看看Java使用JDBC操作数据的代码

    ```
    public void testJDBC() {
    Connection connection = null;
    Statement statement = null;
    ResultSet resultSet = null;
    Student student = new Student();
    try {
    // 注册MySQL驱动
    Class.forName("com.mysql.cj.jdbc.Driver");
    // 获取连接
    connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis", "root", "root");
    // 执行查询
    statement = connection.createStatement();
    // 定义一个SQL语句
    String sql = "select id,name,qq from student";
    // 调用 statement 包装好的方法 返回一个结果集
    resultSet = statement.executeQuery(sql);
    // 将结果集封装成我们的 BOJO 对象
    while (resultSet.next()) {
    Integer id = resultSet.getInt("id");
    String name = resultSet.getString("name");
    String qq = resultSet.getString("qq");
    student.setId(id);
    student.setName(name);
    student.setQq(qq);
    }
    log.info("student jsonStr is {}", JSON.toJSONString(student));
    } catch (Exception e) {
    log.error("SQL语句执行失败.", e);
    } finally {
    // 关闭连接
    close(resultSet);
    close(statement);
    close(connection);
    }
    }
    ```

    通过编码我们发现,操作数据库有以下步骤
    > 1. 注册驱动
    > 2. 获取连接
    > 3. 创建Statement对象
    > 4. execute()方法执行SQL语句
    > 5. 把结果集转换成POJO对象
    > 6. 关闭连接,释放资源

    当项目复杂时,直接使用原生API会带来什么问题?
    > 1. 代码重复(如果项目复杂,有很多上面步骤的重复代码)
    > 2. 结果集处理太复杂(需要找到对应的数据库字段并转换为POJO对象)
    > 3. 连接管理(手动管理连接,如果出了点错,就有可能造成数据库连接资源消耗殆尽)
    > 4. SQL语句和代码耦合在一起

    如果要解决这种使用源生API的问题,有哪些更简单操作数据库的方式呢?
    > 1. Apache DbUtils (解决了结果集的封装)
    > 2. Spring JDBC
    * Apache DBUtils 核心类
    1. QueryRunner
    2. ResultSetHandler

    部分代码块

    ```
    @Slf4j
    public class StudentDao {
    private static QueryRunner queryRunner;


    static {
    queryRunner = HikariUtil.getQueryRunner();
    }

    /**
    * 使用ID获取学生信息
    *
    * @param id 主键ID
    * @throws SQLException
    */
    public static void selectDataById(Integer id) throws SQLException {
    String sql = "select * from student where id = ? ";
    Object[] params = new Object[]{id};
    StudentDTO studentDTO = queryRunner.query(sql, new BeanHandler<>(StudentDTO.class), params);
    log.info("studentDTO jsonStr is {}", JSON.toJSONString(studentDTO));
    }

    public static void selectList() throws SQLException {
    String sql = "select * from student ";
    List<StudentDTO> studentDTOList = queryRunner.query(sql, new BeanListHandler<>(StudentDTO.class));
    log.info("studentDTOList jsonStr is {}", JSON.toJSONString(studentDTOList));
    }
    }
    ```

    * Spring JDBC 核心类
    1. 实现RowMapper接口、mapRow()方法
    2. 转换结果集返回Object

    ```
    List<StudentDTO> studentDTOList = jdbcTemplate.query("select * from student",new StudentRowMapper());
    log.info("studentDTOList jsonStr is {}", JSON.toJSONString(studentDTOList));
    ```

    * 总结
    * 解决了
    1. 方法封装
    2. 支持数据源
    3. 映射结果集
    * 未解决
    1. SQL语句还是和代码耦合在一起
    2. 参数只能按照顺序传递
    3. 没有实体类和到数据库记录的映射
    4. 没有提供缓存等功能

    要想完美解决上面的问题,那么就需要引入ORM框架了。
    什么是ORM框架呢?
    Object Relational Mapping
    也就是 对象映射关系型数据库。
    MyBatis特性:
    1. 使用连接池对连接进行管理
    2. SQL与代码分离,集中管理
    3. 参数映射和动态SQL
    4. 结果集映射
    5. 缓存管理
    6. 重复SQL的提取<sql>标签
    7. 插件机制

    选择什么ORM框架?
    1. 业务简单的项目可以使用Hibernate
    2. 需要灵活的SQL,可以用MyBatis
    3. 对性能要求高,可以使用JDBC
    4. Spring JDBC可以合ORM框架混用

    ---

    > 今天就总结到这儿,欲知后事如何,且听下回分解。

  • 相关阅读:
    Android 交错 GridView
    Android 从 Android 本地图库选择多个图片
    Android 布局管理器
    Android 高级 Jackson Marshalling(serialize)/Unmarshalling(deserialize)
    Android 基本 Jackson Marshalling(serialize)/Unmarshalling(deserialize)
    Android Jackson 概述
    Andorid 翻书效果
    Android 原生 Android ActionBar Tab (滑动)导航
    Android 原生 Android ActionBar
    Android 关于操作栏 ActionBar 的设计原则【转载+整理】
  • 原文地址:https://www.cnblogs.com/tengfly/p/12739811.html
Copyright © 2020-2023  润新知