##### 文章目标
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框架混用

---

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

【MyBatis深入剖析】应用分析与最佳实践的更多相关文章

  1. 【MyBatis深入剖析】应用分析与最佳实践(下)

    MyBatis编程式开发 MyBatis编程式开发步骤 MyBatis和MySQL Jar包依赖 全局配置文件mybatis-config.xml 映射器Mapper.xml Mapper接口 编程式 ...

  2. Guava Cache 原理分析与最佳实践

    前言 目前大部分互联网架构 Cache 已经成为了必可不少的一环.常用的方案有大家熟知的 NoSQL 数据库(Redis.Memcached),也有大量的进程内缓存比如 EhCache .Guava ...

  3. mybatis 3.x源码深度解析与最佳实践(最完整原创)

    mybatis 3.x源码深度解析与最佳实践 1 环境准备 1.1 mybatis介绍以及框架源码的学习目标 1.2 本系列源码解析的方式 1.3 环境搭建 1.4 从Hello World开始 2 ...

  4. java-mybaits-015-mybatis逆向工程最佳实践【基础mybatis-generator、tk.mybatis、mubatis-plus】

    一.概述 三款框架的功能对比 Mybatis-generator 通用Mapper Mybatis-Plus 代码生成器 支持自动生成Model,Mapper,Mapper XML文件 生成方式不够灵 ...

  5. 《AngularJS深度剖析与最佳实践》简介

    由于年末将至,前阵子一直忙于工作的事务,不得已暂停了微信订阅号的更新,我将会在后续的时间里尽快的继续为大家推送更多的博文.毕竟一个人的力量微薄,精力有限,希望大家能理解,仍然能一如既往的关注和支持sh ...

  6. paip.前端加载时间分析之道优化最佳实践

    paip.前端加载时间分析之道优化最佳实践 1.另存为 ,查看文件尺寸..和图片. 2.view the 另存为的htm静态的文件单个的加载,看时间...可以排除编程语言的问题and 数据库.. ## ...

  7. Bug预防体系(上千bug分析后总结的最佳实践)

    Bug预防体系(上千bug分析后总结的最佳实践) 原创 2017-08-16俞美玲 光荣之路 吴老的<selenium webdriver 实战宝典>出版了!  web常见产品问题及预防 ...

  8. 30分钟带你了解Springboot与Mybatis整合最佳实践

    前言:Springboot怎么使用想必也无需我多言,Mybitas作为实用性极强的ORM框架也深受广大开发人员喜爱,有关如何整合它们的文章在网络上随处可见.但是今天我会从实战的角度出发,谈谈我对二者结 ...

  9. JavaScript Web 应用最佳实践分析

    [编者按]本文作者为 Mathias Schäfer,旨在回顾在客户端大量使用JavaScript 的最佳 Web应用实践.文章系国内 ITOM 管理平台 OneAPM 编译呈现. 对笔者来说,Jav ...

随机推荐

  1. git push错误,如何回滚

    --> git push Counting objects: 81, done.Delta compression using up to 4 threads.Compressing objec ...

  2. [离散化+树状数组]CodeForces - 652D Nested Segments

    Nested Segments time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  3. [快速幂]Codeforces Round #576 (Div. 2)-C. MP3

    C. MP3 time limit per test 1 second memory limit per test 256 megabytes input standard input output ...

  4. win10 Redis闪退问题

    问题:双击redis-server.exe,闪退 解决办法:win+R,输入cmd进入命令行模式,接着cd进入Redis安装根目录,再输入:redis-server.exe redis.windows ...

  5. Java基础语法(5)-特殊流程控制语句

    title: Java基础语法(5)-特殊流程控制语句 blog: CSDN data: Java学习路线及视频 1.嵌套循环结构 将一个循环放在另一个循环体内,就形成了嵌套循环.其中,for ,wh ...

  6. 优化Python代码的4种方法

    介绍 作为数据科学家,编写优化的Python代码非常非常重要.杂乱,效率低下的代码即浪费你的时间甚至浪费你项目的钱.经验丰富的数据科学家和专业人员都知道,当我们与客户合作时,杂乱的代码是不可接受的. ...

  7. 详解Redis持久化(RDB和AOF)

    详解Redis持久化(RDB和AOF) 什么是Redis持久化? Redis读写速度快.性能优越是因为它将所有数据存在了内存中,然而,当Redis进程退出或重启后,所有数据就会丢失.所以我们希望Red ...

  8. Homebrew中国镜像安装与配置

    1.删除旧Homebrew ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/u ...

  9. vue2.0开发环境下解决跨域问题

    1.找到vue 项目下的配置文件 /config/index.js 2.找到 proxyTable 配置项 proxyTable: { '/api': { target: 'http://www.xx ...

  10. 阿里云ECS(Ubuntu)单节点Kubernetes部署

    参考资料: kubernetes官网英文版 kubernetes官网中文版 前言 这篇文章是比较久之前写的了,无聊翻了下博客发现好几篇博文排版莫名其妙的变了... 于是修改并完善了下.当初刚玩k8s的 ...