MyBatis——MyBatis入门程序

一、数据准备

二、开发步骤 

1、引入依赖 

<dependencies>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.15</version>
    </dependency>

    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
        <version>8.2.0</version>
    </dependency>
</dependencies>

2、编写核心配置文件: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>
    <!--
        允许设置多个环境,但是每个 SqlSessionFactory 实例只能选择一种环境
        设置默认的环境:development
    -->
    <environments default="development">
        <!-- 环境配置,名称为:development -->
        <environment id="development">
            <!-- 配置事物管理器为 JDBC -->
            <transactionManager type="JDBC"/>
            <!-- 配置数据源 -->
            <dataSource type="POOLED">
                <!-- 配置数据库连接信息 -->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatisdb"/>
                <property name="username" value="root"/>
                <property name="password" value="mysql"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <!-- 指定 XxxMapper.xml 文件 -->
        <mapper resource="CarMapper.xml"/>
    </mappers>
</configuration>

3、编写 XxxMapper.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="qiuXuan">
    <!--id就代表了下面的这条sql语句-->
    <insert id="insertCar">
        insert into t_car(id,car_num,brand,guide_price,produce_time,car_type)
        values(null,'1003','五菱宏光',30.0,'2020-09-18','燃油车');
    </insert>
</mapper>

4、在 mybatis-config.xml 文件中指定 XxxMapper.xml 文件的路径

 5、编写 MyBatis 程序

  • 在 MyBatis 当中 SqlSession 负责 SQL 语句的执行,是 Java 程序与数据库之间的会话

  • 要获取 SqlSession 对象,需要先获取 SqlSessionFactory 对象,通过 SqlSessionFactory 工厂来生产 SqlSession 对象

如何获取 SqlSessionFactory 对象?

通过 SqlSessionFactoryBuilder 对象的 build 方法获取一个 SqlSessionFactory 对象

SqlSessionFactoryBuilder ---> SqlSessionFactory ---> SqlSession  

package com.qiuxuan;

public class MyBatisIntroductionTest {
    public static void main(String[] args) throws IOException {
        // 获取 SqlSessionFactoryBuilder
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();

        /**
         * 获取 SqlSessionFactory
         *
         * build 方法的参数为一个 InputStream
         * 指向 mybatis-config.xml 核心配置文件
         *
         * 可以通过 MyBatis 的 Resources 工具类获取
         * 其 getResourceAsStream 方法返回的就是一个 InputStream
         * 参数为核心配置文件路径(默认从类根路径[resources]查找资源)
         */
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory factory = builder.build(is);

        // 获取 SqlSession
        SqlSession sqlSession = factory.openSession();

        // 执行 SQL 语句(参数为 SQL 语句的 id)
        int count = sqlSession.insert("insertCar");

        System.out.println(count);

        // mybatis 默认是不会自动提交的,需要手动提交
        sqlSession.commit();
    }
}

三、MyBatis 中有两个主要的配置文件

  • mybatis-config.xml(一个)

    • 核心配置文件,主要配置连接数据库的信息等

  • XxxMapper.xml(一个表一个)

    • 用于编写 SQL 语句的配置文件

四、Tips 

mybatis 中 sql 语句的结尾 “;” 可以省略

使用 Resources.getResourceAsStream 获取资源文件的方式符合 OCP 原则,有利于程序的移植性、健壮性

若使用 FileInputStream 方式获取资源文件,当程序需要在其他系统运行时,原来的路径将会失效,需要修改 Java 代码中的资源路径,违背了 OCP 原则

也可使用类加载器获取资源:

ClassLoader.getSystemClassLoader().getResourceAsStream("资源路径");

Resources.getResourceAsStream 一致,都是从根路径获取资源,即 resources 目录下

ClassLoader.getSystemClassLoader() 获取的是系统类加载器,而 Resources.getResourceAsStream 底层使用的就是 ClassLoader.getSystemClassLoader()

五、MyBatis 的事务管理机制 

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

<transactionManager type="JDBC"/>

type 属性包括两个值:JDBC、 MANAGED,对应两种事务管理机制

  • JDBC 事务管理器

    • MyBatis 框架自己采用管理事务,自己采用原生的 JDBC 代码去管理事务

    • 使用 JDBC 事务管理器底层创建事务管理对象的是 JdbcTransation 对象

