1_MyBatis入门

  • 梗概

    • 原生JDBC实现CURD的问题

      • 编码繁琐
      • 需要我们自己将结果集映射成对象
      • 性能不太好 连接池 缓存
      • SQL 语句和 java 代码的耦合度特别高
    • 概念

      • MyBatis 本是 Apache 的一个开源项目 iBatis, 2010 年这个项目由 Apache Software Foundation 迁移到了 Google Code,且改名为 MyBatis
        • 2013 年 11 月迁移到 GitHub。
        • iBATIS 一词来源于 “internet” 和 “abatis” 的组合,是一个基于Java的持久层框架
      • MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射
        • MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集
        • MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs (Plain Ordinary Java Object, 普通的 Java对象) 映射成数据库中的记录
  • 1_认识框架

    • 概念

      • 框架(Framework)是一个框子——指其约束性,也是一个架子——指其支撑性
      • 是一个基本概念上的结构,用于去解决或者处理复杂的问题
      • 框架这个广泛的定义使用的十分流行,尤其在软件概念
    • 作用

      • 框架 (Framework) 对于 java 来说, 就是一系列为了解决特定问题而定义的一系列接口和实现类, 在组织框架代码时, 使用了一系列优秀的设计模式, 使代码无论在性能上还是API操作上得到很大提升
      • 框架可以看做是项目开发的半成品, 基本的底层操作已经封装完毕, 通过框架, 程序员可以从底层代码中解脱出来, 专注于业务逻辑的完成和性能的优化
      • 框架规定了你的应用的体系结构
      • 它定义了整体结构,类和对象的分割,各部分的主要责任,类和对象怎么协作,以及控制流程
      • 框架预定义了这些设计参数,以便于应用设计者或实现者能集中精力于应用本身的特定细节
    • 框架还有一个作用是约束

      • 莎士比亚说,“一千个观众眼中有一千个哈姆雷特” 即仁者见仁,智者见智
        • 说每个人都会对作品有不同的理解,每个人对待任何事物都有自己的看法,一千个人就有可能有一千种不同的看法1000人心中有1000个哈姆雷特
      • 同样的技术解决同样的问题会产生不同流程和风格的解决方案,而采用一种框架其实就是限制用户必须使用其规定的方案来实现,可以降低程序员之间沟通以及日后维护的成本
    • 理解

      • 如果将开发完成的软件比作是一套已经装修完毕的新房,那框架就好比是一套已经修建好的毛坯房
      • 用户直接购买毛坯房,建筑质量和户型合理有保证,还省去了自己建造房屋的时间,一举多得
      • 在开发过程是使用框架,同样可以保证减少开发时间、降低开发难度,并且还保证设计质量
      • 好比和世界上最优秀的软件工程师是一个项目的,并且他们完成的还是基础、全局的工作
    • 常用的基于 JavaEE 的三大开源框架

      • 已经从 SSH、SSH2 过渡到了 SSM
      • SpringMVC、Spring、MyBatis >>> springBoot
    • 总之,框架是一个半成品,已经对基础的代码进行了封装并提供相应的API,开发者在使用框架是直接调用封装好的API可以省去很多代码编写,从而提高工作效率和开发速度

  • 2_认识ORM

    • DBC的缺点

      • 需要手动的完成面向对象的Java语言、面向关系的数据库之间数据的转换,代码繁琐无技术含量,影响了开发效率
    • 查询是需要手动的将结果集的列数据转换为Java对象的属性

      • 而添加操作时需要手动将Java对象的属性转换为数据库表的列字段
    • 关于面向对象的Java语言、面向关系的数据库之间数据的转换必须要做

      • ORM 框架就是专门来做这个问题的,相当于在面向对象语言和关系数据库之间搭建一个桥梁
    • 概念

      • ORM,Object-Relationl Mapping,对象关系映射,它的作用是在关系型数据库和对象之间作一个映射,这样我们在具体的操作数据库的时候,只要像平时操作对象一样操作它就可以了,ORM 框架会根据映射完成对数据库的操作,就不需要再去和复杂的SQL语句打交道了
    • 什么是“持久化”

      • 持久(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)
      • 持久化的主要应用是将内存中的数据存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等
    • 什么是 “持久层”

      • 持久层(Persistence Layer),即专注于实现数据持久化应用领域的某个特定系统的一个逻辑层面,将数据使用者和数据实体相关联
      • 之前使用JDBC访问数据库的DAO层,后面采用MyBatis访问数据库的mapper层,就是持久层
    • Mybatis 是一持久层的款半自动的 ORM 映射框架

  • 3_认识MyBatis

    • 概念

      • MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射
      • MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集
      • MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs (Plain Ordinary Java Object, 普通的 Java对象) 映射成数据库中的记录

        在这里插入图片描述

      • 精简解释:MyBatis 是一个半自动 ORM 框架,其本质是对 JDBC 的封装
      • 使用 MyBatis 重点需要程序员编写 SQL 命令,不需要写一行 JDBC 代码

