MyBatis第一部分 框架简介

1. 框架简介

1.1 简介

持久层的框架,针对的是jdbc的优化,简化数据库的操作

【目标:应用型框架,主要学习API和配置就可以了】

MyBatis最初是Apache的一个开源项目iBatis(导入包的时候会出现这个名字), 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下, iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到Github。

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

1.2 mybatis和JDBC的关系

JDBC
SQL 夹杂在Java代码中耦合度高,导致硬编码内伤
维护不易且实际开发需求中 SQL 有变化,频繁修改的情况多见
代码冗长,开发效率低。


MyBatis

进行快速的SQL语句调用,节省了jdbc中间冗余的步骤
轻量级,性能出色
SQL 和 Java 编码分开,功能边界清晰。Java代码专注业务、SQL语句专注数据
开发效率稍逊于 Hibernate,但是完全能够接收。

1. MyBatis和JDBC(Java Database Connectivity)之间存在密切的关系。首先,需要明确的是,MyBatis是基于JDBC的一个持久层框架。这意味着MyBatis在底层仍然是使用JDBC来与数据库进行交互的
2. JDBC是Java提供的一种标准API,用于与数据库进行交互。它提供了一系列的接口和类,使开发人员能够直接使用Java代码来编写SQL语句并执行数据库操作。然而,直接使用JDBC进行数据库操作可能会涉及大量的重复代码,如加载驱动、创建连接、创建Statement等。
3. MyBatis作为一个持久层框架,在JDBC的基础上提供了更高级的抽象和功能。它内部封装了JDBC,简化了繁琐的数据库操作过程,使得开发人员可以更加专注于SQL语句本身和业务逻辑的实现通过MyBatis,开发人员可以使用XML文件或注解来配置和映射数据库操作,而无需手动编写大量的JDBC代码
4. 此外,MyBatis还提供了诸如动态SQL、对象关系映射(ORM)等高级功能,这些功能都是基于JDBC的封装和扩展。因此,可以说MyBatis是建立在JDBC之上的一个更高级别的数据库访问工具,它使得数据库操作更加简便、高效和灵活。 

总的来说,MyBatis和JDBC的关系是:MyBatis是基于JDBC的持久层框架,它封装了JDBC并提供了更高级的抽象和功能,以简化数据库操作和提高开发效率

      它支持自定义SQL、存储过程以及高级映射。MyBatis消除了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解来配置和映射原生信息,将接口和Java的POJOs(Plain Old Java Objects, 普通的Java对象)映射成数据库中的记录。使得开发人员可以直接编写SQL语句,而无需过多关心JDBC的底层细节。MyBatis通过映射文件将SQL语句与Java对象进行映射,使得开发人员可以更加方便地操作数据库。

      MyBatis的优点还包括简单易学、灵活、提供XML标签,支持编写动态SQL语句、提供映射标签等,支持对象与数据库的ORM字段关系映射等。

1.3 mybatis快速运用

【操作:根据员工ID查询员工数据】

1、数据库准备

【在navicat新建数据库】

CREATE DATABASE `mybatis-example`;

USE `mybatis-example`;

CREATE TABLE `t_emp`(
  emp_id INT AUTO_INCREMENT,
  emp_name CHAR(100),
  emp_salary DOUBLE(10,5),
  PRIMARY KEY(emp_id)
);

INSERT INTO `t_emp`(emp_name,emp_salary) VALUES("tom",200.33);
INSERT INTO `t_emp`(emp_name,emp_salary) VALUES("jerry",666.66);
INSERT INTO `t_emp`(emp_name,emp_salary) VALUES("andy",777.77);

2、项目搭建

整体步骤

- 步骤1:导入依赖
- 步骤2:准备实体类
- 步骤3:进行数据库的操作
    -    步骤3.1:创建mapper接口
    -    步骤3.2:创建mapper.xml文件(自己建一个模板,填写约束,方便之后使用)
    -     步骤3.3:准备mybatis配置文件,包括连接的数据库的信息,mapper.xml的位置等
- 步骤4:编写测试代码,使用mybatisAPI进行数据库查找,包括sqlsessionfactory,sqlseesion,getmapper(接口.class)等。

创建父工程:ssm-mybatis-part【删除 src部分, 在pom.xml中打包方式改为pom】

步骤1:导入依赖【在pom.xml文件中】