conn.setAutoCommit(false); 开启事务

若使用 JDBC 事务管理器,在 factory.openSession() 底层会执行此语句

若使用 factory.openSession() 时传入参数 true,则底层不会执行 conn.AutoCommit(false),也就不会开启事务,此时执行任意 DML 语句都会自动提交

业务处理...

conn.commit(); 提交事务

  • MANAGED 事务管理器

    • mybatis 不再负责事务的管理了,事务管理交给其他容器负责,例如:Spring

六、较完整的 MyBatis 程序 

package com.qiuxuan;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class MyBatisCompleteCodeTest {
    public static void main(String[] args) {
        SqlSession sqlSession = null;
        try {
            // 1.创建SqlSessionFactoryBuilder对象
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
            // 2.创建SqlSessionFactory对象
            SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));
            // 3.创建SqlSession对象
            sqlSession = sqlSessionFactory.openSession();
            // 4.执行SQL
            int count = sqlSession.insert("insertCar");
            System.out.println("更新了几条记录:" + count);
            // 5.提交
            sqlSession.commit();
        } catch (Exception e) {
            // 回滚
            if (sqlSession != null) {
                sqlSession.rollback();
            }
            e.printStackTrace();
        } finally {
            // 6.关闭
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    }
}

七、Junit 单元测试 

JUnit 是专门做单元测试的组件。

  • 在实际开发中,单元测试一般是由我们 Java 程序员来完成的。

    • 要对自己写的每一个业务方法负责任,要保证每个业务方法在进行测试的时候都能通过。

  • 测试的过程中涉及到两个概念:

    • 期望值

    • 实际值

  • 期望值和实际值相同表示测试通过,期望值和实际值不同则单元测试执行时会报错。

1、引入依赖 

<!-- junit依赖 -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13.2</version>
    <scope>test</scope>
</dependency>

 2、编写单元测试类【测试用例】

测试用例中每一个测试方法上使用 @Test 注解进行标注。

测试用例的名字以及每个测试方法的定义都是有规范的:

  1. 测试用例的名字:XxxTest

  2. 测试方法声明格式:public void test业务方法名(){}

// 测试用例
public class CarMapperTest{
    
    // 测试方法
    @Test
    public void testInsert(){}
    
    @Test
    public void testUpdate(){}
    
}

可以在类上执行,也可以在方法上执行

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

  • 在方法上执行时,只执行当前的测试方法。

  • 编写一个测试用例,来测试 insertCar 业务

public class CarMapperTest {
    @Test
    public void testInsertCar(){
        SqlSession sqlSession = null;
        try {
            // 1.创建SqlSessionFactoryBuilder对象
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
            // 2.创建SqlSessionFactory对象
            SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));
            // 3.创建SqlSession对象
            sqlSession = sqlSessionFactory.openSession();
            // 4.执行SQL
            int count = sqlSession.insert("insertCar");
            System.out.println("更新了几条记录:" + count);
            // 5.提交
            sqlSession.commit();
        } catch (Exception e) {
            // 回滚
            if (sqlSession != null) {
                sqlSession.rollback();
            }
            e.printStackTrace();
        } finally {
            // 6.关闭
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    }
}

八、logback 日志框架 

  • 引入日志框架的目的是为了看清楚 mybatis 执行的具体 sql。

  • 启用标准日志组件,只需要在 mybatis-config.xml 文件中添加以下配置:【可参考 mybatis 手册】

mybatis-config.xml

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

注意:<configuration> 里配置的位置是有顺序要求的,否则会报错

Error creating document instance. Cause: org.xml.sax.SAXParseException;

<configuration>
    <properties>...</properties>
    <settings>...</settings>
    <typeAliases>...</typeAliases>
    <typeHandlers>...</typeHandlers>
    <objectFactory>...</objectFactory>
    <objectWrapperFactory>...</objectWrapperFactory>
    <reflectorFactory>...</reflectorFactory>
    <plugins>...</plugins>
    <environments>...</environments>
    <databaseIdProvider>...</databaseIdProvider>
    <mappers>...</mappers>
</configuration>

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

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

  • 引入 logback 相关依赖

