0
点赞
收藏
分享

微信扫一扫

【MyBatis】MyBatis学习笔记之一(框架的概念与MyBatis的基础用法)

【MyBatis】MyBatis学习笔记之一(框架的概念与MyBatis的基础用法)

文章目录

1、框架概述

(1)三层架构及作用

  • 界面层(User Interface Layer,表示层/视图层):主要功能是接收用户的数据,显示请求的处理结果。使用web页面和用户交互。

  • 业务逻辑层(Business Logic Layer):接受表示传递过来的数据,检查数据,计算业务逻辑,调用数据访问层获取数据。

  • 数据访问层(Data Access Layer):与数据库打交道。主要实现对数据库的增删改查。将存储在数据库中的数据提交给业务层,同时将业务层处理的数据保存到数据库。(常用框架MyBatis)

  • 三层处理请求交互如图:

    在这里插入图片描述

(2)三层架构的特点

  • 结构清晰、耦合度底,各层分工明确
  • 可维护性高,可扩展性高
  • 有利于标准化
  • 开发人员可以只关注整个结构中的其中某一层的功能实现
  • 有利于各层逻辑的复用

(3)框架的定义

  • 框架是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种认为,框架是可被应用开发者定制的应用骨架、模板。
  • 简单地说,框架其实是半成品软件,就是一组组件,供你使用完成你自己的系统。从另一个角度来说框架是一个舞台,你在舞台上做表演。在框架基础上加入你要完成的功能。
  • 框架是安全的,可复用的,不断升级的软件。

(4)框架解决的问题

  • 框架要解决的最重要的一个问题是技术整合,在 J2EE 的 框架中,有着各种各样的技术,不同的应 用,系统使用不同的技术解决问题。需要从 J2EE 中选择不同的技术,而技术自身的复杂性,有导致更 大的风险。企业在开发软件项目时,主要目的是解决业务问题。 即要求企业负责技术本身,又要求解 决业务问题。这是大多数企业不能完成的。框架把相关的技术融合在一起,企业开发可以集中在业务领域方面。

2、MyBatis框架

(1)MyBatis简介

  • MyBatis 是一个简化和实现了Java数据库持久化层的开源框架,它抽象了当量的JDBC冗余代码,并提供了一个简单易用的API和数据库交互。
  • MyBatis 的前身为 iBATIS。
  • MyBatis 流行的主要原因在于它的简单性易用性
  • MyBatis 通过抽象底层的JDBC代码,自动化SQL结果集产生Java对象、Java对象的数据持久化数据库中的过程使得SQL的使用变得容易。
  • MyBatis官方手册

(2)MyBatis的优点

  • 它消除了大量的JDBC冗余代码
  • 它有地的学习曲线
  • 它能够更好的与传统数据库协同工作
  • 它可以接受 SQL 语句
  • 它提供了与 Spring 和 Guice 框架的集成支持
  • 它提供了与第三方缓存类库的集成支持
  • 它引入了更好的性能

3、MyBatis应用实例

(1)运行环境

  • JDK 1.8+
  • MyBatis 最新版本
  • MySQL 8.0+
  • IDEA 2021.3
  • Apache Maven构建工具

(2)目录结构与基础数据

  • MySQL数据库中:springdb数据库 => student表

    • 表数据

    • 表结构
      在这里插入图片描述

  • 目录结构
    在这里插入图片描述