2_MyBatis初次使用

  • 1_创建maven项目导入相关依赖

    • 但凡是框架,使用都是分三步走

      • 导入 jar 文件, maven
      • 处理配置文件
      • 开发业务代码
    • 先创建一个空项目用于存放后面 Mybatis 相关项目模块

      在这里插入图片描述

    • 项目名为 mybatisAll 即可

      在这里插入图片描述

    • 如果想看到项目名可以close项目后再次open即可

      在这里插入图片描述

      在这里插入图片描述

    • 接下来设置 maven 为我们自己安装的, 不用 idea 自带的 (当然用自带的也行)

      在这里插入图片描述

      在这里插入图片描述

    • 在当前项目中创建模块

      在这里插入图片描述

    • 选择 maven 项目 next

      在这里插入图片描述

    • 输入 Groupid 和 Artifactid 然后 finish

      在这里插入图片描述

    • 检查项目目前在磁盘上的存放路径 然后 next

      在这里插入图片描述

    • 检查项目目录结构是否有缺失

      在这里插入图片描述

    • MyBatis 官网说明文档

      • https://www.dba.cn/book/maven/
    • 在 pom.xml 中导入 MyBatis 相关依赖 jar 文件

      <?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.msb</groupId>
        <artifactId>mybatisTest01</artifactId>
        <version>1.0-SNAPSHOT</version>
        <packaging>jar</packaging>
      
        <dependencies>
          <!--mysqlConnector-->
          <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.16</version>
          </dependency>
          <!--mybatis 核心jar包-->
          <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.3</version>
          </dependency>
          <!--junit-->
          <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.1</version>
            <scope>test</scope>
          </dependency>
          <!--lombok -->
          <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
            <scope>provided</scope>
          </dependency>
        </dependencies>
      </project>
      
    • 安装lombok插件后, 重启idea

      在这里插入图片描述

    • 导入lombok依赖后, 单独设置启用注解处理

      在这里插入图片描述

  • 2_准备数据库_包结构和实体类

    • 数据库

      在这里插入图片描述

    • 项目结构

      在这里插入图片描述

    • 实体类Dept

      package com.xxx.pojo;
      
      import lombok.AllArgsConstructor;
      import lombok.Data;
      import lombok.NoArgsConstructor;
      import java.io.Serializable;
      
      @Data
      @AllArgsConstructor
      @NoArgsConstructor
      public class Dept implements Serializable {
        private Integer deptno;
        private String dname;
        private String loc;
      }
      
  • 3_准备Mapper映射文件和核心配置文件

    • resources 目录下 创建 com/xxx/mapper 目录, 然后添加 DeptMapper.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="aaa">
       <!--public List<Dept> findAll(){ }-->
       <select id="findAll" resultType="com.msb.pojo.Dept" >
       select * from dept
       </select>
       </mapper>
      
    • resources 目录下准备 sqlMapConfig.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>
      <environments default="development">
      <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
      <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
      <property name="url" value="jdbc:mysql://127.0.0.1:3306/mydb?
      useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=Asia/Shanghai"/>
      <property name="username" value="root"/> 
      <property name="password" value="root"/>
      </dataSource>
      </environment>
      </environments>
      <!--加载mapper映射文件-->
      <mappers>
      <mapper resource="com/xxx/mapper/DeptMapper.xml"/>
      </mappers>
      </configuration>
      
  • 4_运行测试

    在这里插入图片描述

    • 在test目录下开发测试代码并运行

      在这里插入图片描述

      package com.xxx.test;
      
      import com.msb.pojo.Dept;
      import org.apache.ibatis.io.Resources;
      import org.apache.ibatis.session.SqlSession;
      import org.apache.ibatis.session.SqlSessionFactory;
      import org.apache.ibatis.session.SqlSessionFactoryBuilder;
      import org.junit.After;
      import org.junit.Before;
      import org.junit.Test;
      
      import java.io.IOException;
      import java.io.InputStream;
      import java.util.List;
      
      public class Test1 {
        private SqlSession sqlSession;
        @Before
        public void init(){
          SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
          InputStream resourceAsStream = null;
          try {
            resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
          } catch (IOException e) {
            e.printStackTrace();
          }
          SqlSessionFactory factory = ssfb.build(resourceAsStream);
          sqlSession=factory.openSession();
        }
      
        @Test
        public void testFindAll(){
          // 调用SQL语句
          List<Dept> list = sqlSession.selectList("findAll");
          for (Dept dept : list) {
            System.out.println(dept);
          }
        }
      
        @After
        public void release(){
          // 关闭SQLSession
          sqlSession.close();
        }
      }
      

