一、mybatis介绍
- 半自动化的ORM实现
- DAO层
- 动态SQL
- 小巧灵活、简单易学
二、持久化与ORM
1.持久化
- 持久化是程序数据在瞬时状态和持久状态间转换的过程
2.ORM
ORM(Object Relational Mapping)
- 编写程序的时候,以面向对象的方式处理数据
- 保存数据的时候,却以关系型数据库的方式存储
ORM解决方案包含下面四个部分
- 在持久化对象上执行基本的增、删、改、查操作
- 对持久化对象提供一种查询语言或者API
- 对象关系映射工具
- 提供与事务对象交互、执行检查、延迟加载以及其他优化功能
三、MyBatis简介
MyBatis前身是iBatis,本是Apache的一个开源的项目
官方网站
- http://mybatis.org
ORM框架
实体类和SQL语句之间建立映射关系
特点
- 基于SQL语法,简单易学
- 能了解底层封装过程
- SQL语句封装在配置文件中,便于统一管理与维护,降低程序的耦合度
- 方便程序代码调试
四、搭建MyBatis开发环境
五、与JDBC直观对比
1.MyBatis将代码分解包装
六、MyBatis框架优缺点
七、MyBatis基本要素
八、核心接口和类的结构
1.核心对象
1)SqlSessionFactoryBuilder
- 用过即丢,其生命周期只存在于方法体内
- 可重用其来创建多个 SqlSessionFactory 实例
- 负责构建SqlSessionFactory,并提供多个build方法的重载
build(InputStream inputStream, String environment, Properties properties)
build(Reader reader, String environment, Properties properties)
build(Configuration config)
配置信息以三种形式提供给SqlSessionFactory的build方法:
InputStream(字节流)、Reader(字符流)、Configuration(类)
读取XML文件构造方式:
String resource = "mybatis-config.xml";
InputStream is = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
2)SqlSessionFactory
3)SqlSession
2.编写工具类-MyBatisUtil.java
package cn.gwj.util;
/*
Created by IntelliJ IDEA.
Package:cn.gwj.util
User:1093499975@qq.com
Date:2019/7/6 0006
Time:16:56
*/
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class MyBatisUtil {
private static SqlSessionFactory factory;
static{//在静态代码块下,factory只会被创建一次
System.out.println("static factory===============");
try {
//加载mybatis的配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//通过sqlSession工厂创建者build出一个数据库会话工程
factory = new SqlSessionFactoryBuilder().build(is);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static SqlSession createSqlSession(){
//打开一个数据库会话
return factory.openSession(false);//true 为自动提交事务
}
public static void closeSqlSession(SqlSession sqlSession){
if(null != sqlSession)
sqlSession.close();
}
}
九、系统核心配置文件
1.mybatis-config.xml 系统核心配置文件
2.配置properties元素
配置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="123"/> </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>
若两种方式同时都用了,那么哪种方式优先?
<properties resource="database.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="123"/> </properties>
- 结论:resource属性值的优先级高于property子节点配置的值
3.settings元素
- 用来修改MyBatis运行时的行为方式
- 主要是MyBatis的一些全局配置属性的设置
设置项 | 描述 | 允许值 | 默认值 |
cacheEnabled | 对在此配置文件下的所有cache 进行全局性开/关设置 | true | false | true |
lazyLoadingEnabled | 全局性设置懒加载。如果设为‘false’,则所有相关联的都会被初始化加载 | true | false | true |
autoMappingBehavior | MyBatis对于resultMap自动映射匹配级别 | NONE | PARTIAL | FULL | PARTIAL |
……(9个) | ...... | ...... | ...... |
4.typeAliases元素
- 类型别名
- 仅仅只关联XML配置,简写冗长的Java类名
5.environments元素
<!--默认的运行环境 ID-->
<environments default="development">
<!--运行环境 ID-->
<environment id="development">
<!--事务管理器配置-->
<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>
<!--运行环境 ID-->
<environment id="test">
……
</environment>
</environments>
- transactionManager-事务管理器
- dataSource
6.mappers元素
7.配置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">
<!--通过这个配置文件完成mybatis与数据库的连接-->
<configuration>
<!--引入mysql.properties文件-->
<properties resource="mysql.properties"/>
<!-- <properties>-->
<!-- <property name="driver" value="com.mysql.cj.jdbc.Driver"/>-->
<!-- <property name="url" value="jdbc:mysql:///smbms?useUnicode=true&charcaterEncoding=utf-8&serverTimezone=UTC"/>-->
<!-- <property name="user" value="root"/>-->
<!-- <property name="password" value="123"/>-->
<!-- </properties>-->
<!--配置mybatis的log实现为LOG4J-->
<settings>
<setting name="logImpl" value="LOG4J"/>
<!--关闭延迟加载-->
<setting name="lazyLoadingEnabled" value="false"/>
<!--禁止自动匹配,默认自动匹配,但是实体属性名和数据库字段名一致,resultType无效-->
<setting name="autoMappingBehavior" value="NONE"/>
</settings>
<!--指定别名-->
<typeAliases>
<package name="cn.gwj.entity" />
<!--<typeAlias type="cn.gwj.entity.User" alias="User"/>-->
<package name="cn.gwj.dao" />
</typeAliases>
<!--配置数据库连接-->
<environments default="mysql">
<environment id="mysql">
<!--配置事务管理,采用JDBC事务管理-->
<transactionManager type="JDBC"></transactionManager>
<!--POOLED:mybatis自带的数据源,JNDI:基于Tomcat的数据源-->
<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>
</environments>
<!--将mapper文件加入到配置文件中-->
<mappers>
<mapper resource="cn/gwj/dao/UserDao.xml"></mapper>
</mappers>
</configuration>