mybatis入门的环境搭建及快速完成CRUD(增删改查)

                                                 

                                                                                      又是爱代码的一天 

一、MyBatis的介绍

( 1 ) 背景

MyBatis 的背景可以追溯到 2002 年,当时 Clinton Begin 开发了一个名为 iBATIS 的持久化框架。iBATIS 的目标是简化 JDBC 编程,提供一种更直观、易用的方式来处理数据库操作。

 

在传统的 JDBC 编程中,开发人员需要手动编写大量的重复代码,如连接数据库、创建 Statement、执行 SQL 语句、处理结果集等。这些繁琐的操作不仅增加了开发的工作量,还使代码难以维护和理解。iBATIS 通过提供一个简单易用的 API,封装了这些繁琐的操作,使得开发人员可以更专注于业务逻辑的实现。

iBATIS 的核心思想是将 SQL 语句与 Java 代码分离,使用 XML 或注解的方式来定义和管理 SQL。这样一来,SQL 语句可以更方便地修改和维护,而且可以与 Java 代码解耦,提高了代码的可读性和可维护性

随着时间的推移,iBATIS 被越来越多的开发人员所接受和使用。然而,iBATIS 的发展也面临一些挑战。比如,它的命名规范和配置方式相对复杂,不够直观;它对动态 SQL 的支持有限,不够灵活;它的插件机制不够完善,无法满足一些特定的需求。

为了解决这些问题,iBATIS 在 2010 年更名为 MyBatis,并进行了一系列的改进和扩展。MyBatis 在保留了 iBATIS 的优点的基础上,进一步增强了灵活性、可维护性和可扩展性。

MyBatis 提供了丰富的映射方式,可以将查询结果映射为 Java 对象、Map、基本类型等。它支持动态 SQL,可以根据条件动态拼接 SQL 语句,提高查询的灵活性和效率。同时,MyBatis 还提供了插件机制,开发人员可以根据实际需求编写插件,实现自己的业务逻辑。

除了 MyBatis 核心框架,还有一些扩展工具出现,进一步增强了 MyBatis 的功能和易用性。比如,MyBatis-Plus 提供了更多的 CRUD 操作和查询功能,简化了开发人员的工作;MyBatis Generator 可以根据数据库表结构自动生成代码;MyBatis Spring Boot Starter 则用于简化 MyBatis 在 Spring Boot 中的集成。

总之,MyBatis 的发展背景可以看作是对传统 JDBC 编程的一种改进和优化,它通过简化、灵活和可扩展的特性,使得开发人员可以更轻松地处理数据库操作,提高开发效率和代码质量

MyBatis 的发展背景主要有以下几个方面:

  1. 简化 JDBC 编程:在使用 JDBC 进行数据库操作时,需要手动编写大量的重复代码,如连接数据库、创建 Statement、执行 SQL 语句、处理结果集等。MyBatis 通过提供一个简单易用的 API,将这些繁琐的操作封装起来,使得开发人员可以更专注于业务逻辑的实现

  2. 提高 SQL 的可维护性:在传统的数据库开发中,SQL 语句通常散布在 Java 代码中,导致代码的可读性和可维护性较差。MyBatis 通过将 SQL 语句与 Java 代码分离,使用 XML 或注解的方式来定义和管理 SQL,使得 SQL 语句可以更方便地修改和维护

  3. 支持灵活的映射方式:MyBatis 提供了多种映射方式,可以将查询结果映射为 Java 对象、Map、基本类型等。开发人员可以根据实际需求选择不同的映射方式,灵活地处理不同的数据结构

  4. 支持动态 SQL:MyBatis 具有强大的动态 SQL 功能,可以根据条件动态拼接 SQL 语句。这使得开发人员可以根据不同的查询条件生成不同的 SQL,提高查询的灵活性和效率

  5. 可扩展性:MyBatis 提供了丰富的插件机制,可以通过自定义插件来扩展和定制框架的功能。开发人员可以根据实际需求编写插件,实现自己的业务逻辑

