生动形象MyBatis:JDBC和MyBatis评价转载
原创JDBC相关概念
Java已经制定了程序JDBC连接到数据库,SQL数据库编程,JDBC是由SUN公司提出的一些栏目规范,只定义了接口规范,具体实现由各数据库厂商来实现,是一种典型的桥接模式。
桥接模式是一种结构化的设计模式,其主要特点是将抽象和行为实现分离,分别定义接口,能够保持各部分的独立性,并能应对它们的功能扩展。
JDBC规范
所谓规范,就是我定义了标准接口,并进行了如下抽象:Connection代表与数据库之间的联系。Statement执行SQL,用ResultSet表示SQL返回的结果为数据提供了方便。从…Connection可以创建Statement,Statement执行查询以获取。ResultSet。
上面说的Connection、Statement、ResultSet所有这些都应该是接口,具体实现由每个数据库提供程序提供。有了该规范,您可以通过一个统一的界面访问多种类型的数据库,并可以随意切换数据库。
数据库驱动
如上所述,接口的实现是由每个供应商提供的,因此实现类的类名将不会是统一的,将被创建。Connection对象,代码会写一个死的实现类,切换数据库,需要修改代码,这不是很好。为了解决这个问题,抽象的Driver驱动的概念。
Connection con=MySqlConnectionImpl("127.0.0.1",3306,"mi_user",userName,pwd);
复制代码
每个数据库都需要实施Driver接口,Driver数据库连接可用。Connection,通过反射机制动态创建。
Class.forName("com.mysql.jdbc.Drier");
复制代码
同一个程序可以通过访问不同的数据库。DriverManager为了管理驱动器,Driver在初始化时,您需要注册。DriverManager中。
DriverManager提供了一种getConnection方法,用于构建数据库。Connection:
Connection con=DriverManager.getConnection("127.0.0.1",3306,"mi_user",userName,pwd);
复制代码
如果有多个数据库驱动程序,DriverManager如何区分它,需要在数据库中连接url在中指定,如mysql需要添加jdbc:mysql前缀:
String url= "jdbc:mysql://127.0.0.1:3306/mi_user";
Connection con=DriverManager.getConnection(url,userName,pwd)
复制代码
数据源
数据源DataSource包括连接池和连接池管理。2部件,通常称为连接池。在系统初始化期间,数据库连接作为对象存储在内存中,当需要访问数据库时,将从连接池中删除已建立的空闲连接对象。
使用数据源,获取其DataSource对象,通过该对象动态获取数据库连接。此外,DataSource对象可以注册到名称服务。(JNDI)可以通过名称服务获取。DataSource对象,则不需要硬编码驱动器。
DriverManager是JDBC1提供的,DataSource是JDBC2新功能提供了连接数据源的更好方式。
对比Hibernate和MyBatis
通过上面的介绍,传统的JDBC编程给我们提供了连接到数据库的能力,但它的工作量相对较大,先连接,然后处理。JDBC基础事务处理数据类型,但也捕获可能发生的异常并正确关闭资源。
在实践中,它很少被使用。JDBC编程,建议的ORM模型,主要针对数据库数据和POJO对象的相互映射。
Hibernate和Mybatis都是ORM模型,Hibernate提供了一种全表映射的模型、对JDBC封装度比较高。但Hibernate也有很多不足之处,列举如下:
- 全表映射带来的不便,如更新时发送所有字段;
- 不可能根据不同的条件进行不同的组装。SQL;
- 用于多表关联和复杂SQL查询支持能力差,需要自己编写。SQL,回来后,需要自己组装数据。POJO;
- 不能有效地支持存储过程;
- 虽然有HQL,但性能不佳,大型互联网系统往往需要优化。SQL,而Hibernate做不到。
在大型互联网环境中,灵活、SQL优化,减少数据传输是最基本的优化方法,Hibernate无法满足要求,而MyBatis它为您提供了一种灵活方便的方式。它是一个半自动映射的框架。
MyBatis需要手动匹配才能提供POJO、SQL和映射关系,而整个表映射Hibernate只需提供POJO以及映射关系。
MyBatis可以配置动态SQL,可以解决Hibernate表名因时间而异。不同的条件说明不同的问题。可以进行优化SQL,由配置决定SQL映射规则还可以支持存储过程,对于一些复杂和需要优化性能的。SQL查询起来更加方便。
核心组件
核心组件包括以下内容:
- SqlSessionFactoryBuilder:基于配置信息或代码生成。SqlSessionFactory;
- SqlSessionFactory:依靠工厂生产SqlSession;
- SqlSession:是一个可以发送的。SQL要执行并返回结果,还可以获取。Mapper的接口;
- SQL Mapper:是MyBatis新设计的组件,由Java接口和XML文件组成,相应的SQL和映射规则。它负责发送SQL执行并返回结果。
构建SqlSessionFactory
每个MyBatis应用程序基于SqlSessionFactory的实例是中心,其任务是创建。SqlSession。SqlSesion类似于JDBC的Connection对象。
提供了2创造的方法SqlSessionFactory:一种是XML配置的一种方法是编码,推荐使用。XML如何配置。
定义mybatis-config.xml这些文件如下:
xml version="1.0" encoding="UTF-8"?>
创建SqlSession
SqlSession是一个接口类,角色的扮演者门面,真正的工作是Executor界面。它需要保证每次用完时都能正常关闭。
SqlSession sqlSession=null;
try{
sqlSession=sqlSessionFactory.openSession();
//some code
sqlSession.commit();
} catch(Exception ex){
sqlSession.roolback();
} finally{
if(sqlSession!=null){
sqlSession.close();
}
}
复制代码
映射器
测图仪已制作完成Java接口和XML文件(或注释)组合在一起,功能如下:
- 定义参数类型
- 描述缓存
- 描述SQL语句
- 定义查询结果和POJO映射关系
第一,定义Java接口:
public interface RoleMapper{
public Role getRole(Long id);
}
复制代码
然后,定义映射XML文件,RoleMapper.xml
xml version="1.0" encoding="UTF-8"?>
复制代码
POJO对象Role定义比较简单,不会列出来。#{id}为这条SQL的参数,SQL列别名和POJO该语句的属性名称是一致的,并且该语句的查询结果自动映射到Role属性,这是自动映射。
执行查询
RoleMapper roleMapper=sqlSession.getMapper(RoleMapper.class);
Role role=roleMapper.getRole(1L);
String roleName=role.getRoleName();
复制代码
组件生命周期
SqlSessionFactory在MyBatis在应用程序的整个生命周期中,每个数据库只对应一个数据库。SqlSessionFactory,您可以实现一个工具类来在单例模式下获取对象。
SqlSession在请求数据库处理事务的过程中,它是一个线程不安全的对象,尤其是在多线程时。它在一个应用程序的请求和操作中幸存下来,并可以执行多个SQL,以确保交易的一致性。
Mapper该角色是发送SQL,然后返回所需的结果,或执行。SQL修改数据库的数据,因此它应该在一个数据库中。SqlSession在交易方法中,JDBC中一条SQL语句的执行、其最大范围和SqlSession都是一样的。
这本书的总体结构
本书分为3章节,这反过来又介绍了MyBatis基本应用,原理和插件开发,实际应用。
基础应用
主要介绍了如何有效地使用它。MyBatis:
- MyBatis特性
- 核心组件及其生命周期
- MyBatis配置
- 映射器
- 动态SQL
MyBatis原理
深入了解来源MyBatis内部工作原理和插件开发方法和技术:
- 介绍MyBatis将理解解析和运行的原理。SqlSession施工方法,以及四大对象如何工作。
- 介绍MyBatis的插件
实战应用
主要讲解MyBatis以下是一些实际场景:
- 介绍MyBatis-Spring,解释如何进入。Spring项目中的集成MyBatis应用
- 介绍MyBatis实际场景,选择一些典型场景,分析每个场景下开发者需要避免的一些错误和性能损失。
下一篇文章将介绍MyBatis相关配置,更好的配置MyBatis适用于不同的业务场景,以及为我们提供的扩展。
作者:Love Said
链接:https://juejin.im/post/5ab7bd11f265da23906bfbc5
来源:掘金
版权归作者所有。请联系作者以获得商业转载的授权,并注明非商业转载的来源。
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除