3_MyBatis配置详解

  • 1_log4j1 和 log4j2 的简单配置

    • 项目中添加依赖

      log4j2
      <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.12.1</version>
      </dependency>
      
      log4j1 
      <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
      </dependency>
      
      • mybatis.cfg.xml 中配置 MyBatis 所使用的具体日志实现
        • 如果不指定将自动搜索
        • 可能会搜到 log4j,但是如果优先搜到了其他的日志实现呢,所以还是设置为好
        • 这一来 log4j 就跑不了了
    • log4j 1

      • log4j.properties 文件负责到 src
      • 另外在其中可以将全局的日志级别调高,避免大量 debug 信息的干扰
      • 同时将对映射文件的操作调低,可以用来显示 SQL 语句的调试信息
      • 开发阶段,建议启动控制的日志
        # 定义全局日志级别调试阶段推荐debug
        log4j.rootLogger = debug,stdout 
        
        log4j.appender.stdout = org.apache.log4j.ConsoleAppender
        log4j.appender.stdout.Target = System.err
        log4j.appender.stdout.layout = org.apache.log4j.SimpleLayout
        
        log4j.appender.logfile = org.apache.log4j.FileAppender
        log4j.appender.logfile.File = d:/msb.log
        log4j.appender.logfile.layout = org.apache.log4j.PatternLayout
        log4j.appender.logfile.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss} %l %F %p %m%n
        
        • 在核心配置文件中可以选择的其他日志处理方式
    • log4j 2

      • 将 log4j2.xml 文件负责到 resources 下
        <?xml version="1.0" encoding="UTF-8"?>
        <Configuration status="DEBUG">
          <Appenders>
            <Console name="Console" target="SYSTEM_ERR">
              <PatternLayout pattern="%d{YYYY-MM-dd HH:mm:ss} [%t] %-5p %c{1}:%L - %msg%n" />
            </Console>
          
            <RollingFile name="RollingFile" filename="log/test.log"
                filepattern="${logPath}/%d{YYYYMMddHHmmss}-fargo.log">
              <PatternLayout pattern="%d{YYYY-MM-dd HH:mm:ss} [%t] %-5p %c{1}:%L - %msg%n" />
              <Policies>
                <SizeBasedTriggeringPolicy size="10 MB" />  
              </Policies>
              <DefaultRolloverStrategy max="20" />
            </RollingFile>
        
          </Appenders>
          <Loggers>
            <Root level="INFO">
              <AppenderRef ref="Console" />
            </Root>
          </Loggers>
        </Configuration>
        
      • 核心配置文件中可以指定日志打印方式
        在这里插入图片描述
  • 2_关于事务配置

    在这里插入图片描述

    • 在 mybatis 核心配置文件中 environment 中 通过 transactionManager 配置事务的处理策略

      • JDBC
        • 这个配置直接简单使用了 JDBC 的提交和回滚设置
        • 它依赖于从数据源得到的连接来管理事务范围
      • MANAGED
        • 这个配置几乎没做什么
        • 它从来不提交或回滚一个连接
        • 而它会让容器来管理事务的整个生命周期 (比如 Spring 或 JEE 应用服务器的上下文) 默认情况下它会关闭连接
        • 然而一些容器并不希望这样, 因此如果你需要从连接中停止它, 将 closeConnection 属性设置为 false
        • mybatis 本身并不做事务的处理, 交给其他框架去处理事务, 如 spring
  • 3_关于映射文件的加载方式

    • 步骤

      • mapper 映射文件的文件路径导入 使用的 mapper 标签的 resource 属性
      • 网络资源路径 使用的 mapper 标签的 url 属性
      • 接口的全限定名导入 使用的是 mapper 标签的 class 属性 (基于接口的代理模式开发)
      • 包扫描形式加载所有的 mapper 映射文件使用的是 package 标签

        在这里插入图片描述

        在这里插入图片描述

        在这里插入图片描述

        在这里插入图片描述

  • 5_关于外部属性配置文件存储数据库连接信息

    • 在 resources 下准备 jdbc.properties 属性配置文件

      在这里插入图片描述

    • 配置文件中的内容

      jdbc_driver = com.mysql.cj.jdbc.Driver
      jdbc_url = jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
      jdbc_username = root
      jdbc_password = root
      
    • 在核心配置文件中引入 db.properties 属性文件

      <?xml version="1.0" encoding="UTF-8" ?>
      <!-- xml文档约束 约束xml文档中可以有哪些标签,哪些属性,以及标签的包含关系和顺序....
      dtd 约束
      schema 约束
      -->
      <!DOCTYPE configuration
          PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
          "http://mybatis.org/dtd/mybatis-3-config.dtd">
      <configuration>
      
        <properties resource="jdbc.properties"></properties>
        <settings>
          <!--设置日志处理方式-->
          <setting name="logImpl" value="LOG4J"/>
        </settings>
      
        <!--设置实体类别名-->
        <typeAliases>
          <!--
          通过包扫描给所有的实体类起别名
          给指定报名下的所有类起别名
          默认每个实体类的别名是首字母小写的类名
          Dept    dept
          Emp     emp
          -->
          <package name="com.msb.pojo"/>
        </typeAliases>
        
        <!--配置数据库链接信息-->
        <environments default="mysql">
          <!--数据源1-->
          <environment id="mysql">
            <transactionManager type="JDBC"/>
            <!--一个数据源-->
            <dataSource type="POOLED">
              <property name="driver" value="${jdbc_driver}"/>
              <property name="url" value="${jdbc_url}"/>
              <property name="username" value="${jdbc_username}"/>
              <property name="password" value="${jdbc_password}"/>
            </dataSource>
          </environment>
        </environments>
        <!--加载映射文件的-->
        <mappers>
          <mapper resource="com/msb/mapper/DeptMapper.xml"/>
        </mappers>
      </configuration>
      

更多推荐