MyBatis框架
hibernate和MyBatis都是半自动框架
一些简单名词的认识:
SSH:Struts2【拦截器】、spring【粘合剂】、hibernate【dao层】
SSM:springMVC、spring、myBatis
Struts2:MVC设计模式的实现【拦截器、可变和可重用的标签】
hibernate:ORM,简化数据库操作、DAO层
Spring:依赖注入容器 / AOP实现【声明式事务、简化Java EE应用、黏合剂,将大家组装到一起】
Spring MVC:结构最清晰的MVC Model2实现【高度可配置,支持多种视图技术、定制化开发】
MyBatis:半自动化的ORM实现、DAO层、动态SQL【sql中可写循环】
持久化与ORM:
持久化是程序数据在瞬时状态和持久状态间转换的过程
- 持久化:将数据存入的硬盘,通俗点就是存到数据的数据是持久化状态【毕设答辩会问哦~】
- 顺序化:内存里的数据,存入一个对象,new一个String,通过jdbc存入数据库,这是顺序状态。
- ORM==【Object Relational Mapping】对象关系映射:对象是java的对象,映射即绑定。【实体类对象和数据库】
MyBatis简介:
-
MyBatis前身是iBatis(版本升级改名了),本是Apache的一个开源的项目
-
官方网站:http://mybatis.org
-
ORM框架
-
实体类和SQL语句之间建立映射关系
-
特点:
- 基于SQL语法(sql都得自己写),简单易学
- 能了解底层封装过程
- SQL语句封装在配置文件中,便于统一管理与维护,降低程序的耦合度
- 方便程序代码调试
与JDBC的比较:
创建模块,导入坐标
编写MyBatis核心配置文件–>替换连接信息解决硬编码问题
编写SQL映射文件–>统一管理sql语句,解决硬编码问题
搭建MyBatis开发环境
▶步骤:
- 下载jar包导入
- 编写MyBatis核心配置文件(mybatis-config.xml)
- 创建实体类POJO
- DAO层接口—sql映射文件(xxx.xml)
- 创建测试类:
- 读取核心配置文件
- 创建SqlSessionFactory对象,读取配置文件
- 创建SqlSession对象
- 调用mapper文件进行数据操作
▶MyBatis框架的优缺点
优点:
与JDBC相比,减少了50%以上的代码量
最简单的持久化框架,小巧并简单易学
SQL代码从程序代码中彻底分离,可重用
提供XML标签,支持编写动态SQL
提供映射标签,支持对象与数据库的ORM字段映射
缺点:
SQL语句编写工作量大,对开发人员有一定要求
数据库移植性差
MyBatis专注于SQL本身,是一个足够灵活的DAO层解决方案,适用于性能要求较高或者需求多变的互联网项目
▶MyBatis基本要素:
-
MyBatis的核心对象
SqlSessionFactoryBuilder
SqlSessionFactory
SqlSession
-
mybatis-config.xml 系统核心配置文件
-
mapper.xml SQL映射文件
▶核心接口和类的结构:
SqlSessionFactoryBulider-----【build()】---->SqlSessionFactory----【openSession()】----->Sqlsession
核心对象一:SqlSessionFactoryBuilder
-
配置信息以三种形式提供给SqlSessionFactory的build方法:
InputStream (字节流)、Reader(字符流)、Configuration(类)
-
读取XML文件构造方式:
String resource = "mybatis-config.xml"; InputStream is = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
核心对象二:SqlSessionFactory
-
SqlSessionFactory是每个MyBatis应用的核心
-
作用:创建SqlSession实例
SqlSession session = sqlSessionFactory.openSession(boolean autoCommit);
boolean autoCommit:ture–关闭事务控制,默认;false–开启事务控制
-
作用域:Application
-
生命周期与应用的生命周期相同
-
单例:存在于整个应用运行时,并且同时只存在一个对象实例
核心对象三:SqlSession
- 包含了执行SQL所需的所有方法
- 对应一次数据库会话,会话结束必须关闭
- 线程级别,不能共享
SqlSession session = sqlSessionFactory.openSession();
try {
// do work
} finally {
session.close();
//关闭SqlSession非常重要,必须要明确在finall方法体中正常关闭
}
▲在SqlSession里可以执行多次SQL语句,但一旦关闭了SqlSession就需要重新创建
-
SqlSession的获取方式
String resource = "mybatis-config.xml"; InputStream is = Resources.getResourceAsStream(resource); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is) ; SqlSession sqlSession = factory.openSession();
-
SqlSession的两种使用方式:
-
通过SqlSession实例直接运行映射的SQL语句
-
基于Mapper接口方式操作数据
-
小结:
非集成环境下的最佳实践:
-
SqlSessionFactoryBuilder:
用过即丢,推荐作用域范围:方法体内
-
SqlSessionFactory:
最佳作用域范围:应用的全局作用域
生命周期与应用的生命周期相同 -
SqlSession:
线程级
一个request请求期间
系统核心配置文件
mybatis-config.xml系统核心配置文件
configuration 配置:【加粗的是重要的】
properties 可以配置在Java 属性配置文件中
settings 修改 MyBatis 在运行时的行为方式
typeAliases 为 Java 类型命名一个别名(简称)
typeHandlers 类型处理器
objectFactory 对象工厂
plugins 插件
environments 环境
environment 环境变量
transactionManager 事务管理器
dataSource 数据源
mappers 映射器
properties
- 配置properties元素的两种方式:
1.通过外部指定的方式(database.properties这个文件放的数据库连接的url账号密码等)、实现动态配置
2.直接配置为xml,实现动态配置
示例1:配置properties的resource属性
<properties resource="database.properties"/>
......
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${user}"/>
<property name="password" value="${password}"/>
</dataSource>
示例二:配置property的name和value
<properties>
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/smbms"/>
<property name="user" value="root"/>
<property name="password" value="root"/>
</properties>
......
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${user}"/>
<property name="password" value="${password}"/>
</dataSource>
结论:两种方式的优先级,resource属性值的优先级高于property子节点配置的值
settings元素
-
用来修改MyBatis运行时的行为方式
-
主要是MyBatis的一些全局配置属性的设置
设置项 | 描述 | 允许值 | 默认值 |
---|---|---|---|
cacheEnabled | 开启缓存,对在此配置文件下的所有cache 进行全局性开/关设置 | true| false | true |
lazyLoadingEnabled | 全局性设置懒加载。如果设为‘false’,则所有相关联的都会被初始化加载 | true | false | true |
autoMappingBehavior | MyBatis对于resultMap自动映射匹配级别 | NONE | PARTIAL | FULL | PARTIAL |
……(9个) | … | … | … |
settings的一个使用:
1.在控制台输出sql信息的打印- - -
<settings>
<!-- value="STDOUT_LOGGING" 配置打印SQL语句 -->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
2.如果想让它在日志里面打印- - - 将之前的log4j配置文件复制到资源中
<settings>
<!-- value="LOG4J" 日志打印SQL语句 -->
<setting name="logImpl" value="LOG4J"/>
</settings>
typeAliases元素:
- 类型别名
- 仅仅只关联XML配置,简写冗长的Java类名
示例1:
//这是给单个实体类起别名使用,alias就是用来定义别名的
<typeAliases>
<typeAlias alias="User" type="xx.xx.pojo.User"/>
</typeAliases>
示例2:
//将实体类所在的整个包定义别名,在resultType使用的别名就是实体类的名字,不分大小写
<typeAliases>
<package name="xx.xx.pojo"/>
</typeAliases>
environments元素:
-
表示配置MyBatis的多套运行环境,将SQL映射到多个不同的数据库上。
-
子元素结点:environment,但是必须指定其中一个为默认运行环境(通过default指定)
-
每个SqlSessionFactory实例只能选择一个运行环境
<environments default="development">---默认的运行环境ID <environment id="development">---运行环境ID <transactionManager type="JDBC"/>---事务管理器配置 <dataSource type="POOLED">---数据源配置 <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${user}"/> <property name="password" value="${password}"/> </dataSource> </environment> <environment id="test">---运行环境ID …… </environment> </environments>
transactionManager-事务管理器:
<transactionManager type="[ JDBC | MANAGED ]" />
JDBC 托管
dataSource:
- dataSource元素使用基本的JDBC数据源接口来配置JDBC连接对象的资源
- 有三种内建的数据源类型
<dataSource type=" [UNPOOLED | POOLED | JNDI]" />
mappers元素
-
映射器,定义SQL映射语句
-
须在配置中引用mapper映射文件
-
方式一:使用类资源路径获取资源
<!-- 将mapper映射文件加入到系统核心配置文件中 --> <mappers> <mapper resource="cn/smbms/dao/user/UserMapper.xml"/> </mappers>
-
方式二:使用URL获取资源
<mappers> <mapper url="file:///E:/sqlmappers/UserMapper.xml"/> <mapper url="file:///E:/sqlmappers/ProviderMapper.xml"/> </mappers>
配置中引用mapper映射文件
-
方式一:使用类资源路径获取资源
<!-- 将mapper映射文件加入到系统核心配置文件中 --> <mappers> <mapper resource="cn/smbms/dao/user/UserMapper.xml"/> </mappers>
-
方式二:使用URL获取资源
<mappers> <mapper url="file:///E:/sqlmappers/UserMapper.xml"/> <mapper url="file:///E:/sqlmappers/ProviderMapper.xml"/> </mappers>