( 2 ) 是什么

  • MyBatis 是一个开源的持久化框架,用于简化 Java 应用程序与关系型数据库的交互。它提供了一种将 SQL 语句与 Java 代码解耦的方式,通过 XML 文件或注解来定义和管理 SQL,使得开发人员可以更方便地进行数据库操作。
  • MyBatis 的核心思想是将 SQL 语句与 Java 对象之间的映射关系定义在 XML 文件或注解中,通过执行 SQL 语句来操作数据库并将结果映射为 Java 对象。开发人员只需要编写简单的 SQL 语句和相应的映射配置,MyBatis 就可以自动完成数据库的访问和结果的映射,大大简化了数据库操作的编码工作。
  • MyBatis 提供了丰富的映射方式,可以将查询结果映射为 Java 对象、Map、基本类型等。它支持常见的 CRUD 操作(增删改查),同时还提供了动态 SQL 的支持,可以根据条件动态拼接 SQL 语句。此外,MyBatis 还提供了插件机制,可以通过编写插件来扩展和增强 MyBatis 的功能。

( 3 ) 作用

MyBatis 的主要作用是简化 Java 应用程序与关系型数据库的交互,提供了一种将 SQL 语句与 Java 代码解耦的方式,使得开发人员可以更方便地进行数据库操作。以下是 MyBatis 的主要作用:

  • 1. 数据库访问:MyBatis 提供了简洁的 API,封装了繁琐的 JDBC 操作,使得开发人员可以更专注于业务逻辑的实现。通过编写 SQL 语句和相应的映射配置,MyBatis 可以自动完成数据库的访问和结果的映射。
  • 2. SQL 映射:MyBatis 支持将查询结果映射为 Java 对象、Map、基本类型等。开发人员可以通过编写 XML 文件或注解来定义和管理 SQL 语句与 Java 对象之间的映射关系,使得数据库操作更加灵活和易于维护。
  • 3. 动态 SQL:MyBatis 支持动态 SQL,可以根据条件动态拼接 SQL 语句。开发人员可以通过条件判断、循环和迭代等方式灵活组合 SQL 片段,实现动态的查询和更新操作,提高查询的灵活性和效率。
  • 4. 事务管理:MyBatis 提供了事务管理的支持,可以通过配置来管理事务的提交、回滚和隔离级别。开发人员可以使用 MyBatis 提供的事务管理功能来确保数据库操作的一致性和完整性。
  • 5. 插件扩展:MyBatis 提供了插件机制,开发人员可以编写插件来扩展和增强 MyBatis 的功能。通过插件机制,可以在 SQL 执行前后进行拦截和增强,实现自定义的业务逻辑,例如日志记录、缓存处理等。

总之,MyBatis 主要用于简化数据库操作,提供了灵活的 SQL 映射和动态 SQL 支持,使得开发人员可以更轻松地进行数据库访问和操作。同时,MyBatis 还提供了事务管理和插件扩展等功能,满足不同的业务需求

二、MyBatis环境搭建

创建一个maven项目,名为:mybatis

 

 

   可以根据本人的项目结构进行创建包(比较规范),当然也可以根据自己的习惯进行修改 

 2.1 pom.xml修改

之后修改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>org.example</groupId>
  <artifactId>mybatis</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>mybatis Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <dependencies>
    <!-- ********************** junit单元测试依赖 ********************** -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
