【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 ...
随机推荐
- django之 F与Q查询
F与Q查询 F查询 why?
- hdu2612 又是迷宫系列
题目链接:http://icpc.njust.edu.cn/Problem/Hdu/2612/ 题意:有两个人在地图上不同的位置,地图上由若干个餐厅,求两人能同时到达一个餐厅所用最少的总时间. 代码如 ...
- Redis底层函数详解
Redis底层函数详解 serverCron 函数 它负责管理服务器的资源,并维持服务器的正常运行.在执行 serverCron 函数的过程中会调用相关的子函数,如 trackOperationsPe ...
- Redis 主从复制技术原理
基于前面介绍的 Redis 内容,Redis 只能作为一个单机内存数据库,一旦服务器宕机即不能提供服务,即便能通过持久化策略重启恢复数据,往往也做不到百分之百还原.再一个就是,单机的 Redis 需要 ...
- 企业级自动化部署方案——ansible实现tomcat自动安装和配置
共耗时10多个小时 思路一 总体设计 ansible-playbook目录结构 [root@ansible ~]# tree /etc/ansible/roles/tomcat /etc/ansibl ...
- python之面向对象的关系
一.从空间角度研究类 类外面可以给对象封装属性 class A: address = '美丽富饶的沙河' def __init__(self, name): self.name = name def ...
- Jenkins打造多分支流水线指南
overview: 多分支工作流程带来了以下几个关键能力: 在代码仓库中,每个新分支都有自己单独的工作流水线(job). 每个工作流水线都记录了对应分支的构建和变更历史. 可以自定义设置流水线随着分支 ...
- C# 基础知识系列-7 Linq详解
前言 在上一篇中简单介绍了Linq的入门级用法,这一篇尝试讲解一些更加深入的使用方法,与前一篇的结构不一样的地方是,这一篇我会先介绍Linq里的支持方法,然后以实际需求为引导,分别以方法链的形式和类S ...
- CI / CD /CD 持续集成 持续交付 持续部署
CI / CD /CD 持续集成 持续交付 持续部署 CI CD 是啥?干了啥? CI continuous integration 持续集成 CD continuous delivery 持续交付 ...
- CoderForces 327D Block Tower
Portal:http://codeforces.com/problemset/problem/327/D 一座红塔200人,一座蓝塔100人,只有与蓝塔相邻才可以建红塔. '.'处可建塔 '#'处不 ...