MyBatis的简单理解
一、什么是Mybatis
这里借用官网的一句话介绍什么是mybatis:MyBatis 是一个可以自定义 SQL、存储过程和高级映射的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
二、MyBatis的工作原理
图 2 MyBatis 框架的执行流程图
1)读取 MyBatis 配置文件:mybatis-config.xml 为 MyBatis 的全局配置文件,配置了 MyBatis 的运行环境等信息,例如数据库连接信息。
2)加载映射文件。映射文件即 SQL 映射文件,该文件中配置了操作数据库的 SQL 语句,需要在 MyBatis 配置文件 mybatis-config.xml 中加载。mybatis-config.xml 文件可以加载多个映射文件,每个文件对应数据库中的一张表。
3)构造会话工厂:通过 MyBatis 的环境等配置信息构建会话工厂 SqlSessionFactory。
MyBatis框架的执行流程图
图 2 MyBatis 框架的执行流程图
4)创建会话对象:由会话工厂创建 SqlSession 对象,该对象中包含了执行 SQL 语句的所有方法。
5)Executor 执行器:MyBatis 底层定义了一个 Executor 接口来操作数据库,它将根据 SqlSession 传递的参数动态地生成需要执行的 SQL 语句,同时负责查询缓存的维护。
6)MappedStatement 对象:在 Executor 接口的执行方法中有一个 MappedStatement 类型的参数,该参数是对映射信息的封装,用于存储要映射的 SQL 语句的 id、参数等信息。
7)输入参数映射:输入参数类型可以是 Map、List 等集合类型,也可以是基本数据类型和 POJO 类型。输入参数映射过程类似于 JDBC 对 preparedStatement 对象设置参数的过程。
8)输出结果映射:输出结果类型可以是 Map、 List 等集合类型,也可以是基本数据类型和 POJO 类型。输出结果映射过程类似于 JDBC 对结果集的解析过程。
三、创建简单的MyBatis项目
1、配置MyBatis的全局配置文件mybatis-config.xml
在工程中对数据源信息写在db.properties文件中,可以通过properties标签来加载该文件。
db.properties:
db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/mybatis
db.username=root
db.password=12345678
mybatis-config.xml 使用properties标签
<?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>
<!-- 通过properties标签,读取java配置文件的内容 -->
<properties resource="db.properties" />
<!-- 给对象取个别名 -->
<typeAliases>
<!-- 给学生对象取别名 type:类的全路径 -->
<typeAlias type="bean.StudentBean" alias="student"/>
</typeAliases>
<!-- 配置mybatis的开发环境 默认为开发环境 -->
<environments default="development">
<!-- 配置的开发环境 -->
<environment id="development">
<!-- 配置的事务管理器 使用的jdbc的事务管理器 -->
<transactionManager type="JDBC"/>
<!-- 配置数据源(配置的数据库连接的信息)-->
<dataSource type="POOLED">
<!-- driver jdbc的驱动包 -->
<property name="driver" value="${driver}"/>
<!-- url 数据库的链接 -->
<property name="url" value="${url}"/>
<!-- userName 数据库的用户名 -->
<property name="username" value="${userName}"/>
<!-- password 数据库的密码 -->
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- 读取映射文件 -->
<!-- 配置对象与表之间的映射文件-->
<mappers>
<mapper resource="config/mapper/studentMapper.xml"/>
</mappers>
</configuration>
2、 配置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:命名空间 作用:分包,类似java的package,这里使用的是接口映射
-->
<mapper namespace="dao.IStudentDao">
<!--
sql语句的映射
id:方法名
resultType:返回类型
resultType="对象的全路径(目的:框架通过反射自动帮我们创建对象)"
-->
<select id="findAll" resultType="StudentBean">
select pk_studentId as id,
s_studentName as name,
s_sex as sex,
s_age as age
from t_student
</select>
<!--
parameterType:参数的类型
#{}:占位符
-->
<select id="findById" parameterType="int" resultType="StudentBean">
select pk_studentId as id,
s_studentName as name,
s_sex as sex,
s_age as age
from t_student where pk_studentId=#{id}
</select>
<!-- 添加
当参数是一个对象的时候,
占位符:#{参数名} 参数名不能随便取名,必须是该对象对象的get方法值
useGeneratedKeys: 用来返回新添加的id
keyProperty:指定新生成的主键(id值)
-->
<insert id="addStudent" parameterType="StudentBean" useGeneratedKeys="true" keyProperty="id">
insert into t_student(pk_studentId, s_studentName, s_sex, s_age, s_del)
values(null,#{name},#{sex},#{age},0)
</insert>
<delete id="del" parameterType="int">
update t_student
set s_del = 1
where pk_studentId = ${id}
</delete>
<update id="update" parameterType="StudentBean">
update t_student
set s_studentName=#{name},s_age=#{age}
where pk_studentId = ${id}
and s_del = 0
</update>
</mapper>
3、创建Test测试类
/**
* @author Administrator
*/
public class test {
public static void main(String[] args) {
SqlSession sqlSession = null;
try {
//读取xml文件来创建一个的对象
String resource = "config/mybatis-config.xml";
InputStream inputStream = null;
inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//获得一个数据库会话对象(sqlsession)
// 当打开一个连接的时候,数据打开了一个事务
sqlSession=sqlSessionFactory.openSession();
//所有的操作都是通过sqlsession对象来操作
// 在使用操作是需要使用 命名空间 + 方法名
IStudentDao studentDao = sqlSession.getMapper(IStudentDao.class);
List<StudentBean> list = studentDao.findAll();
// 凡事对数据库进行增删改查的时候,必须管理事务
sqlSession.commit();
} catch (IOException e) {
e.printStackTrace();
}finally {
sqlSession.close();
}
}
}
四、MyBatis框架的优缺点
相对于传统的jdbc而言,MyBatis有如下优点:
1、简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
2、灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
B、解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
4、提供映射标签,支持对象与数据库的orm字段关系映射。
5、提供对象关系映射标签,支持对象关系组建维护。
6、提供xml标签,支持编写动态sql。
缺点:
1.同样需要写sql语句,对开发人员编写sql语句的功底有一定要求
2.依赖数据库,导致数据库移植性差,不能随意更换数据库。