<!--      <scope>test</scope>-->
    </dependency>

    <!-- ********************** Java Servlet API  ********************** -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.0</version>
      <scope>provided</scope>
    </dependency>

    <!-- ********************** Mybatis依赖 ********************** -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.4.5</version>
    </dependency>

    <!-- ********************** Mysql JDBC驱动 ********************** -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.44</version>
    </dependency>

    <!-- **********************  日志配置  ********************** -->
    <!--记得修改mybatis.cfg.xml添加如下内容-->
    <!--<setting name="logImpl" value="LOG4J2"/>-->
    <!--核心log4j2jar包-->
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-core</artifactId>
      <version>2.9.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-api</artifactId>
      <version>2.9.1</version>
    </dependency>
    <!--web工程需要包含log4j-web,非web工程不需要-->
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-web</artifactId>
      <version>2.9.1</version>
    </dependency>
  </dependencies>

  <build>
    <finalName>mybatis</finalName>
    <resources>
      <!--解决mybatis-generator-maven-plugin运行时没有将XxxMapper.xml文件放入target文件夹的问题-->
      <resource>
        <directory>src/main/java</directory>
        <includes>
          <include>**/*.xml</include>
        </includes>
      </resource>
      <!--解决mybatis-generator-maven-plugin运行时没有将jdbc.properites文件放入target文件夹的问题-->
      <resource>
        <directory>src/main/resources</directory>
        <includes>
          <include>jdbc.properties</include>
          <include>*.xml</include>
        </includes>
      </resource>
    </resources>
      <plugins>

        <plugin>
          <groupId>org.mybatis.generator</groupId>
          <artifactId>mybatis-generator-maven-plugin</artifactId>
          <version>1.3.2</version>
          <dependencies>
            <!--使用Mybatis-generator插件不能使用太高版本的mysql驱动 -->
            <dependency>
              <groupId>mysql</groupId>
              <artifactId>mysql-connector-java</artifactId>
              <version>5.1.44</version>
            </dependency>
          </dependencies>
          <configuration>
            <overwrite>true</overwrite>
          </configuration>
        </plugin>

        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.2.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
      </plugins>
  </build>
</project>

2.2 jdbc.properties

jdbc.properties配置文件:用于输入数据库的用户密码(注意:该配置文件的首字母不能大写) 

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://47.100.191.44:3308/mybatis_ssm?useUnicode=true&characterEncoding=UTF-8
jdbc.username=test01
jdbc.password=test01

其中47.100.191.44是连接名称,mybatis_ssm是里面的数据库,username,password就是

连接的账号及密码。

2.3 web.xml

找到maven项目中webapp下WEB-INF的web.xml配置JSP文件修改为:3.1

<!-- 修改web.xml由2.3至3.0 -->
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
  <display-name>Archetype Created Web Application</display-name>
</web-app>

2.4 插件下载

想更好的了解这些插件可以: 点击此处

下载这些插件前都需要先选中File,之后再点击Settings,进入到以下界面:

2.4.1 Free mybatis plugin

在输入框里面输入关键字即可,找到MyBatisX后点击install进行插件下载,如图:

 

2.4.2 Mybatis generator

输入关键字,找到Mybatis generator点击install进行插件下载,如图:

 

2.4.3 mybatis tools

输入关键字,找到mybatis tools点击install进行插件下载,如图:

 

2.4.4 maven helper

输入关键字,找到maven helper点击install进行插件下载,如图:

这个插件的作用是查看项目里面引用的所有引用文件,由引用冲突还可以进行解决

 

                     下载安装这些插件后,需要idea重启才能进行使用

 2.5 mybatis.cfg.xml

在resources文件中创建mybatis.cfg.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>
    <!-- 引入外部配置文件 -->
    <properties resource="jdbc.properties"/>

    <settings>
        <setting name="logImpl" value="LOG4J2"/>
    </settings>

    <!-- 别名 -->
    <typeAliases>
        <!--<typeAlias type="com.javaxl.model.Book" alias="Book"/>-->
    </typeAliases>

    <!-- 配置mybatis运行环境 -->
    <environments default="development">
        <environment id="development">
            <!-- type="JDBC" 代表使用JDBC的提交和回滚来管理事务 -->
            <transactionManager type="jdbc"/>

            <!-- mybatis提供了3种数据源类型,分别是:POOLED,UNPOOLED,JNDI -->
            <!-- POOLED 表示支持JDBC数据源连接池 -->
            <!-- UNPOOLED 表示不支持数据源连接池 -->
            <!-- JNDI 表示支持外部数据源连接池 -->
            <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/CloudJun/mapper/BookMapper.xml"/>
    </mappers>
</configuration>

三、MyBatis的CRUD

3.1 generatorConfig.xml

在resources文件中创建generatorConfig.xml配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
<generatorConfiguration>
    <!-- 引入配置文件 -->
    <properties resource="jdbc.properties"/>

    <!--指定数据库jdbc驱动jar包的位置-->
    <classPathEntry location="D:\\temp\\mvn_repository\\mysql\\mysql-connector-java\\5.1.44\\mysql-connector-java-5.1.44.jar"/>

    <!-- 一个数据库一个context -->
    <context id="infoGuardian">
        <!-- 注释 -->
        <commentGenerator>
            <property name="suppressAllComments" value="true"/><!-- 是否取消注释 -->
            <property name="suppressDate" value="true"/> <!-- 是否生成注释代时间戳 -->
        </commentGenerator>

        <!-- jdbc连接 -->
        <jdbcConnection driverClass="${jdbc.driver}"
                        connectionURL="${jdbc.url}" userId="${jdbc.username}" password="${jdbc.password}"/>

        <!-- 类型转换 -->
        <javaTypeResolver>
            <!-- 是否使用bigDecimal, false可自动转化以下类型(Long, Integer, Short, etc.) -->
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!-- 01 指定javaBean生成的位置 -->
        <!-- targetPackage:指定生成的model生成所在的包名 -->
        <!-- targetProject:指定在该项目下所在的路径  -->
        <javaModelGenerator targetPackage="com.CloudJun.model"
                            targetProject="src/main/java">
            <!-- 是否允许子包,即targetPackage.schemaName.tableName -->
            <property name="enableSubPackages" value="false"/>
            <!-- 是否对model添加构造函数 -->
            <property name="constructorBased" value="true"/>
            <!-- 是否针对string类型的字段在set的时候进行trim调用 -->
            <property name="trimStrings" value="false"/>
            <!-- 建立的Model对象是否 不可改变  即生成的Model对象不会有 setter方法,只有构造方法 -->
            <property name="immutable" value="false"/>
        </javaModelGenerator>

        <!-- 02 指定sql映射文件生成的位置 -->
        <sqlMapGenerator targetPackage="com.CloudJun.mapper"
                         targetProject="src/main/java">
            <!-- 是否允许子包,即targetPackage.schemaName.tableName -->
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>

        <!-- 03 生成XxxMapper接口 -->
        <!-- type="ANNOTATEDMAPPER",生成Java Model 和基于注解的Mapper对象 -->
        <!-- type="MIXEDMAPPER",生成基于注解的Java Model 和相应的Mapper对象 -->
        <!-- type="XMLMAPPER",生成SQLMap XML文件和独立的Mapper接口 -->
        <javaClientGenerator targetPackage="com.CloudJun.mapper"
                             targetProject="src/main/java" type="XMLMAPPER">
            <!-- 是否在当前路径下新加一层schema,false路径com.oop.eksp.user.model, true:com.oop.eksp.user.model.[schemaName] -->
            <property name="enableSubPackages" value="false"/>
        </javaClientGenerator>

        <!-- 配置表信息 -->
        <!-- schema即为数据库名 -->
        <!-- tableName为对应的数据库表 -->
        <!-- domainObjectName是要生成的实体类 -->
        <!-- enable*ByExample是否生成 example类 -->
        <!--<table schema="" tableName="t_book" domainObjectName="Book"-->
        <!--enableCountByExample="false" enableDeleteByExample="false"-->
        <!--enableSelectByExample="false" enableUpdateByExample="false">-->
        <!--&lt;!&ndash; 忽略列,不生成bean 字段 &ndash;&gt;-->
        <!--&lt;!&ndash; <ignoreColumn column="FRED" /> &ndash;&gt;-->
        <!--&lt;!&ndash; 指定列的java数据类型 &ndash;&gt;-->
        <!--&lt;!&ndash; <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> &ndash;&gt;-->
        <!--</table>-->

        <table schema="" tableName="t_mvc_book" domainObjectName="Book"
               enableCountByExample="false" enableDeleteByExample="false"
               enableSelectByExample="false" enableUpdateByExample="false">
            <!-- 忽略列,不生成bean 字段 -->
            <!-- <ignoreColumn column="FRED" /> -->
            <!-- 指定列的java数据类型 -->
            <!-- <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> -->
        </table>

    </context>
</generatorConfiguration>

注意点: 

1 、

<!--指定数据库jdbc驱动jar包的位置--> <classPathEntry location="D:\\temp\\mvn_repository\\mysql\\mysql-connector-java\\5.1.44\\mysql-connector-java-5.1.44.jar"/>

location的目录

这里的jar包目录是你本地下载maven引用文件的地址

在里面查找mysql-connector-java-5.1.44.jar的文件

2、

<!-- targetProject:指定在该项目下所在的路径 -->

<javaModelGenerator targetPackage="com.CloudJun.model" targetProject="src/main/java">

targetPackage中的字符串

这里要将指定生成的model在该项目中的指定包名,如果没有该包会自动创建

3、

<!-- 02 指定sql映射文件生成的位置 --> <sqlMapGenerator targetPackage="com.CloudJun.mapper" targetProject="src/main/java"> <!-- 是否允许子包,即targetPackage.schemaName.tableName --> <property name="enableSubPackages" value="false"/> </sqlMapGenerator>

targetPackage的字符串

这里是你想将要生成的Sql映射文件放到哪个包下,如果没有该包会自动创建

4、

<!-- type="XMLMAPPER",生成SQLMap XML文件和独立的Mapper接口 --> <javaClientGenerator targetPackage="com.CloudJun.mapper" targetProject="src/main/java" type="XMLMAPPER"> <!-- 是否在当前路径下新加一层schema,false路径com.oop.eksp.user.model, true:com.oop.eksp.user.model.[schemaName] --> <property name="enableSubPackages" value="false"/> </javaClientGenerator>

targetPackage中的字符串

这里是你想将要生成的独立的Mapper接口放到哪个包下,如果没有该包会自动创建

5、

<table schema="" tableName="t_mvc_book" domainObjectName="Book" enableCountByExample="false" enableDeleteByExample="false" enableSelectByExample="false" enableUpdateByExample="false"> <!-- 忽略列,不生成bean 字段 --> <!-- <ignoreColumn column="FRED" /> --> <!-- 指定列的java数据类型 --> <!-- <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> --> </table>

tableName中的字符串

这里是填写要自动生成的实体类对哪个数据表进行创建实体(对象)

 domainObjectName 是要生成的实体名称

如果想创建多个只需复制这段在进行粘贴

修改其中的数据表名称及实体类名称即可

在这里配置完成之后就可以自动生成增删改查的代码了

打开右侧的Maven点击我们引用的插件进行双击后将自动生成

   注意: 需要选中本次创建的项目进行查找该架包

3.2 BookService

创建BookService这个工具类:进行数据库访问以及SqlSession的赋值

package com.CloudJun.utils;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
/**
 * @author CloudJun
 * @create  2023-08-19 20:36
 */
