Mybatis
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
与Mybatis作用相同的持久层框架Hibernate。
1、灵活性和效率不如原生JDBC程序。
由于对持久层封装过于完整,导致开发人员无法对SQL进行优化,无法灵活使用JDBC的原生SQL。
Hibernate封装了JDBC,但没有原生的JDBC程序直接访问数据库效率高。要使用数据库的特定优化机制的时候,不适合用Hibernate 。
2、配置文件复杂。
框架中使用ORM原则,导致配置过于复杂,一旦遇到大型项目,比如300张表以上,配置文件和内容是非常庞大的,另外,DTO满天飞,性能和维护问题随之而来
3、不适于复杂关系的数据表维护。
如果项目中各个表中关系复杂,表之间的关系很多,在很多地方把lazy都设置false,会导致数据查询和加载很慢,尤其是级联查询的时候。
4、批量操作上的弱势。
Hibernate在批量数据处理时有弱势,对于批量的修改,删除,不适合用Hibernate,这也是ORM框架的弱点
为什么需要使用mybatis
mybatis底层封装了对JDBC的操作。每次通过JDBC对数据库进行操作时,过程繁琐,查询结果时需要频繁的类型转换,使用完JDBC时,必须进行关闭操作。
Class.forName(driver); //注册驱动
Connection conn = getConnection(); //获取连接
PreparedStatement pstmt = conn.preparedStatement(sql); //预处理sql语句
pstmt.setObject(key,value); //为sql语句赋值
ResultSet rs = pstmt.executeQuery();
while(rs.next()){
//获取值
Object value = rs.getObject(1); //获取第一个列的值
//封装到一个对象
//难点:不知道value的具体类型
}
rs.close();
pstmt.close();
conn.close();
导入maven依赖
<!--导入mybatis的依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
mybatis工作流程

SqlSessionFactory 基于mybatis-config.xml配置文件做全局配置。
根据全局配置文件得到SqlSessionFactory
final String CONFIG = "mybatis-config.xml";
try {
//得到全局配置文件的字符输入流
Reader resourceAsReader = Resources.getResourceAsReader(CONFIG);
//根据全局配置文件构建SqlSessionFactory
sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsReader);
logger.info("sqlSessionFactory构建成功");
} catch (IOException e) {
//e.printStackTrace();
logger.error("出现异常",e);
}
SqlSession
SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句
SqlSession session = sqlSessionFactory.openSession();
//...
session.close();
MyBatis 提供的所有特性都可以利用基于 XML 的映射语言来实现,这使得 MyBatis 在过去的数年间得以流行。如果你用过旧版本的 MyBatis,你应该对这个概念比较熟悉。 但相比于之前的版本,新版本改进了许多 XML 的配置,后面我们会提到这些改进。这里给出一个基于 XML 映射语句的示例,它应该可以满足上个示例中 SqlSession 的调用.
准备mapper.xml
/*
BlogMapper 等价于BlogDao,在使用mybatis后,命名都为XxxMapper
mybatis根据xml配置文件生成代理对象。该代理对象实现了BlogMapper接口中的所有方法
*/
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);