一、基本背景:
MyBatis是一个优秀的持久层框架,它对
JDBC
的操作数据库的过程进行封装。入门阶段需要结合JDBC知识,以加深理解MyBatis的工作原理和核心类库。
MyBatis的工作原理如下图所示:
(1)读取MyBatis的配置文件。mybatis-config.xml为MyBatis的全局配置文件,用于配置数据库连接信息。
(2)加载映射文件。映射文件即SQL映射文件,该文件中配置了操作数据库的SQL语句,需要在MyBatis配置文件mybatis-config.xml中加载。mybatis-config.xml 文件可以加载多个映射文件,每个文件对应数据库中的一张表。
(3)构造会话工厂。通过MyBatis的环境配置信息构建会话工厂SqlSessionFactory。
(4)创建会话对象。由会话工厂创建SqlSession对象,该对象中包含了执行SQL语句的所有方法。
(5)Executor执行器。MyBatis底层定义了一个Executor接口来操作数据库,它将根据SqlSession传递的参数动态地生成需要执行的SQL语句,同时负责查询缓存的维护。
(6)MappedStatement对象。在Executor接口的执行方法中有一个MappedStatement类型的参数,该参数是对映射信息的封装,用于存储要映射的SQL语句的id、参数等信息。
(7)输入参数映射。输入参数类型可以是Map、List等集合类型,也可以是基本数据类型和POJO类型。输入参数映射过程类似于JDBC对preparedStatement对象设置参数的过程。
(8)输出结果映射。输出结果类型可以是Map、List等集合类型,也可以是基本数据类型和POJO类型。输出结果映射过程类似于JDBC对结果集的解析过程。
JDBC
是连接数据库和Java程序的桥梁,通过JDBC API可以方便地实现对各种主流数据库的操作。
1、什么是JDBC?
Java数据库连接 Java Database Connectivity,简称JDBC,它是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC是一类接口,制定了统一访问各类关系数据库的标准接口。如果没有JDBC这个接口标准的存在,程序员面对各类数据库的操作将会变得十分复杂,并令人抓狂。
2、什么是驱动?
JDBC是接口,驱动是接口的实现类,没有驱动将无法完成数据库连接,从而不能操作数据库!每个数据库厂商都需要提供自己的驱动,用来连接自己公司的数据库,也就是说驱动一般都由数据库生成厂商提供。
驱动程序可以保证两个设备进行通信,它需要满足一定通信数据格式,数据格式由设备提供商规定,设备提供商为设备提供驱动软件,通过驱动程序可以与该设备进行通信。
3、JDBC的开发流程简介
我们需要访问数据库时,首先要加载数据库驱动,只需加载一次,然后在每次访问数据库时创建一个Connection实例,获取数据库连接,获取连接后,执行需要的SQL语句,最后完成数据库操作时释放与数据库间的连接。
- TypeHandler 接口使用jdbcType:
setParameter
方法是在将参数传入数据库之前对数据类型做处理。
public void setParameter(PreparedStatement ps, int I,
String parameter, JdbcType jdbcType)
二、数据类型映射
Microsoft JDBC Driver for SQL Server 使用 JDBC 基本数据类型将 SQL Server 数据类型转换为 Java 编程语言能够理解的格式,反之亦然。 JDBC 驱动程序支持 JDBC 4.0 API,其中包括 SQLXML 数据类型和区域 (Unicode) 数据类型,如 NCHAR 、NVARCHAR 、LONGNVARCHAR 和 NCLOB 。
下表列出了基本 SQL Server、JDBC 和 Java 编程语言数据类型之间的默认映射:
char | varchar | varchar(max) |
---|---|---|
存储预留长度固定不变 | 最大255个字符长度(预留空间在最大值范围内可变) | 设定最大max<255个字符长度(预留空间在<max范围内可变) |
其它常用类型 | 场景 |
---|---|
text | 存储文章等比较长的字符串数据 |
Decimal | 存储具有小数点且数值确定的数值(float和real保存的是近似值) |
blob | 存储图片的base64流等二进制大型对象 |
三、使用Mybatis开发的时候,不指定JdbcType类型有可能出现什么问题:
在表中插入一条数据,字段Key所对应的值为DATE
类型。
在值为Null的情况,如果未加jdbcType=DATE的情况下mybatis将这个字段置为了''空串。
会报错:
Error updating database. Cause: java.sql.SQLSyntaxErrorException: ORA-01790: 表达式必须具有与对应表达式相同的数据类型
以上问题除了指定JdbcType外,还可以用Mybatis中的if test判断数据是不是null来规避。
但是如果是下边这个需求:
在表中更新一条数据,使这条数据中的KEY对应的值为null(编辑信息)。这时候如果没有指定jdbcType,就会报错提示:无效的列类型...