public class SessionUtil {
    private static SqlSessionFactory sessionFactory;
    private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();
    static {
        sessionFactory = new SqlSessionFactoryBuilder().build(SessionUtil.class.getResourceAsStream("/mybatis.cfg.xml"));
    }

    public static SqlSession openSession() {
        SqlSession session = threadLocal.get();
        if (null == session) {
            session = sessionFactory.openSession();
            threadLocal.set(session);
        }
        return session;
    }

    public static void main(String[] args) {
        SqlSession session = openSession();
        System.out.println(session.getConnection());
        session.close();
//        System.out.println(session.getConnection());
    }
}

3.3 接口及实现类

BookBiz接口

package com.CloudJun.biz;

import com.CloudJun.model.Book;
/**
 * @author CloudJun
 * @create  2023-08-19 20:40
 */
public interface BookBiz {

    int deleteByPrimaryKey(Integer bid);

    int insert(Book record);

    int insertSelective(Book record);

    Book selectByPrimaryKey(Integer bid);

    int updateByPrimaryKeySelective(Book record);

    int updateByPrimaryKey(Book record);
}

BookBizImpl实现类

package com.CloudJun.biz.impl;

import com.CloudJun.biz.BookBiz;
import com.CloudJun.mapper.BookMapper;
import com.CloudJun.model.Book;