<dependency>
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback-classic</artifactId>
  <version>1.2.11</version>
  <scope>test</scope>
</dependency>
  • 引入 logback 相关配置文件(文件名叫做 logback.xml 或 logback-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>

九、MyBatis 工具类 SqlSessionUtil 的封装

 每一次获取 SqlSession 对象代码太繁琐,封装一个工具类

/**
 * MyBatis工具类
 *
 * @author 秋玄
 * @version 1.0.0
 * @since 1.0.0
 */
public class SqlSessionUtil {
    private static final SqlSessionFactory sqlSessionFactory;

    /**
     * 类加载时初始化sqlSessionFactory对象
     */
    static {
        try {
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
            sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 每调用一次openSession()可获取一个新的会话,该会话支持自动提交。
     *
     * @return 新的会话对象
     */
    public static SqlSession openSession() {
        return sqlSessionFactory.openSession(true);
    }
}

一  叶  知  秋,奥  妙  玄  心

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/612558.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何打开远程桌面连接?

远程桌面连接是一项强大的功能&#xff0c;它允许我们远程访问其他计算机&#xff0c;并在远程计算机上进行操作。这对于远程办公、技术支持和远程培训等场景非常有用。本文将介绍如何在不同操作系统中打开远程桌面连接。 Windows系统 在Windows操作系统中&#xff0c;打开远程…

算法练习day7

四数相加II 代码随想录 0454.四数相加II 454. 四数相加 II - 力扣&#xff08;LeetCode&#xff09; &#xff08;用时&#xff1a;0.5小时&#xff09; 思路 本道题是需要在四个数组中&#xff0c;各找一个数&#xff0c;这些数加起来能够等于0&#xff0c;那么就是答案元…

mysql基础概念

文章目录 登录mysqlmysql和mysqld数据库操作主流数据库MYSQL架构SQL分类 登录mysql 登录mysql连接服务器&#xff0c;mysql连接时可以指明主机用-h选项&#xff0c;然后就可以指定主机Ip地址&#xff0c;-P可以指定端口号 -u指定登录用户 -P指定登录密码 查看系统中有无mysql&…

【系统架构师】-选择题(十二)计算机网络

1、网闸的作用&#xff1a;实现内网与互联网通信&#xff0c;但内网与互联网不是直连的 2、管理距离是指一种路由协议的路由可信度。15表示该路由信息比较可靠 管理距离越小&#xff0c;它的优先级就越高&#xff0c;也就是可信度越高。 0是最可信赖的&#xff0c;而255则意味…

(Java)心得:LeetCode——11.盛最多水的容器

一、原题 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容…

【C++】CentOS环境搭建-安装CATCH2

【C】CentOS环境搭建-安装CATCH2 1.克隆Catch2仓库2. 进入Catch2目录3. 创建一个构建目录4. 使用CMake生成构建系统&#xff08;以及可能的编译&#xff09;5.安装Catch2&#xff08;可选&#xff0c;根据你的需求&#xff09; 1.克隆Catch2仓库 git clone https://github.com…

ansible部署lamp架构

搭建参考&#xff1a;ansible批量运维管理-CSDN博客 定义ansible主机清单 [rootansible-server ~]# vim /etc/hosts 192.168.200.129 host01 192.168.200.130 host02 [rootansible-server ~]# vim /etc/ansible/hosts [webserver] host01 host02 在ansible端编写index.html…

08.1.自定义图形

自定义图形 创建图形 随便选择几个参数直接添加 选择自定义折线图形查看

一键追爆款,GPT一键改文‌‍‬⁣⁡​⁤⁢​⁢⁡⁣‬‍‌​​‬ ​‍⁤‬ ‬⁡⁡⁡‍‌‬⁡⁡⁢‬⁤⁢⁢⁤​‍‌​​‬ ​⁣‌,绘唐3,绘唐工具

ai画影满足你的制作要求 一键追爆款&#xff0c;GPT一键改文 AI推文小说&漫画解说&解压混剪 人物定义&#xff0c;角色定义&#xff0c;lora转换&#xff0c;模型转换&#xff0c;可视化参考满足 一键追爆款 一键挂机生成&#xff0c;效果更精彩&#xff0c;使用更方…

苹果电脑怎么安装crossover 如何在Mac系统中安装CrossOver CrossOver Mac软件安装说明

很多Mac的新用户在使用电脑的过程中&#xff0c;常常会遇到很多应用软件不兼容的情况。加上自己以前一直都是用Windows系统&#xff0c;总觉得Mac系统用得很难上手。 其实&#xff0c;用户可以在Mac上安装CrossOver&#xff0c;它支持用户在Mac上运行Windows软件&#xff0c;例…

恶意软件正劫持安全软件更新进行分发

GuptiMiner 是一个高度复杂的威胁&#xff0c;最早在 2018 年发现&#xff0c;主要为了在大型企业中分发后门。一种是 PuTTY Link 的增强版本后门&#xff0c;能够针对本地网络进行 SMB 扫描&#xff0c;并通过网络横向移动到网络上其他可能易受攻击的 Windows 7 和 Windows Se…

如何给文件和文件夹添加备注信息

1. 给文件添加备注信息 1. 打开文件夹&#xff0c;点击查看 → 选项 → 更改文件夹和搜索选项 → 勾除隐藏受保护的操作系统文件 → 勾选显示隐藏的文件、文件夹和驱动器&#xff1b; 2. listary工具搜索desktop.ini&#xff0c;随便点击一个desktop.ini文件&#xff0c;即可…

线程同步--互斥锁,读写锁

线程同步 基本概念 线程的能力在于能够方便地通过全局变量或共享内存来交换信息&#xff0c;但这也带来了并发控制的复杂性&#xff0c;主要表现在如何安全地管理多个线程对共享资源的访问。这里涉及到几个关键的概念和技术&#xff1a; 临界区&#xff08;Critical Section…

走进C++:C到C++的过渡

目录 什么是C呢&#xff1f; C的发展史 多了一些吃前来很香的“语法糖”。 语法糖一&#xff1a;命名空间 命名空间有个强大的功能 如何使用 语法糖二&#xff1a;缺省参数 语法糖三&#xff1a;函数重载 语法糖四&#xff1a;引用 引用传参 引用返回 引用和…

算法学习011-不同的二叉查找树/搜索树 c++动态规划算法实现 中小学算法思维学习 信奥算法解析

目录 C不同的二叉查找树 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、运行结果 五、考点分析 六、推荐资料 C不同的二叉查找树 一、题目要求 1、编程实现 二叉查找树&#xff08;Binary Search Tree&#xff09;&#xff0c;&#xff08;…

AI图书推荐:ChatGPT全面指南—用AI帮你更健康、更富有、更智慧

你是否在努力改善你的健康&#xff1f; 你是否长期遭受财务困难&#xff1f; 你想丰富你的思想、身体和灵魂吗&#xff1f; 如果是这样&#xff0c;那么这本书就是为你准备的。 《ChatGPT全面指南—用AI帮你更健康、更富有、更智慧》&#xff08;CHATGPT Chronicles AQuick…

Mybatis-Plus常用的增删改查坑

添加依赖 <!--实体类上加上Data注解就不用写get&#xff0c;set&#xff0c;toString&#xff0c;equals等方法了--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional…

Three.js基础练习——渲染一个立方体

1.学习内容参考了 three.js入门教程--零基础也能学会_threejs菜鸟教程-CSDN博客 本章内容包含渲染立方体&#xff0c;并配合ui工具食用~ 2.效果图 import * as THREE from three import * as dat from dat.gui import { OrbitControls } from three/addons/controls/OrbitC…

ETL中如何执行Python脚本

Python的解读 Python 是一种高级、通用的编程语言&#xff0c;由荷兰程序员吉多范罗苏姆&#xff08;Guido van Rossum&#xff09;于1990年代初设计并发布。Python的设计哲学强调代码的可读性和简洁性&#xff0c;它的语法清晰且表达力强&#xff0c;使得开发者能够以更少的代…

中国各地级市的海拔标准差数据集

01、数据简介 海拔标准差是指对某个地点的海拔进行测量后&#xff0c;所得结果与平均海拔之间的差异。它反映了测量结果的离散程度&#xff0c;即海拔数据的可靠性。如果标准差较小&#xff0c;说明测量结果的可靠性较高&#xff1b;如果标准差较大&#xff0c;则说明测量结果…