太快了,以前都还是Hibernate的,轻量级Mybatis就后来居上了。
想想以前觉得用JDBC连接数据库的时候,还是觉得很方便。
- 使用JDBC编程需要连接数据库,注册驱动和数据库信息
- 操作Connection,打开Statement对象
- 通过Statement执行SQL,返回结果到Result对象
- 使用Result读取数据,然后通过代码转化为具体的POJO对象
- 关闭数据库相关资源
传统的JDBC连接数据库的弊端
* 工作量大,只适合练手的小Demo
* 巴拉巴拉还很多
ORM模型
ORM是指数据库的表和简单java对象的映射关系模型,解决数据库数据和POJO对象的相互映射
如:
java程序–映射配置–数据库(都是双向的)
Mybatis是一个半自动映射框架(需要手工匹配POJO、SQL映射关系)
Mybatis所需要的映射文件
- SQL
- 映射关系
- POJO
Mybatis的核心组件
- SqlSessionFactoryBuilder(构造器):他会根据配置信息或者代码来生成SqlSessionFactory(工程接口)
- SqlSessionFactory:依靠工厂来生成SqlSession(会话)
- Session:是一个既可以发送SQL去执行并返回结果,也可以获取Mapper的接口
- SQL Mapper:它是Mybatis新设计的组件,它是由一个java接口和XML文件(或注解)构成的。需要给出对应的SQL和映射规则,
它负责发送SQL去执行,并返回结果
每个Mybatis的应用都是以SqlSessionFactory的实例为中心的,SqlSessionFactory的实例可以通过SqlSessionFactoryBuilder获得。但是要注意的是SqlSessionFactory是一个工厂接口而不是实现类,它是创建SqlSession。SqlSession类似于一个JDBC的Connection对象
配置
<configuration> <!--配置-->
<properties/> <!--属性-->
<setting/> <!--设置-->
<typeAliases/> <!--类型命名-->
<typeHandlers/> <!--类型处理器-->
<objectFactory/> <!--对象工厂-->
<plugins/> <!--插件-->
<environments> <!--配置环境-->
<environment> <!--环境变量-->
<transactionManager/> <!--事物管理器-->
<dataSource/> <!--数据源-->
</environment>
</environments>
<databaseIdProvider/> <!--数据库厂商标识-->
<mapper/> <!--映射器-->
</configuration>
property元素
perperty是一个配置属性的元素
Mybatis提供了3中配置方式
- property子元素
- properties配置文件
- 程序参数传递
第一种
<properties>
<property name = "driver" vaules="com.mysql.jdbc.Driver"/>
<property name="url" vaules="jdbc:mysql://localhost:3306/mybatis"/>
<property name = "username" vaules="root"/>
<property name = "password" vaules="123456"/>
</properties>
第二种
新建一个jdbc.properties文件
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis
username=root
password=123456
把这个文件放在资源包中,这样引入就可以了
<properties resource="jdbc.properties"/>
第三种
系统是有运维人员去配置的(让我想到了产品上线的时候排队等待的时候),为了安全,可能会对配置文件中的数据库用户和密码进行加密。(吧啦吧啦,有点不想写长串的代码了,等实际用的时候再写吧,或者有网友看到有需求的时候写)
简单来说就是读入配置文件流,读入属性,解密为明文,这些IO流知识点
优先级
这三种配置方式可能会同时出现,并且属性还有重复配置
Mybatis将按照以下的顺序来加载
- 在properties元素体内指定的属性首先被读取
- 根据proper元素中的resource属性读取类路径下属性文件,或者根据url属性指定的路径来读属性文件,并覆盖已读取的同名属性
- 读取作为方法参数传递的属性,并覆盖已读取的同名属性
注意:所以一般来讲
- 不要使用混合的方式,这样会使得管理混乱
- 首选的方式使用properties文件
设置(待解决,还没去研究,先放一段时间吧)
比如类似于这种 cacheEnabled,lazyLoadingEnabled等参数的设置
别名
当遇到的类全限定名过长,就用一个简短的名称去指代它,而这个名称可以在Mybatis上下文中使用,注意,在Mybatis中别名是不分大小写的,一个typeAliases的实例是在解析配置文件时生成的。然后长期保存在Configuration对象中,当使用的时候就拿出来,这样就没必要运行的时候再次生成它的实例了
别名 | 映射的类型 | 支持数组 |
---|---|---|
_byte | byte | 是 |
_long | long | 是 |
_short | short | 是 |
_int | int | 是 |
_integer | integer | 是 |
_double | double | 是 |
_float | float | 是 |
_boolean | boolean | 是 |
string | string | 否 |
byte | Byte | 是 |
long | Long | 是 |
short | Short | 是 |
int | Integer | 是 |
integer | Integer | 是 |
double | Double | 是 |
date | Date | 是 |
………………………
自定义别名
<typeAliases>
<typeAlias alias="role" type="com.lyz.po.Role">
</typeAliases>
所以这样我们就可以用“role”来代替其全路径,减少配置的复杂度
如果POJO过多的时候,配置也是比较多的,因此这样的话会大大增加工作量,所以Mybatis很良心,允许我们通过扫描的形式来定义别名
<typeAliases>
<package name="com.lyz.chapter1.po"/>
<package name="com.lyz.chapter2.po"/>
</typeAliases>
伪代码
@Alisa(“role”)
public class Role(){
// some code
}
typeHandler类型处理器
Mybatis系统内部定义了一系列的typeHandler,这些代码在org.apache.ibatis.type.TypeHandlerRegister
public TypeHandlerRegistry()
持续更新中 2017年12月2日17:02:57