2020-10-25

MyBatis的简单理解

一、什么是Mybatis

这里借用官网的一句话介绍什么是mybatis:MyBatis 是一个可以自定义 SQL、存储过程和高级映射的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

二、MyBatis的工作原理

图 2  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.依赖数据库,导致数据库移植性差,不能随意更换数据库。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值