MyBatis(半自动,轻量级)简介
原名iBatis,2013年迁移到gitHub,sql与Java编码分离,sql是开发人员控制
PS:对于JDBC,sql夹杂在java代码块中,耦合度高导致编码硬伤,维护不易。频繁修改
对于Hibernate:
①长难复杂sql处理不易,
②自动生产sql,不宜优化,
③基于全映射,大量字段部分映射较困难,导致数据库性能下降
MyBatis简单使用
1)、导入jar包
2)、在src下新建全局配置文件(XML文件,编写JDBC变量)
文件名:mybatis.xml
验证:此xml文件使用DTD进行验证
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
3)、新建以mapper结尾的包,在包下新建:实体类名+Mapper.xml(主要编写)
文件作用:编写需要执行的SQL语句,相当于实现类
4)、测试结果(只有在单独使用mybatis时使用)
流程:
//获取配置文件输入流
InputStream iStream = Resources.getResourceAsStream("mybatis.xml");
//工厂设计模式接收对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(iStream);
//生产SqlSession对象
SqlSession sSession = factory.openSession();
//进行增删改查
//和mapper.xml中定义的元素相对应进行操作
如:List<Goods> list = sSession.selectList("com.mfqh.virtual.selGoods(虚拟包.id)");
//关闭SqlSession对象
sSession.close();
PS:使用到了ORM,在获取到数据库数据后通过反射建立对象并通过set方法赋值,在3.2之后,反射可直接给属性强制赋值。
SqlSession的三种查询方式
1)、selectList()
返回值为List类型,适用于查询结果都要遍历的需求
2)、selectOne()
返回值为Object,适用于返回一个变量或一行数据
3)、selectMap()
返回值为Map<key,resultType>,适用于需求需要在结果中通过某个值快速取到
MyBatis运行原理
1)、涉及到的类
①Resources Mybatis中IO流工具类,加载配置文件
②SqlSesssionFactoryBuilder() 构建器,创建SqlSessionFactory接口实现类
③XMLConfigBuilder 全局配置文件内容构建器类,从流中提取配置信息解析为JAVA代码
④Configuration 配置信息类,封装全局配置的所有信息
⑤DefaultSqlSessionFactory sqlSessionFactory接口实现类
⑥Transaction 事务类,每一个SqlSession都带有一个事务对象
⑦TransactionFactory 事务工厂,负责生产Transaction对象
⑧Executor MyBatis执行器,负责执行SQL命令,相当于Statement(PreparedStatement、CallableStatement)对象
默认执行器为SimpleExcutor,批量操作为BatchExcutor(通过 openSession控制)
⑨DeafultSqlSession SqlSession实现类
⑩ExceptionFactory 错误工厂
2)、流程
①先由Resources将核心配置文件MyBatis.xml加载到流中;②SqlSesssionFactoryBuilder() 构建器会调用XMLConfigBuilder来解析流中的配置信息,并将信息存储至Configuration类中,接着建立DefaultSqlSessionFactory的对象;
③在工厂对象建立SqlSession之时,先会通过TransactionFactory产生一个Transaction对象,并且通过配置信息选择一个执行器,然后就可建立一个SqlSession对象;
④通过SqlSession进行sql操作,每个SqlSession对象相当于一个事务,可以提交或者回滚;
⑤最后关闭SqlSession对象