初识MyBatis
MyBatis项目创建时遇到的问题:
1.JUnit4 包找不到
选File-->project Structure 俩个列表 点左边列表的加号 选择 Java 再选到junit-4.12.jar,找不到去idea安装路径下找,idea lib junit-4.12.jar
2.运行时 找不到Logger 对象
解决方案:初始化一个Logger 对象 编写log4j.properties
import org.apache.log4j.PropertyConfigurator;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
private Logger logger=Logger.getLogger(SysUserMapperTest.class);
public static void initLog() {
FileInputStream fileInputStream = null;
try {//配置类Properties
Properties properties = new Properties();
//文件字节输入流
fileInputStream = new FileInputStream("resources/log4j.properties");
//配置类加载文件
properties.load(fileInputStream);
//读取使用Java的特性文件编写的配置文件。
PropertyConfigurator.configure(properties);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fileInputStream != null) {
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
3.The content of element type "configuration" must match (configuration报错)
properties>settings>typeAliases>typeHandlers>objectFactory>objectWrapperFactory>reflectorFactory>plugins>environments>databaseIdProvider>mappers
POJO(Plain Ordinary Java Object)简单的Java对象,实际就是普通JavaBeans
第一章 初识Mybatis框架
1.1 框架的概念及作用
框架是一种经过检验的、具有特定特定功能的半成品软件。
框架针对特定的功能需要,对基础代码进行了封装并提供相应的API。 应用程序的骨架
框架的优点
- 无须考虑开发中的公共问题、基础问题,框架已经做好了实现。
- 可以专注于项目的业务逻辑设计,提高开发效率。并且有助于提高核心业务的开发质量。
- 项目架构统一,便于沟通协作,便于修改维护。
- 框架可以帮助开发者快速的构建结构优美 运行稳定且性能优良的高质量应用。
1.1.2 主流框架技术简介
-
Mybatis框架
是一个基于ORM(Object Relational Mapping)对象关系映射 的优秀的持久化框架。 它是一种半自动ORM实现,最主要的特点是SQL映射器机制。 Mybatis框架使用XML或注解将Java中的接口和POJO(Plain Ordimary Java Object)普遍的Java对象
-
Spring 框架
开源的、轻量级的企业级应用框架。设计目标是使现有的Java EE技术更容易使用,促进开发人员养成良好的编程习惯。Spring框架主要作为依赖注入容器和AOP实现存在。集成用法 更加轻巧优雅,开发过程更快捷高效。
在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方 式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个 热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑 的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高 了开发的效率。
-
Spring MVC框架
Spring Web MVC,是基于Servlet API构建的Web框架,从一开始就包含在Spring FrameWork中,优点:结构清晰,使用灵活,具有高度的可配置性。可以方便地进行定制化开发,支持的视图技术非常全面。
-
hibernate框架
优秀的持久化框架,是一个典型的ORM解决方案,通过简单地配置和编码即可实现繁琐的JDBC代码才能实现的功能,具有出色的封装性和移植性。
-
Stucts 2 框架
基于Web的MVC框架。借鉴了WebWork的优秀设计。引入了多种特性(拦截器 值栈 OGNL表达式语言)能大大减少XML配置。
ORM的俩个 Mybatis 和 hibernate
1.2数据的持久化及ORM
1.2.1 持久化简介
持久化是程序数据在瞬时状态和持久状态间转换的过程,也可以说是将内存中的数据以某种技术保存起来,并且可以提取出来使用。
1.2.2ORM简介
ORM(Object Relational Mapping) 对象关系映射 是一种在关系型数据库和面向对象编程语言之间进行数据转换的编程技术。
- 编写程序的时候,以面向对象的方式处理数据
- 保存数据的时候,却以关系型数据库的方式存储
缺点:数据库移植性很差,需要编写大量代码。
ORM解决方案包含下面四个部分
-
在持久化对象上执行基本的增、删、改、查操作
-
对持久化对象提供一种查询语言或者****API
-
对象关系映射工具
-
提供与事务对象交互、执行检查、延迟加载以及其他优化功能
1.3 使用Mybatis框架实现数据库操作
主要思想是将SQL语句从程序代码中分离出来,配置XML文件。
好处:
一:分离JDBC代码中变化的部分
二:可以实现对SQL语句的灵活管理。直接在XML文件中修改而不影响程序代码。
1.3.1 搭建基于Mybatis框架的开发环境
- 创建项目并添加所需的jar文件。
- 编写Mybatis框架的核心配置文件。
- 创建实体类
- 创建Mapper接口
- 创建SQL映射文件
- 编写测试类
具体项目看MyBatis开发环境搭建
<?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>
<!--引入包含Mybatis框架的运行时行为-->
<properties resource="database.properties"/>
<!--1.设置Mybatis的运行时行为-->
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
<!--2.配置Mybatis框架运行环境-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<!--使用${}引用自定义的参数,此参数来自datebase.properties文件-->
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!--3.配置需要引用的SQL映射文件的位置SysUserMapper.xml-->
<mappers>
<mapper resource="cn/cvs/dao/sysUser/SysUserMapper.xml"/>
</mappers>
</configuration>
元素名称 | 元素介绍 |
---|---|
configuration | 根节点元素 |
properties | 包含数据库连接的相关参数 |
settings | 设置MyBatis框架的运行时行为 |
environments | 可以根据不同场景为MyBatis多组运行环境,须通过default属性指定一个作为当前运行环境 |
environment | 为MyBatis提供一组运行环境,其中包含事务管理器,数据源等相关配置 |
mappers | 配置SQL映射文件的位置。 |
mapper | 其resource属性指定的是基于类路径的SQL映射文件位置 |
MyBatis优缺点
优点
-
与JDBC相比,减少了50%以上的代码量
-
最简单的持久化框架,小巧并简单易学
-
SQL代码从程序代码中彻底分离,可重用
-
提供XML标签,支持编写动态SQL
-
提供映射标签,支持对象与数据库的ORM字段映射
缺点
-
SQL语句编写工作量大,对开发人员有一定要求
-
数据库移植性差
MyBatis专注于SQL本身,是一个足够灵活的DAO层解决方案,适用于性能要求较高或者需求多变的互联网项目
MyBatis框架的基本要求
-
核心接口和类(MyBatis的核心对象)
-
核心配置文件(mybatis-config.xml 系统核心配置文件)
-
SQL映射文件(mapper.xml SQL映射文件)
MyBatis的核心对象
SqlSessionFactoryBuilder
SqlSessionFactory
SqlSession
MyBatis框架的基本要素
-
核心接口和类(MyBatis的核心对象)
-
核心配置文件(mybatis-config.xml 系统核心配置文件)
-
SQL映射文件(mapper.xml SQL映射文件)
MyBatis的核心对象
SqlSessionFactoryBuilder
SqlSessionFactory
SqlSession
SqlSessionFactoryBuilder类
用过即丢,其生命周期只存在于方法体内
可重用其来创建多个 SqlSessionFactory 实例
负责构建SqlSessionFactory,并提供多个build方法的重载
读取XML文件构造方式:
String resource = "mybatis-config.xml";
InputStream is = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
配置信息以三种形式提供给SqlSessionFactory的build方法:
InputStream(字节流)、Reader(字符流)、Configuration(类)
build(InputStream inputStream, String environment, Properties properties)
build(Reader reader, String environment, Properties properties)
build(Configuration config)
SqlSessionFactory类
SqlSessionFactory是每个MyBatis应用的核心
作用:创建SqlSession实例
SqlSession session = sqlSessionFactory.openSession(boolean autoCommit);
true:关闭事务控制(默认) false:开启事务控制
作用域:Application
生命周期与应用的生命周期相同
单例
存在于整个应用运行时,并且同时只存在一个对象实例
所以适合在静态代码块中
SqlSession类
包含了执行SQL所需的所有方法
对应一次数据库会话,会话结束必须关闭
线程级别,不能共享
SqlSession session = sqlSessionFactory.openSession();
try {
// do work
} finally {//关闭SqlSession非常重要,必须要确保在finally方法体中正常关闭
session.close();
}
在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元素的两种方式
- 通过外部指定的方式(database.properties),实现动态配置
- 直接配置为xml,实现动态配置
通过外部指定的方式(database.properties),实现动态配置
配置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>
直接配置为xml,实现动态配置
直接配置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子节点配置的值,也就说配置文件的优先级高。xml的元素顺序不可逆。
映射器,定义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>