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配置文件做全局配置。
<?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>
<!--配置外部的jdbc配置文件-->
<properties resource="jdbc.properties"></properties>
<settings>
<!--配置mybatis使用的日志框架-->
<setting name="logImpl" value="SLF4J"/>
</settings>
<!--配置数据源-->
<environments default="development">
<!--开发时使用的数据源-->
<environment id="development">
<transactionManager type="JDBC"/>
<!--数据库连接池-->
<dataSource type="POOLED">
<!--数据库连接字符串-->
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
</configuration>
根据全局配置文件得到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
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace对应dao/mapper包中的接口名-->
<mapper namespace="org.mybatis.example.BlogMapper">
<!--
id:对应BlogMapper接口中的selectBlog方法
resultType:查询的结果映射为Blog类型
-->
<select id="selectBlog" resultType="Blog">
select * from Blog where id = #{id}
</select>
</mapper>
在学习三层架构时,我们通过dao包中的接口定义抽象方法。通过dao.impl包中定义接口的实现类实现对数据库的CRUD操作。现在mybatis提供的代理能够解决我们手动创建实现类。我们只需要关注接口中有什么抽象方法;方法中实现的CRUD的sql语句是什么就能够实现。
/*标签:JDBC,MyBatis,配置文件,mybatis,SqlSession,SQL,Mybatis From: https://www.cnblogs.com/huang2979127746/p/16843388.html
BlogMapper 等价于BlogDao,在使用mybatis后,命名都为XxxMapper
mybatis根据xml配置文件生成代理对象。该代理对象实现了BlogMapper接口中的所有方法
*/
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);