/**
 * @author CloudJun
 * @create  2023-08-19 20:41
 */
public class BookBizImpl implements BookBiz {

    private BookMapper bookMapper;

    public BookMapper getBookMapper() {
        return bookMapper;
    }
    public void setBookMapper(BookMapper bookMapper) {
        this.bookMapper = bookMapper;
    }

    @Override
    public int deleteByPrimaryKey(Integer bid) {
        return bookMapper.deleteByPrimaryKey(bid);
    }

    @Override
    public int insert(Book record) {
        return bookMapper.insert(record);
    }

    @Override
    public int insertSelective(Book record) {
        return bookMapper.insertSelective(record);
    }

    @Override
    public Book selectByPrimaryKey(Integer bid) {
        return bookMapper.selectByPrimaryKey(bid);
    }

    @Override
    public int updateByPrimaryKeySelective(Book record) {
        return bookMapper.updateByPrimaryKeySelective(record);
    }

    @Override
    public int updateByPrimaryKey(Book record) {
        return bookMapper.updateByPrimaryKey(record);
    }
}

3.4 log4j2.xml

在resources文件中创建log4j2.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>

<!-- status : 指定log4j本身的打印日志的级别.ALL< Trace < DEBUG < INFO < WARN < ERROR 
	< FATAL < OFF。 monitorInterval : 用于指定log4j自动重新配置的监测间隔时间,单位是s,最小是5s. -->
