MyBatis 核心配置回顾和拓展
20190610 田超凡
知网用户_进击的猿宝宝(田超凡)版权所有,转载注明原作者
1. 数据持久化
(1).数据持久化指的是将不同规则、不同规模、不同介质类型的数据永久进行物理存储的过程,强调的是存取的过程。
(2).数据持久化在程序中主要的两个应用场景:文件系统和数据库系统。文件系统主要是指在电脑磁盘中物理存储各种类型形形色色的各类文件,只要硬盘没有发生故障或者采取了备份机制,这些文件中的数据就可以永久保存下来,实现持久保存。
再来说说数据库系统。数据库是软件工程中一个非常重要的概念。顾名思义,数据库,就是指把数据存储在电脑的“仓库”中,而这些“仓库”实际上也是以各类文件的形式存储在硬盘中的。你可能会问,既然都是文件,那为什么不统一都用文件系统存储呢?因为随着信息化时代的高速发展,各行各业对软件的需求量都在日趋增大。人们常说,术业有专攻,不同行业的人群对数据的存储和处理需求也是参差不齐的,如何定义一个通用的数据聚集地,来兼容不同类型、不同格式、不同大小的数据,并通过统一的访问和操作方式来和数据进行交互呢?答案就是数据库系统。当今软件系统已经将各类数据库作为不可或缺的一部分来存储数据并对数据进行各种处理,比如格式化展示、自定义存储方式和存储类型、批量访问和操作等等……也正是因为形形色色的数据处理需求,才诞生了各类形形色色的关系型、非关系型、分布式数据库,也诞生了各类形形色色的数据库模式对象,比如事务、视图、索引、触发器、存储过程等等;同时,为了实现对各类数据库、各类数据实现统一的访问和操作方式,从SQL标准,到SQL语言,到T-SQL/PL-SQL这类SQL扩展…总之,这些都是对数据持久化和数据处理的一种展现和扩充形式,充分体现了数据持久化这一重要概念在软件系统和生命周期中的重要性。甚至可以说,如果软件系统丧失了数据持久性这个核心特性,那么这个软件系统永远就是一个半成品,没有灵魂。
总之,数据持久化是一个成熟的软件系统不能缺少的一部分。
2.MyBatis的前身今世——JDBC和ORM
(1).MyBatis的祖先-SQL和JDBC
前面说到了数据持久化这一重要的数据操作概念,同时也说到了在各类形形色色的数据库系统中,需要定义一个通用的规范作为统一的数据访问和操作方式,结构化查询语言SQL应运而生,全程Struct Query Language。随着近年来各种关系型数据库的增多,如SQL SERVER、MySQL、Oracle等等,SQL语言也在数据访问和操作方面定义了一系列规范,衍生出了DML数据操作语言,DDL数据定义语言,DQL数据查询语言,DCL(PL/SQL中的TCL)数据控制语言这四大类作为SQL语言的四大核心组成部分。DML数据操作语言主要是针对数据的CRUD操作(增删改查),DDL数据定义语言则主要针对各类数据库模式对象(如表、视图、索引等)的结构进行操作,DQL数据查询语言主要是定义了一系列支持子查询和关联、分组、聚合、模糊等等查询方式并携带自定义条件来快速高效检索数据。DCL(TCL)语言主要是针对多个批量操作数据的语句进行事务管理,确保事务ACID特性(原子性、一致性、隔离性、持久性)。随着SQL语言的快速发展,SQL SERVER数据库的T-SQL、Oracle数据库的PL/SQL语言都对SQL语言进行了扩展并逐渐完善,使得SQL语言的作用范围更广,也增强了数据访问和数据操作的工作效率,为数据持久化访问和操作机制做出了极大的贡献。
随着SQL语言的火热,Java操作数据库的概念也逐步浮出水面,第一代Java数据库连接技术JDBC应运而生。
JDBC全称是JavaDataBase Connectivity,即Java数据库连接技术。JDBC对于不同类型的关系型数据库定义了一种规范,使用通用的访问接口来对各类关系型数据库的数据访问和操作提供了便利,只需在Java程序中引入需要操作的对应类型数据库的JDBC整合jar包,即可调用JDBC通用的接口来加载数据库驱动、建立连接、执行CRUD操作、关闭和释放连接,甚至可以操作存储过程和触发器等数据库模式对象。JDBC跟Java在数据持久化操作上简直就是天河之作,但是由于对SQL语句的写法和参数注入方式封装的不佳,导致近年来业务数据增大,各类形形色色的数据结构雨后春笋般产生,人们也越来越关注软件系统的安全性和易用性,以及访问和操作系统的性能问题。JDBC在SQL语句和参数入参时,使用的是字符串拼接的形式,存在SQL注入的风险。SQL注入指的是应用程序的开发人员对数据库数据产生了未曾预料的访问和操作方式,比如输入一些SQL条件语句就可以轻松通过校验关卡,登陆后潜入系统,带来了极大的数据危险性,也对数据库数据的完整性造成了及其恶劣的影响。
(2).MyBatis的今世-ORM
随着JDBC在访问和操作大规模数据或作用于较为复杂的数据抽取业务场景时安全性、稳定性的瓶颈,人们对于数据持久化的方式产生了反思,由于Java是一门面向对象编程的语言,那么有没有一种什么方式,能够自动基于类和属性,对数据库的表和字段进行匹配和对应,这样我们在编写代码操作业务对象的时候就可以轻松实现数据持久化访问和操作呢?答案是肯定的,那就是ORM,全程Object Relation Mapping,即对象关系映射。
随着ORM这一重大发现,数据持久化和ORM之间的关系更加紧密,并针对JavaWeb程序中或三层架构(持久层、业务逻辑层、视图层)中的数据持久化这一重要操作步骤进行了封装,新一代轻量级数据持久层框架——MyBatis应运而生(第一代是IBatis框架,后发展迅速改名为MyBatis)。
(3).MyBatis的优缺点
3.1优点:
与传统JDBC相比,代码量至少减少了一半。
MyBatis是基于SQL的持久层框架,只要由SQL语言基础和Java基础,很容易上手。
MyBatis相当灵活, SQL写在XML配置文件中,和代码彻底分离,最大限度降低耦合度,可以统一优化和管理,也方便重用。
MyBatis针对不同的数据操作方式,提供了大量的动态SQL元素,针对ORM映射也提供了映射标签来轻松实现对象属性和数据库表字段的ORM对象关系映射。
3.2缺点:
MyBatis对SQL语句依赖很强,对开发人员的SQL功底有一定要求。
MyBatis依赖数据库,导致数据库移植性差,不能随意更换数据库。
3.MyBatis核心对象
SqlSessionFactoryBuilder会话工厂构造器
提供了一系列build()重载,可以通过不同方式构造会话工厂。生命周期和作用域:一旦创建了SqlSessionFactory会话工厂之后,这个类就没有必要存在了,用完即丢,因此最好的作用域是局部变量。
SqlSessionFactory会话工厂
创建SqlSession会话实例的工厂,是MyBatis框架的中心。
生命周期和作用域:SqlSessionFactory一旦创建,就会在整个应用运行过程中始终存在,没有理由去销毁或者再次创建,因此一般使用单例模式的方式创建,最佳作用域是Application。
SqlSession 会话
具体用来执行不同的数据持久化操作的对象,类似于JDBC的Connection,提供了面向数据库执行SQL所需的所有方法,甚至也可以通过SqlSessuion会话直接运行MyBatis映射文件中已定义的SQL语句。
生命周期和作用域:SqlSession会话对应一次和数据库的会话,由于数据库会话不是永久的,所以SqlSession生命周期也不是永久的,因此每次访问数据库时都需要重新创建SqlSession实例,但是一个SqlSession实例在销毁之前可以执行任意多次SQL语句。需要注意的是,在多线程并发环境下,一个线程都应该对应一个SqlSession会话实例,SqlSession会话实例不能共享,也不是线程安全的。也就是说,SqlSession的最佳作用域是request作用域或者方法体作用域,以局部变量形式存在。
4.MyBatis核心配置文件(mybatis-config.xml)
mybatis-config.xml核心配置文件配置项配置顺序
db.properties数据源配置文件
##MySQL连接字符串#驱动mysql.driver=com.mysql.jdbc.Driver#地址mysql.url=jdbc:mysql://127.0.0.1:3306/nfmall?useUnicode=true&characterEncoding=UTF-8#用户名mysql.username=root#密码[email protected]
mybatis-config.xml核心配置文件
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration> <!--导入db.properties文件中的所有key-value数据--> <properties resource="db.properties"> <!--定义一个名称为driver,值为com.mysql.jdbc.Driver的属性--> <property name="driver" value="com.mysql.jdbc.Driver"></property> </properties> <!--环境配置,default为默认选择的环境--> <environments default="work"> <!--开发--> <environment id="development"> <!--事务管理--> <transactionManager type="JDBC"/> <!--连接池--> <dataSource type="POOLED"> <!--引用属性${mysql.driver}--> <property name="driver" value="${mysql.driver}"/> <property name="url" value="${mysql.url}"/> <property name="username" value="${mysql.username}"/> <property name="password" value="${mysql.password}"/> </dataSource> </environment> <!--运行--> <environment id="work"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="jdbc:mysql://127.0.0.1:3306/nfmall?useUnicode=true&characterEncoding=UTF-8"/> <property name="username" value="root"/> <property name="password" value="[email protected]"/> </dataSource> </environment> </environments> <mappers> <!--<mapper resource="mapper/studentMapper.xml"/>--> <mapper class="com.zhangguo.mybatis02.dao.StudentMapper"></mapper> </mappers></configuration>
settings全局参数配置
mybatis框架运行时可以调整一些运行参数。比如,开启二级缓存,开启延迟加载等等。全局参数会影响mybatis的运行行为。
<setting name="cacheEnabled" value="true"/> <setting name="lazyLoadingEnabled" value="true"/> <setting name="multipleResultSetsEnabled" value="true"/> <setting name="useColumnLabel" value="true"/> <setting name="useGeneratedKeys" value="false"/> <setting name="autoMappingBehavior" value="PARTIAL"/> <setting name="defaultExecutorType" value="SIMPLE"/> <setting name="defaultStatementTimeout" value="25"/> <setting name="safeRowBoundsEnabled" value="false"/> <setting name="mapUnderscoreToCamelCase" value="false"/> <setting name="localCacheScope" value="SESSION"/> <setting name="jdbcTypeForNull" value="OTHER"/><setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/><!--设置是否允许缓存--> <setting name="cacheEnabled" value="true"/> <!--设置日志输出的目标--> <setting name="logImpl" value="STDOUT_LOGGING"/></settings>
typeAliases指定别名
<!--别名--> <typeAliases> <!--定义单个别名,指定名称为student,对应的类型为com.tcf.mybatis02.entities.Student--> <typeAlias type="com.tcf.mybatis02.entities.Student" alias="student"></typeAlias> <!—TODO TCF 扫描基准包下的类,默认以扫描到的类名驼峰命名规则作为类型别名 --><package name="com.tcf.mybatis02.entities"></package> </typeAliases>
附:mybatis映射文件常用类型别名
|
_byte |
byte |
|
_long |
long |
|
_short |
short |
|
_int |
int |
|
_integer |
int |
|
_double |
double |
|
_float |
float |
|
_boolean |
boolean |
|
string |
String |
|
byte |
Byte |
|
long |
Long |
|
short |
Short |
|
int |
Integer |
|
integer |
Integer |
|
double |
Double |
|
float |
Float |
|
boolean |
Boolean |
|
date |
Date |
|
decimal |
BigDecimal |
|
bigdecimal |
BigDecimal |
参考文献:
CSDN 《MyBatis核心配置详解》
CSDN 《mybatis原理》
博客园《数据持久化和ORM》
开源中国《MyBatis全局配置和缓存机制》