(3)案例代码与解析

  • StudentDao.java

    package com.Etui.dao;
    
    import com.Etui.domain.Student;
    
    public interface StudentDao {
        // 查询一条语句
        Student selectStudentById(Integer id);
    
        // 添加一条记录
        int insertStudent(Student student);
    }
    
    
  • StudentDao.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">
    <mapper namespace="com.Etui.dao.StudentDao">
    <!--
    查询一个学生:
        <select>: 表示查询操作,里面是select语句
            id: 要执行的SQL语句的唯一标识,是一个自定义字符串。推荐使用doa接口中的方法名称。
            resultType: 告诉 mybatis,执行SQL语句,把数据赋值给哪个类型的java对象。resultType的值使用的是java对象的全限定名。
     -->
    
        <select id="selectStudentById" resultType="com.Etui.domain.Student">
            select id,name,email,age from student where id = #{id}
        </select>
    
        <select id="insertStudent" resultType="com.Etui.domain.Student">
            insert into student(id, name, email, age) values(#{id}, #{name}, #{email}, #{age})
        </select>
    
        <select id="selectStudents" resultType="com.Etui.domain.Student">
            select id, name, email, age from student where id >= #{id}
        </select>
    
        <!--
          1.约束文件
            http://mybatis.org/dtd/mybatis-3-mapper.dtd
            约束文件作用:定义和限制当前文件中可以使用的标签和属性,以及标签出现的顺序。
    
          2.mapper是跟标签
            namespace: 命名空间,必须有值,不能为空(唯一值)。推荐使用Dao接口的全限定名称。
            作用:参与识别SQL语句的作用。
    
          3.在mapper里面可以写<select> <update> <delete> <select>等标签。
            <insert> 里面是 insert 语句,表示执行的insert操作
            …………
        -->
    
    </mapper>
    
  • mybatis.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>
    
        <settings>
            <!-- 设置日志 -->
            <setting name="logImpl" value="STDOUT_LOGGING"/>
        </settings>
    
    
    <!--    配置mybatis环境 -->
        <environments default="development">
    <!--    id: 数据源的名称-->
            <environment id="development">
                <!-- 配置事物类型:使用JDBC事务(使用Connection的提交和回滚) -->
                <transactionManager type="JDBC"/>
                <!-- 数据源dataSource:创建数据库Connection对象。type:POOLED使用数据库的连接池 -->
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                    <property name="url" value="jdbc:mysql://localhost:3306/springdb?userUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=UTC"/>
                    <property name="username" value="root"/>
                    <property name="password" value="Hzz15385252813"/>
                </dataSource>
            </environment>
        </environments>
    
        <!--
        指定其他mapper文件的位置:
        其他mapper文件目的是找到其他文件SQL语句
     -->
        <mappers>
            <!-- 告诉mybatis要执行的SQL语句的位置
                    使用mapper的resource属性指定mapper文件的路径。这个路径是从target/classes路径开始的。
    
                    使用注意:
                        resource="mapper文件的路径,使用 / 分割路径"
                        一个 mapper resource 指定一个mapper文件
             -->
            <mapper resource="com/Etui/dao/StudentDao.xml"/>
        </mappers>
    
    
    </configuration>
    
  • pom.xml

  • <?xml version="1.0" encoding="UTF-8"?>
    
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <!-- 当前项目的坐标 -->
      <groupId>com.Etui</groupId>
      <artifactId>ch01-first</artifactId>
      <version>1.0-SNAPSHOT</version>
      
      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
      </properties>
    
      <!-- 依赖的列表 -->
      <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.11</version>
          <scope>test</scope>
        </dependency>
    
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>8.0.21</version>
        </dependency>
    
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis</artifactId>
          <version>3.5.6</version>
        </dependency>
    
    
      </dependencies>
    
      <build>
    
        <!-- 资源插件 -->
        <resources>
          <resource>
            <directory>src/main/java</directory><!--所在的目录-->
            <includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
              <include>**/*.properties</include>
              <include>**/*.xml</include>
            </includes>
            <filtering>false</filtering>
          </resource>
        </resources>
    
    <!--    <plugins>-->
    <!--      <plugin>-->
    <!--          <artifactId>maven-compiler-plugin</artifactId>-->
    <!--          <version>3.1</version>-->
    <!--          <configuration>-->
    <!--            <source>1.8</source>-->
    <!--            <target>1.8</target>-->
    <!--          </configuration>-->
    <!--        </plugin>-->
    <!--    </plugins>-->
    
      </build>
    </project>
    

(4)测试代码(MyBatis的具体用法)

  • MyTest.java

    package com.Etui;
    
    import com.Etui.domain.Student;
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.*;
    import org.junit.Test;
    
    import javax.xml.transform.Result;
    import java.io.IOException;
    import java.io.InputStream;
    import java.sql.SQLOutput;
    import java.util.List;
    
    public class MyTest {
    
    //    @Test
        public void testSelectStudentById() throws IOException {
            // 调用mybatis某个对象的方法,执行mapper文件中的SQL语句
            // mybatis核心类:SqlSessionFactory
    
            // 1、主配置文件, 定义mybatis主配置文件的位置,从类路径开始的相对路径
            String config = "mybatis.xml";
            // 2、读取主配置文件,使用mybatis框架中的resource类
            InputStream inputStream = Resources.getResourceAsStream(config);
            // 3、创建SQLSessionFactory对象,使用SQLSessionFactoryBuilder类
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
            // 4、获取SQLSession对象
            SqlSession session = factory.openSession();
    
            // 5、指定要执行的SQL语句
            String sqlId = "com.Etui.dao.StudentDao.selectStudentById";
    
            // 6、通过SqlSession对象执行SQL语句
            Student student = session.selectOne(sqlId, 1006); // 查询数据
            System.out.println("查询结果:" + student);
    
            // 7、释放SqlSession对象
            session.close();
        }
    
    //    @Test
        public void testInsertStudent() throws IOException {
            InputStream resource = Resources.getResourceAsStream("mybatis.xml");
    
            SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(resource);
    
            SqlSession session = ssf.openSession();
            // mybatis默认执行sql语句是 手工提交事务,在做增删改操作后,需要手动提交事务
            Integer result = session.insert("com.Etui.dao.StudentDao.insertStudent", new Student(1002, "王五", "wu@163.com", 12));
    
            // 手动提交事务
            session.commit();
    
            System.out.println(result == 1 ? "插入成功!" : "插入失败!");
    
            session.close();
        }
    
    //    @Test
        public void testAutocommitInsertStudent() throws IOException {
            InputStream resource = Resources.getResourceAsStream("mybatis.xml");
    
            SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(resource);
    
    //        SqlSession session = ssf.openSession();
            // 创建一个自动提交事务的SqlSession对象
            SqlSession session = ssf.openSession(true);
    
            // mybatis默认执行sql语句是 手工提交事务,在
            // 做增删改操作后,需要手动提交事务
            Integer result = session.insert("com.Etui.dao.StudentDao.insertStudent", new Student(null, "神里绫华", "linghua@163.com", 18));
    
            System.out.println(result == 1 ? "插入成功!" : "插入失败!");
    
            session.close();
        }
    
        @Test
        // 查询多条语句
        public void testSelectStudents() throws IOException {
            // 调用mybatis某个对象的方法,执行mapper文件中的SQL语句
            // mybatis核心类:SqlSessionFactory
    
            // 1、主配置文件, 定义mybatis主配置文件的位置,从类路径开始的相对路径
            String config = "mybatis.xml";
            // 2、读取主配置文件,使用mybatis框架中的resource类
            InputStream inputStream = Resources.getResourceAsStream(config);
            // 3、创建SQLSessionFactory对象,使用SQLSessionFactoryBuilder类
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
            // 4、获取SQLSession对象
            SqlSession session = factory.openSession();
    
            // 5、指定要执行的SQL语句
            String sqlId = "com.Etui.dao.StudentDao.selectStudents";
    
            // 6、通过SqlSession对象执行SQL语句
            List<Student> students = session.selectList(sqlId, 1003); // 查询数据
            System.out.println("查询结果如下:");
            for (Student student : students) {
                System.out.println(student);
            }
    
            // 7、释放SqlSession对象
            session.close();
        }
    
    }
    

(5)MyBatis 的内部执行原理

  • Dao的实现类执行SQL的原理
  • MyBatis的dao技术

Over!

举报

相关推荐

0 条评论