<Configuration status="WARN" monitorInterval="30">
	<Properties>
		<!-- 配置日志文件输出目录 ${sys:user.home} -->
		<Property name="LOG_HOME">/root/workspace/lucenedemo/logs</Property>
		<property name="ERROR_LOG_FILE_NAME">/root/workspace/lucenedemo/logs/error</property>
		<property name="WARN_LOG_FILE_NAME">/root/workspace/lucenedemo/logs/warn</property>
		<property name="PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t-%L] %-5level %logger{36} - %msg%n</property>
	</Properties>

	<Appenders>
		<!--这个输出控制台的配置 -->
		<Console name="Console" target="SYSTEM_OUT">
			<!-- 控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
			<ThresholdFilter level="trace" onMatch="ACCEPT"
				onMismatch="DENY" />
			<!-- 输出日志的格式 -->
			<!-- %d{yyyy-MM-dd HH:mm:ss, SSS} : 日志生产时间 %p : 日志输出格式 %c : logger的名称 
				%m : 日志内容,即 logger.info("message") %n : 换行符 %C : Java类名 %L : 日志输出所在行数 %M 
				: 日志输出所在方法名 hostName : 本地机器名 hostAddress : 本地ip地址 -->
			<PatternLayout pattern="${PATTERN}" />
		</Console>

		<!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用 -->
		<!--append为TRUE表示消息增加到指定文件中,false表示消息覆盖指定的文件内容,默认值是true -->
		<File name="log" fileName="logs/test.log" append="false">
			<PatternLayout
				pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
		</File>
		<!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size, 则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档 -->
		<RollingFile name="RollingFileInfo" fileName="${LOG_HOME}/info.log"
			filePattern="${LOG_HOME}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
			<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
			<ThresholdFilter level="info" onMatch="ACCEPT"
				onMismatch="DENY" />
			<PatternLayout
				pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
			<Policies>
				<!-- 基于时间的滚动策略,interval属性用来指定多久滚动一次,默认是1 hour。 modulate=true用来调整时间:比如现在是早上3am,interval是4,那么第一次滚动是在4am,接着是8am,12am...而不是7am. -->
				<!-- 关键点在于 filePattern后的日期格式,以及TimeBasedTriggeringPolicy的interval, 日期格式精确到哪一位,interval也精确到哪一个单位 -->
				<!-- log4j2的按天分日志文件 : info-%d{yyyy-MM-dd}-%i.log -->
				<TimeBasedTriggeringPolicy interval="1"
					modulate="true" />
				<!-- SizeBasedTriggeringPolicy:Policies子节点, 基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小. -->
				<!-- <SizeBasedTriggeringPolicy size="2 kB" /> -->
			</Policies>
		</RollingFile>

		<RollingFile name="RollingFileWarn" fileName="${WARN_LOG_FILE_NAME}/warn.log"
			filePattern="${WARN_LOG_FILE_NAME}/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
			<ThresholdFilter level="warn" onMatch="ACCEPT"
				onMismatch="DENY" />
			<PatternLayout
				pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
			<Policies>
				<TimeBasedTriggeringPolicy />
				<SizeBasedTriggeringPolicy size="2 kB" />
			</Policies>
			<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
			<DefaultRolloverStrategy max="20" />
		</RollingFile>

		<RollingFile name="RollingFileError" fileName="${ERROR_LOG_FILE_NAME}/error.log"
			filePattern="${ERROR_LOG_FILE_NAME}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd-HH-mm}-%i.log">
			<ThresholdFilter level="error" onMatch="ACCEPT"
				onMismatch="DENY" />
			<PatternLayout
				pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
			<Policies>
				<!-- log4j2的按分钟 分日志文件 : warn-%d{yyyy-MM-dd-HH-mm}-%i.log -->
				<TimeBasedTriggeringPolicy interval="1"
					modulate="true" />
				<!-- <SizeBasedTriggeringPolicy size="10 MB" /> -->
			</Policies>
		</RollingFile>

	</Appenders>

	<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效 -->
	<Loggers>
		<!--过滤掉spring和mybatis的一些无用的DEBUG信息 -->
		<logger name="org.springframework" level="INFO"></logger>
		<logger name="org.mybatis" level="INFO"></logger>

		<!-- 第三方日志系统 -->
		<logger name="org.springframework" level="ERROR" />
		<logger name="org.hibernate" level="ERROR" />
		<logger name="org.apache.struts2" level="ERROR" />
		<logger name="com.opensymphony.xwork2" level="ERROR" />
		<logger name="org.jboss" level="ERROR" />


		<!-- 配置日志的根节点 -->
		<root level="all">
			<appender-ref ref="Console" />
			<appender-ref ref="RollingFileInfo" />
			<appender-ref ref="RollingFileWarn" />
			<appender-ref ref="RollingFileError" />
		</root>

	</Loggers>