<dependencies>
  <!-- mybatis依赖 -->
  <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.11</version>
  </dependency>

  <!-- MySQL驱动 mybatis底层依赖jdbc驱动实现,本次不需要导入连接池,mybatis自带! -->
  <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.25</version>
  </dependency>

  <!--junit5测试-->
  <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-api</artifactId>
      <version>5.3.1</version>
  </dependency>
</dependencies>

步骤2:准备实体类

创建子工程名称:mybatis-base-quick-01【默认都会删除main】,用来装员工的信息

包名:com.xxx.pojo,在目录pojo下创建实体类Employee

需要生成get set tostring方法】(右击-生成generate-Getter和Setter/toString())

注:数据库字段是下划线表示【emp_id】,而Java里面采用驼峰命名法【empId】

public class Employee {

    private Integer empId;

    private String empName;

    private Double empSalary;
    
    //getter | setter  |tostring
}

步骤3:进行数据库的操作

【这时,JDBC中就会准备Dao层,mybatis中就是准备mapper接口和MapperXMl文件】

对比:

之前是在Dao接口里面规定方法,DaoImpl实现类方法的具体实现

现在是Mapper接口规定方法,mapper.xml接口对应方法的sql语句

推荐在XML文件中编写SQL语句,好处:让用户能更专注于 SQL 代码,不用关注其他的JDBC代码(返回值的映射、SQL语句的执行等)

一般编写SQL语句的文件命名:XxxMapper.xml  【Xxx一般取表名!!】

Mybatis 中的 Mapper 接口相当于以前的 Dao。但是区别在于,Mapper 仅仅只是建接口即可,我们不需要提供实现类,具体的SQL写到对应的Mapper文件。

      步骤3.1:创建mapper接口,在mapper目录下新建一个EmployeeMapper

public interface EmployeeMapper {
//selectEmployee(Integer empId):自己定义的方法
// 这个方法会根据提供的员工ID (empId) 从数据库中查询对应的员工信息,
// 并返回一个Employee类型的对象
Employee queryEmployee(Integer id);
int deleteById(Integer id);
}

    步骤3.2:【先创建mapper.xml文件,(自己建一个模板,填写约束,方便之后使用)】

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace等于mapper接口类的全限定名,这样实现对应 -->
<mapper namespace="">

</mapper>

编写具体实现【在resources下建一个mappers目录,其中建一个EmployeeMapper.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace等于mapper接口类的全限定名,这样实现对应 -->
<!--这里的namespace千万别忘了写!!!-->
<mapper namespace="com.xxx.mapper.EmployeeMapper">
<!--声明标签写sql语句,每个标签对应接口的一个方法即方法的实现
<select id="方法名:在mapper接口中自己定义的方法名" resultType="回值类型:即查询结果的类型即相对应的实体类的全名">
           sql语句
</select>  对应方法
注意:mapper接口内的方法不能重载,因为mapper.xml按方法名称识别,如果有方法重写它不可以识别

-->
<select id="queryEmployee" resultType="com.xxx.pojo.Employee">
    select emp_id  empId,emp_name  empName, emp_salary empSalary from
    t_emp where emp_id = #{id}
</select>
<delete id="deleteById" >
   delete from t_emp where emp_id=#{id}
</delete >
</mapper>

    步骤3.3:准备mybatis配置文件,包括连接的数据库的信息,mapper.xml的位置等。

【习惯上命名为 mybatis-config.xml,这个文件名仅仅只是建议,并非强制要求。将来整合 Spring 之后,这个配置文件可以省略,所以大家操作时可以直接复制、粘贴。】

【注:在mybatis-config.xml也可以创建约束,和以上步骤一样,在new的下拉框就会有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>
    
    
</configuration>

利用约束创建mybatis-config.xml文件

resources—>new—>mybatis-config.xml

【mybatis-example是我的数据库名,密码记得改】

<?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>

  <!-- environments表示配置Mybatis的开发环境,可以配置多个环境,在众多具体环境中,使用default属性指定实际运行时使用的环境。default属性的取值是environment标签的id属性的值。 类似于环境变量的配置-->
  <environments default="development">
    <!-- environment表示配置Mybatis的一个具体的环境 -->
    <environment id="development">
      <!-- Mybatis的内置的事务管理器 
      MANAGSED不会自动开启事务!|J0BC自动开启事务需要自己提交事务:
      -->
      <transactionManager type="JDBC"/>
      <!-- 配置数据源 
      type-POOLED mybatis帮助我们推护一个链按法|UNPOOLED 每次都新建或者释放能接
      -->
      <dataSource type="POOLED">
        <!-- 建立数据库连接的具体信息 -->
        <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mybatis-example"/>
        <property name="username" value="root"/>
        <property name="password" value="111111"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <!-- Mapper注册:指定Mybatis映射文件的具体位置 -->
    <!-- mapper标签:配置一个具体的Mapper映射文件 -->
    <!-- resource属性:指定Mapper映射文件的实际存储位置,这里需要使用一个以类路径根目录为基准的相对路径 -->
    <!--    对Maven工程的目录结构来说,resources目录下的内容会直接放入类路径,所以这里我们可以以resources目录为基准 -->
    <mapper resource="mappers/EmployeeMapper.xml"/> 如果有多个在下面直接加就可以了
  </mappers>

