【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框架混用
---
> 今天就总结到这儿,欲知后事如何,且听下回分解。
【MyBatis深入剖析】应用分析与最佳实践的更多相关文章
- 【MyBatis深入剖析】应用分析与最佳实践(下)
MyBatis编程式开发 MyBatis编程式开发步骤 MyBatis和MySQL Jar包依赖 全局配置文件mybatis-config.xml 映射器Mapper.xml Mapper接口 编程式 ...
- Guava Cache 原理分析与最佳实践
前言 目前大部分互联网架构 Cache 已经成为了必可不少的一环.常用的方案有大家熟知的 NoSQL 数据库(Redis.Memcached),也有大量的进程内缓存比如 EhCache .Guava ...
- mybatis 3.x源码深度解析与最佳实践(最完整原创)
mybatis 3.x源码深度解析与最佳实践 1 环境准备 1.1 mybatis介绍以及框架源码的学习目标 1.2 本系列源码解析的方式 1.3 环境搭建 1.4 从Hello World开始 2 ...
- java-mybaits-015-mybatis逆向工程最佳实践【基础mybatis-generator、tk.mybatis、mubatis-plus】
一.概述 三款框架的功能对比 Mybatis-generator 通用Mapper Mybatis-Plus 代码生成器 支持自动生成Model,Mapper,Mapper XML文件 生成方式不够灵 ...
- 《AngularJS深度剖析与最佳实践》简介
由于年末将至,前阵子一直忙于工作的事务,不得已暂停了微信订阅号的更新,我将会在后续的时间里尽快的继续为大家推送更多的博文.毕竟一个人的力量微薄,精力有限,希望大家能理解,仍然能一如既往的关注和支持sh ...
- paip.前端加载时间分析之道优化最佳实践
paip.前端加载时间分析之道优化最佳实践 1.另存为 ,查看文件尺寸..和图片. 2.view the 另存为的htm静态的文件单个的加载,看时间...可以排除编程语言的问题and 数据库.. ## ...
- Bug预防体系(上千bug分析后总结的最佳实践)
Bug预防体系(上千bug分析后总结的最佳实践) 原创 2017-08-16俞美玲 光荣之路 吴老的<selenium webdriver 实战宝典>出版了! web常见产品问题及预防 ...
- 30分钟带你了解Springboot与Mybatis整合最佳实践
前言:Springboot怎么使用想必也无需我多言,Mybitas作为实用性极强的ORM框架也深受广大开发人员喜爱,有关如何整合它们的文章在网络上随处可见.但是今天我会从实战的角度出发,谈谈我对二者结 ...
- JavaScript Web 应用最佳实践分析
[编者按]本文作者为 Mathias Schäfer,旨在回顾在客户端大量使用JavaScript 的最佳 Web应用实践.文章系国内 ITOM 管理平台 OneAPM 编译呈现. 对笔者来说,Jav ...
随机推荐
- VsCode编辑器那些事
1.怎么改成中文的? 按快捷键“Ctrl+Shift+P” 在框下点击“configur Display language" 会跳转至商店,选择插件下载“Chinese (Simplifie ...
- LocalStorage与SessionStorage
localStorage与sessionStorage 每日更新前端基础,如果觉得不错,点个star吧
- Oracle中rownum的用法总结
日期:2019/5/22 内容:oracle:数据库:rownum 数据库查询中,常用到"选取前X个"这样的问题,Oracle没有TOP关键字,这类问题都是通过rownum ...
- 多GPU使用详解
目录: 介绍 记录设备状态 手动分配状态 允许GPU内存增长 在多GPU系统是使用单个GPU 使用多个 GPU 一.介绍 在一个典型的系统中,有多个计算设备.在 TensorFlow 中支持的设备类型 ...
- CSS3 - 新单位vw、vh、vmin、vmax使用详解
参考文章出自:https://www.hangge.com/blog/cache/detail_1715.html
- SpringBoot 集成ehcache
1, 项目实在springboot 集成mybatis 的基础上的: https://www.cnblogs.com/pickKnow/p/11189729.html 2,pom 如下,有的不需要加, ...
- iOS OCR
身份证识别,又称 OCR 技术.OCR 技术是光学字符识别的缩写,是通过扫描等光学输入方式将各种票据.报刊.书籍.文稿及其它印刷品的文字转化为图像信息,再利用文字识别技术将图像信息转化为可以使用的计算 ...
- 移动自动化appium(2)- Allure报告使用详解
6 Allure报告 6.1 Allure介绍 Allure是一个独立的报告插件,生成美观易读的报告,比之前的html好看,目前支持的语言:Java.PHP.Ruby.Python.C#等 6.2 A ...
- JAVA研发面试题
转自:http://www.jianshu.com/p/1f1d3193d9e3 Java基础的知识点推荐<Java编程思想>,JVM的推荐<深入理解Java虚拟机>,Spri ...
- RecyclerView 的 Item 的单击事件
RecyclerView 的每个Item的点击事件并没有像 ListView 一样封装在组件中,需要 Item 的单击事件时就需要自己去实现,在 Adapter 中为RecyclerView 添加单击 ...