【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 ...
随机推荐
- python爬取某站新闻,并分析最近新闻关键词
在爬取某站时并做简单分析时,遇到如下问题和大家分享,避免犯错: 一丶网站的path为 /info/1013/13930.htm ,其中13930为不同新闻的 ID 值,但是这个数虽然为升序,但是没有任 ...
- CompTIA Security+ 常见知识点
前言: Security+ 认证是一种中立第三方认证,其发证机构为美国计算机行业协会CompTIA: 是和CISSP.CISA等共同包含在内的国际IT业热门认证之一,和CISSP偏重信息安全管理相比, ...
- RabbitMQ 在Ubuntu18.04上的安装
1.安装erlang由于rabbitMq需要erlang语言的支持,在安装rabbitMq之前需要安装erlang sudo apt-get install erlang2.安装Rabbitmq更新源 ...
- 洛谷 P3808 【模板】AC自动机(简单版) 题解
原题链接 前置知识: 字典树.(会 \(\texttt{KMP}\) 就更好) 显然呢,本题用 字典树 和 \(\texttt{KMP}\) 无法解决问题. 所以我们发明了一个东西: \(\textt ...
- Java并发编程(03):多线程并发访问,同步控制
本文源码:GitHub·点这里 || GitEE·点这里 一.并发问题 多线程学习的时候,要面对的第一个复杂问题就是,并发模式下变量的访问,如果不理清楚内在流程和原因,经常会出现这样一个问题:线程处理 ...
- 关于Spring的常见面试题
1.Spring是什么? Spring是一个轻量级的IoC和AOP容器框架.是为Java应用程序提供基础性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求.常见的配置方 ...
- OpenCV-Python 对极几何 | 五十一
目标 在本节中 我们将学习多视图几何的基础知识 我们将了解什么是极点,极线,极线约束等. 基础概念 当我们使用针孔相机拍摄图像时,我们失去了重要信息,即图像深度. 或者图像中的每个点距相机多远,因为它 ...
- Java线程及其实现方式
一.线程&多线程 线程: 线程是进程的一个实体,是 CPU 调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程 自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序 ...
- DEV Chart控件鼠标选中某条曲线
this.Chart.ObjectSelected += new DevExpress.XtraCharts.HotTrackEventHandler(this.Chart_ObjectSelecte ...
- P1006 传纸条(二维、三维dp)
P1006 传纸条 输入输出样例 输入 #1 复制 3 3 0 3 9 2 8 5 5 7 0 输出 #1 复制 34 说明/提示 [限制] 对于 30% 的数据,1≤m,n≤10: 对于 100% ...