【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框架混用

---

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

posted @ 2020-04-20 19:07  生命不息,学习不止  阅读(244)  评论(0编辑  收藏  举报