</Configuration>

3.5 测试类

创建一个Demo进行方法测试

package com.CloudJun.Demo;

import com.CloudJun.biz.BookBiz;
import com.CloudJun.biz.impl.BookBizImpl;
import com.CloudJun.mapper.BookMapper;
import com.CloudJun.model.Book;
import com.CloudJun.utils.SessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

/**
 * @author CloudJun
 * @create  2023-08-19 20:36
 */
public class Demo {

    private SqlSession sqlSession;
    private BookBiz bookBiz;

    @Before
    public void Before(){
        System.out.println("方法执行前会调用(有些像前置通知的意思)");
        //数据库的连接及bookBiz的赋值
        sqlSession = SessionUtil.openSession();
        BookBizImpl bookBiz = new BookBizImpl();
        BookMapper mapper = sqlSession.getMapper(BookMapper.class);
        bookBiz.setBookMapper(mapper);
        this.bookBiz = bookBiz;
    }

    @After
    public void After(){
        System.out.println("方法执行后会调用(有些像后置通知的意思)");
        sqlSession.commit();//事务的提交
    }


    @Test
    public void text(){
        System.out.println("方法测试");
        Book book = bookBiz.selectByPrimaryKey(30);
        System.out.println(book);

    }

    @Test
    public void del(){
        bookBiz.deleteByPrimaryKey(28);
    }



}

执行其中的text查看方法,测试结果:

执行其中的del删除方法,之后我们查看数据库,测试结果: 

 

给我们带来的收获

学习 MyBatis 后,你可以获得以下收获:

  • 1. 提高数据库操作效率:MyBatis 封装了繁琐的 JDBC 操作,提供了简洁的 API,使得数据库操作更加方便和高效。你可以通过 MyBatis 快速编写和执行 SQL 语句,减少了手动编写和管理 SQL 的工作量,提高了数据库操作的效率。
  • 2. 简化开发流程:MyBatis 的 SQL 映射方式将 SQL 语句与 Java 代码解耦,使得开发人员可以更专注于业务逻辑的实现。你可以通过编写 XML 文件或注解来管理 SQL 语句与 Java 对象之间的映射关系,简化了开发流程,提高了开发效率。
  • 3. 提高代码质量:MyBatis 的 SQL 映射方式和动态 SQL 支持使得数据库操作更加灵活和易于维护。你可以根据业务需求动态拼接 SQL 语句,减少了冗余代码的编写。同时,通过将 SQL 语句和 Java 代码解耦,你可以更好地组织和管理代码,提高了代码的可读性和可维护性。
  • 4. 增强功能扩展能力:MyBatis 提供了插件机制,你可以编写插件来扩展和增强 MyBatis 的功能。通过插件机制,你可以在 SQL 执行前后进行拦截和增强,实现自定义的业务逻辑。这使得你可以根据具体需求扩展 MyBatis 的功能,满足特定的业务需求。
  • 5. 掌握常用持久化框架:MyBatis 是目前广泛使用的 Java 持久化框架之一,学习 MyBatis 可以帮助你掌握常用的持久化框架。这对于从事 Java 后端开发的人员来说是一项重要的技能,能够提升你的就业竞争力。

 

总之,学习 MyBatis 可以带给你数据库操作效率的提升、开发流程的简化、代码质量的提高、功能扩展能力的增强,同时也能够掌握常用的持久化框架,为你的职业发展带来积极的影响