概念
定义:
MyBatis是一款优秀的持久层框架,支持自定义SQL、存储过程以及高级映射。
作用:
替代JDBC代码以及设置参数和获取结果集的工作。
功能:
通过简单的XML或注解来配置和映射原始类型、接口和Java POJO为数据库中的记录,从而替代JDBC的的步骤,使用xml或者注解配置实现java类和数据库中表进行映射。
优点
- jdbc在代码中使用" "字符串编写sql。在此处使用配置文件方式编写,解决了硬编码问题。
- 解决JDBC中数据库连接硬编码问题;在此处使用xml配置文件方式进行处理。
- 解决了查询结果封装问题。
- 更方便传参。
XML
概念:
xml是可扩展标记语言,标准通用标记语言的子集,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。
功能:
为配置文件所服务
约束:
- scheam约束。以.xsd为结尾的;(spring)
- dtd约束。以.dtd为结尾的;(MyBatis)
运行原理:
- mybatis中使用一个全局配置文件和多个映射文件组成;
- 创建SqlSessionFactoryBuilder对象,使用其中的build方法去加载配置文件,生成SqlSessionFactory对象。
- SqlSessionFactory对象使用openSession方法返回sqlsession对象;
- SqlSession本身是不能像statement连接数据库表的,sqlsession是一个接口,里面提供了操作数据库的方法;
- sqlsession里面包含了几种执行器,通过使用mapperstatement对象,去执行sql,并返回结果。
- 输入参数类型:可以是简单数据类型;自定义数据类型、集合数据类型;
- 输出结果:可以是简单数据类型、自定义数据类型、集合类型。
封装工具类
SqlSessionFactoryBuilder:
可以被实例化、使用和丢弃,一旦创建了SqlSessionFactory,就不再需要它了。因此SqlSessionFactoryBuilder实例的最佳作用域是方法作用域(也就是局部方法变量)
SqlSessionFactory:
SqlSessionFactory一但被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或者重新创建另一个实例。使用SqlSessionFactory的最佳实践是在应用运行期间不要重复创建多次,多次重建SqlSessionFactory被视为一种代码坏习惯。
SqlSession
每个线程都应该有自己的SqlSession实例。SqlSession的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。绝对不能将SqlSession实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。
代码创建举例:
package cn.ry.utils;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
//工具类中的方法推荐使用静态方法: 静态方法调用的时候:类名.方法名();
//一般来说public 修饰的;
public class SqlSessionUtil {
//
private static SqlSessionFactory factory=null;
static {
//加载配置文件:
//使用到的是sqlSessionfactorybuilder;
SqlSessionFactoryBuilder build = new SqlSessionFactoryBuilder();
//org.apache.ibatis.io.Resources;
InputStream rs=null;
try {
rs = Resources.getResourceAsStream("configer.xml");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//使用构建者模式读取配置文件中内容:
factory = build.build(rs);
}
public static SqlSession getSqlSession() {
//使用工厂模式,获取SqlSession:
//此处需要添加参数true;默认值是false表示手动提交;true表示自动提交;
SqlSession session = factory.openSession(true);
return session;
}
}
代理模式*
代理模式的要求:
- 要求mapper接口和映射文件xml同包同名;
- 映射文件中的namespace和接口的全限定类名保持一致;
- 映射文件中的sqlID和接口中的方法名保持一致;(接口中的方法可以少于映射文件中sqlID);
- 接口中的方法返回值类型(泛型或者集合)必须和映射文件中的resultType或者resultMap中的type属性值保持一致。
- 接口中的方法的形参最多只能有一个,除非使用@Param参数注解以外(如果形参加了该参数注解,则所有加了该注解的形参会被放置在一个map中进行映射)。
今天先总结到这里,下次再继续总结吧。博主创作不易,点个关注不迷路,谢谢大家。