</configuration>


步骤4:编写测试代码,使用mybatisAPI进行数据库查找,包括sqlsessionfactory,sqlseesion,getmapper(接口.class)等。

mybatis提供的API进行方法的调用

1)读取外部配置文件(mybatis-config.xml)

2)创建sqlSessionFactory 会缓存配置文件信息

  ①声明Mybatis全局配置文件的路径

  ②以输入流的形式加载Mybatis配置文件

  ③基于读取Mybatis配置文件的输入流创建SqlSessionFactory对象

3)根据sqlSessionFactory 创建sqlSession(每次业务创建一个,用完就释放)

4)获取接口的代理对象,调用代理对象的方法,就会查找mapper接口的方法

5)提交事务(非DQL)释放资源。

/**
 * projectName: com.xxx.test
 *
 * description: 测试类
 */
public class MyBatisTest {

    @Test
    public void testSelectEmployee() throws IOException {

        // 1.创建SqlSessionFactory对象:读取外部配置文件(mybatis-config.xml)
        // ①声明Mybatis全局配置文件的路径
        // ②以输入流的形式加载Mybatis配置文件
        //使用Resources.getResourceAsStream()方法读取配置文件,这个方法是 MyBatis 框架提供的一个实用方法,用于从类路径(classpath)中加载资源文件,根据提供的类路径来查找并返回一个 InputStream,以便读取资源文件的内容。这在加载 MyBatis 的配置文件(如 mybatis-config.xml)时特别有用,因为这些文件通常放置在项目的类路径中。这个方法属于 MyBatis  org.apache.ibatis.io 包中的 Resources 工具类。
        //InputStream 是 Java 标准库中的一个抽象类,它位于 java.io 包中。InputStream 是所有字节输入流类的超类,通常用于从文件、网络连接或其他数据源中读取字节数据。
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        //2.创建sqlSessionFactory 会缓存配置文件信息
        // ③基于读取Mybatis配置文件的输入流创建SqlSessionFactory对象
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        // 3.根据sqlSessionFactory 创建sqlSession会话(每次业务创建一个,用完就释放)
        //使用之前创建的sessionFactory对象来开启一个新的SqlSession。这个SqlSession代表与数据库的一次会话
        SqlSession session = sessionFactory.openSession();

        // 4.根据EmployeeMapper接口的Class对象获取Mapper接口类型的对象(动态代理技术)就会查找mapper接口的方法
        //通过SqlSession的getMapper方法,根据EmployeeMapper接口的Class对象来获取这个接口的实例,即EmployeeMapper接口类型的 mapper变量。这个实例实际上是由MyBatis在运行时动态生成的代理对象。
        EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);

        // 5. 调用代理类方法既可以触发对应的SQL语句
        //mapper对象的queryById方法,并传入参数1来查询ID为1的员工。查询结果会被封装到一个employee中,并打印出来
        Employee employee = employeeMapper.queryById(1);

        System.out.println("employee = " + employee);

        // 6.关闭SqlSession 释放与数据库的连接和相关资源
        //没有对数据进行修改(如插入、更新或删除sqlSession.commit();不是必须的
        session.commit(); //提交事务 [DQL不需要,其他需要]用于提交对数据库的修改,确保这些修改被永久保存
        session.close(); //关闭会话

    }
}

 如果输出employee,则测试成功!!!

SqlSession:代表Java程序和数据库之间的会话。(HttpSession是Java程序和浏览器之间的会话)
SqlSessionFactory:是“生产”SqlSession的“工厂”。SqlSessionFactory是MyBatis中的一个核心接口,它是创建SqlSession的工厂。SqlSession代表了和数据库的一次会话,通过它可以执行SQL命令。

工厂模式:如果创建某一个对象,使用的过程基本固定,那么我们就可以把创建这个对象的相关代码封装到一个“工厂类”中,以后都使用这个工厂类来“生产”我们需要的对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值