• 详细学习Mybatis(1)


    一、MyBatis概述

    1.1 框架

    在文献中看到的framework被翻译为框架

    • Java常用框架:
      1.SSM三大框架: Spring + SpringMVC + MyBatis
      2.SpringBoot
      3.SpringCloud等……
    • 框架其实就是对通用代码的苗装,提前写好了一堆接口和类,我们可以在做项目的时候直接引入这些接口和类(引入框架),基于这些现有的接口和类进行开发,可以大大提高开发效率.
    • 框架一般都以jar包的形式存在。(jar包中有class文件以及各种配置文件等。)
    • SSM三大框架的学习顺序:MyBatis、Spring、SpringMVC

    1.2 三层框架

    在这里插入图片描述

    • 表现层(UI)︰直接跟前端打交互(一是接收前端ajax请求,二是返回json数据给前端)
    • 业务逻辑层(BLL)︰一是处理表现层转发过来的前端请求(也就是具体业务),二是将从持久层获取的数据返回到表现层。
    • 数据访问层(DAL)︰直接操作数据库完成CRUD,并将获得的数据返回到上一层(也就是业务逻辑层)。

    Java持久层框架

    • Mybatis
    • Hibernate(实现了JPA规范)
    • jOOQ
    • Guzz
    • Spring Data(实现了JPA规范)
    • ActiveJDBC

    1.3 了解Mybatis

    • 支持定制化 SQL、存储过程、基本映射以及高级映射
    • 避免了几乎所有的JDBC代码中手动设置参数以及取结果集支持XML开发,也支持注解式开发。[为了保证sal语句的灵活,所以mvbatis大部分是采用XML方式开发。]
    • 将接口和Java 的 POJOs(Plain Ordinary Java Object,简单普通的Java对象)映射成数据库中的记录
    • 体积小好学: 两个iar包,两个XML配置文件。
    • 完全做到sql解耦合。
    • 提供了基本映射标签
    • 提供了高级映射标签
    • 提供了XML标签,支持动态SQL的编写.

    在这里插入图片描述

    二、Mybatis入门开发

    2.1 入门

    1. 打包方式:jar(不需要war,因为mybatis封装的是jdbc。)

    <groupId>com.powernode</groupId>
    <artifactId>mybatis-001-introduction</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    
    • 1
    • 2
    • 3
    • 4

    2. 引入依赖(mybatis依赖 + mysql驱动依赖)

    <!--mybatis核心依赖-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.10</version>
    </dependency>
    <!--mysql驱动依赖-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.30</version>
    </dependency>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    3. 在resources根目录下新建mybatis-config.xml配置文件(可以参考mybatis手册拷贝)

    <?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://localhost:3306/powernode"/>
                    <property name="username" value="root"/>
                    <property name="password" value="123456"/>
                </dataSource>
            </environment>
        </environments>
        <mappers>
            <!--sql映射文件创建好之后,需要将该文件路径配置到这里-->
            <mapper resource=""/>
        </mappers>
    </configuration>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    注意1:mybatis核心配置文件的文件名不一定是mybatis-config.xml,可以是其它名字。
    注意2:mybatis核心配置文件存放的位置也可以随意。这里选择放在resources根目录下,相当于放到了类的根路径下。

    4. 在resources根目录下新建CarMapper.xml配置文件(可以参考mybatis手册拷贝)

    <?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="car">
        <insert id="insertCar">
            insert into t_car
                (id,car_num,brand,guide_price,produce_time,car_type) 
            values
                (null,'102','丰田mirai',40.30,'2014-10-05','氢能源')
        </insert>
    </mapper>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    注意1:sql语句最后结尾可以不写 “;”
    注意2:CarMapper.xml文件的名字不是固定的。可以使用其它名字。
    注意3:CarMapper.xml文件的位置也是随意的。这里选择放在resources根目录下,相当于放到了类的根路径下。
    注意4:将CarMapper.xml文件路径配置到mybatis-config.xml:

    5. 编写MyBatisIntroductionTest代码

    package com.powernode.mybatis;
    
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    
    import java.io.InputStream;
    public class MyBatisIntroductionTest {
        public static void main(String[] args) {
            // 1. 创建SqlSessionFactoryBuilder对象
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
            // 2. 创建SqlSessionFactory对象
            InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("mybatis-config.xml");
            SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
            // 3. 创建SqlSession对象
            SqlSession sqlSession = sqlSessionFactory.openSession();
            // 4. 执行sql
            int count = sqlSession.insert("insertCar"); // 这个"insertCar"必须是sql的id
            System.out.println("插入几条数据:" + count);
            // 5. 提交(mybatis默认采用的事务管理器是JDBC,默认是不提交的,需要手动提交。)
            sqlSession.commit();
            // 6. 关闭资源(只关闭是不会提交的)
            sqlSession.close();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    默认采用的事务管理器是:JDBC。JDBC事务默认是不提交的,需要手动提交。

    2.2、MyBatis入门程序的一些小细节

    1. SQL语句后面的可以省略
    2. Resources.getResourceAsStream
      小技巧:以后凡是遇到Resource这个单词,大部分情况下,这种加载资源的方式就是从类的根路径下开始查找
      优点:采用这种方式,从类路径当中加载资源,项目的移植性很强。项目从windows移植到linux,代码不需要修改,因为这个资源文件一直都在类路径当中
    3. InputStream is = new FileInputStream(" d : \\mybatis-config.xml");
      采用这种方式也可以实现加载。
      缺点:可移植性太差,程序不够健壮。可能会移植到其他的操作系统当中。导致以上路径无效,还需要修改java代码中的路径。这样违背了OCP原则。
    4. mybatis核心配置文件的名字,不一定是: mybatis-config.xml。可以是其它名字。
    5. mybatis核心配置文件存放的路径,也不一定是在类的根路径下。可以放到其它位置。但为了项目的移植性,健壮性,最好将这个配置文件放到类路径下面。
    6. InputStream is=ClassLoader.getSystemClassLoader().getResourceAsStream("mybatis-config.xml")
    • classLoader.getsystemclassLoader()获取系统的类加载器。

    • 系统类加载器有一个方法叫做: getResourceAsStream

    • 它就是从类路径当中加载资源的。

    • 通过源代码分析发现:
      InputStream is = Resources.getResourceAsStream( "mybatis-config.xml");底
      层的源代码其实就是:
      InputStream is = ClassLoader .getSystemClassLoader().getResourceAsStream("mybatis-config.xml");

    • resource属性:这种方式是从类路径当中加载资源。

    • url属性:这种方式是从绝对路径当中加载资源。

    2.3、MyBatis事务管理机制深度解析

    在mybatis-config.xml文件中,可以通过以下的配置进行mybatis的事务管理

    type属性的值包括两个:

    1. JDBC(jdbc)
    2. MANAGED(managed)
      都不用区分大小写
    • JDBC事务管理器:
      mybatis框架自己管理事务,自己采用原生的JDBC代码去管理事务:
      conn.setAutocommit(false);开启事务。
      …业务处理…
      conn.commit() 手动提交事务
      使用JDBC事务管理器的话,底层创建的事务管理器对象: JdbcTransaction对象。

    如果你编写的代码是下面的代码:

    sqlSession sqlsession = sqlsessionFactory.openSession(true);
    
    • 1

    表示没有开启事务。因为这种方式压根不会执行:conn.setAutoCommit(false);
    在JDBC事务中,没有执行conn.setAutoCommit(false);那么autoCommit就是true。
    如果autoCommit是true,就表示没有开启事务。只要执行任意一条DAL语句就提交一次。

    • MANAGED事务管理器:
      mybatis不再负责事务的管理了。事务管理交给其它容器来负责。例如: spring。我不管事务了,你来负责吧。

    没有人管理事务就是没有事务。

    • JDBC中的事务:
      如果你没有在JDBC代码中执行: conn.setAutoCommit(false);的话,默认的autoCommit是true。

    2.4、在开发中junit是如何使用的

    • Junit是专门做单元测试的组件

    • 测试值中涉及的两个概念
      期望值
      实际值
      当期望值和实际值相同的情况下,才能够通过单元测试

    • Junit是来替代Main方法的

    • Junit使用的步骤:

    1. 引入依赖
    <!-- junit依赖 -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.2</version>
        <scope>test</scope>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    1. 第二步:编写单元测试类【测试用例】,测试用例中每一个测试方法上使用@Test注解进行标注。
    • 测试用例的名字以及每个测试方法的定义都是有规范的:
    • 测试用例的名字:XxxTest
    • 测试方法声明格式:public void test业务方法名(){}
    // 测试用例
    public class CarMapperTest{
        // 测试方法
        @Test
        public void testInsert(){}
        
        @Test
        public void testUpdate(){}
        
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    1. 第三步:可以在类上执行,也可以在方法上面实行

    在类上执行时,该类中所有的测试方法都会执行。
    在方法上执行时,只执行当前的测试方法。

    2.5、Mybatis集成日志框架logback

    关于mybatis集成日志组件,让我们调试起来更加方便

    mybatis常见的集成的日志组件有哪些呢

    • SLF4J(沙拉风)
    • LOG4J
    • STDOUT_LOGGING

    其中STDOUT_LOGGING是标准日志,mybatis已经实现了这种标准日志。mybatis框架本身已经实现了这种标准只要开启即可。怎么开启呢?
    mybatis-config.xml文件中使用settings标签进行配置开启。

        <settings>
            <setting name="logImpl" value="STDOUT_LOGGING"/>
        </settings>
    
    • 1
    • 2
    • 3

    标准日志也可以用,但是配置不够灵活,可以集成其他的日志组件,例如:log4j,logback等。

    logback是目前日志框架中性能较好的,较流行的,所以我们选它。

    • 引入logback的步骤:
    1. 第一步:引入logback相关依赖
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.2.11</version>
      <scope>test</scope>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. 第二步:引入logback相关配置文件(文件名叫做logback.xmllogback-test.xml,放到类路径当中)
    <?xml version="1.0" encoding="UTF-8"?>
    
    <configuration debug="false">
        <!-- 控制台输出 -->
        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
            <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            </encoder>
        </appender>
        <!-- 按照每天生成日志文件 -->
        <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!--日志文件输出的文件名-->
                <FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}.log</FileNamePattern>
                <!--日志文件保留天数-->
                <MaxHistory>30</MaxHistory>
            </rollingPolicy>
            <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            </encoder>
            <!--日志文件最大的大小-->
            <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
                <MaxFileSize>100MB</MaxFileSize>
            </triggeringPolicy>
        </appender>
    
        <!--mybatis log configure-->
        <logger name="com.apache.ibatis" level="TRACE"/>
        <logger name="java.sql.Connection" level="DEBUG"/>
        <logger name="java.sql.Statement" level="DEBUG"/>
        <logger name="java.sql.PreparedStatement" level="DEBUG"/>
    
        <!-- 日志输出级别,logback日志级别包括五个:TRACE < DEBUG < INFO < WARN < ERROR -->
        <root level="DEBUG">
            <appender-ref ref="STDOUT"/>
            <appender-ref ref="FILE"/>
        </root>
    
    </configuration>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
  • 相关阅读:
    全新彩虹晴天知识付费系统/多功能系统源码/虚拟商城系统
    P3870 [TJOI2009] 开关(线段树)
    ​LeetCode解法汇总2651. 计算列车到站时间
    Kotlin开发Android之基础问题记录
    开源私域流量营销系统(java)
    [附源码]计算机毕业设计基于Springboot颐养天年辅助平台
    vscode终端命令报错
    how install java on windows
    Python filter 用法
    如何获取最新diffusion models多模态方向的科研进展?
  • 原文地址:https://blog.csdn.net/gua_Piter/article/details/132922912