跟着老杜学MyBatis+第2天+MyBatis入门程序

Posted yangbocsu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了跟着老杜学MyBatis+第2天+MyBatis入门程序相关的知识,希望对你有一定的参考价值。

跟着老杜学MyBatis+第2天+MyBatis入门程序

二、MyBatis入门程序

MyBatis 中文网:https://mybatis.net.cn/getting-started.html

语雀:https://www.yuque.com/docs/share/82677b3a-e06a-427f-9b5c-c33baed33a3f?#

密码:rs4n

只要你会JDBC,MyBatis就可以学。

2.1 版本

软件版本:

  • IntelliJ IDEA:2022.1.4
  • Navicat for mysql:16.0.14
  • MySQL数据库:8.0.30

组件版本:

  • MySQL驱动:8.0.30
  • MyBatis:3.5.10
  • JDK:Java17
  • JUnit:4.13.2
  • Logback:1.2.11

2.2 MyBatis下载

  • 从github上下载,地址:https://github.com/mybatis/mybatis-3

  • 将框架以及框架的源码都下载下来,下载框架后解压,打开mybatis目录

    • 通过以上解压可以看到,框架一般都是以jar包的形式存在。我们的mybatis课程使用maven,所以这个jar我们不需要。
    • 官方手册需要。

2.3 MyBatis入门程序开发步骤

  • 写代码前准备:

    • 准备数据库表:汽车表t_car,字段包括:
      • id:主键(自增)【bigint】
      • car_num:汽车编号【varchar】
      • brand:品牌【varchar】
      • guide_price:厂家指导价【decimal类型,专门为财务数据准备的类型】
      • produce_time:生产时间【char,年月日即可,10个长度,‘2022-10-11’】
      • car_type:汽车类型(燃油车、电车、氢能源)【varchar】
    • 使用navicat for mysql工具建表

t_car.sql

/*
 Navicat Premium Data Transfer

 Source Server         : localhost
 Source Server Type    : MySQL
 Source Server Version : 80016
 Source Host           : localhost:3306
 Source Schema         : powernode

 Target Server Type    : MySQL
 Target Server Version : 80016
 File Encoding         : 65001

 Date: 25/10/2022 22:03:16
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for t_car
-- ----------------------------
DROP TABLE IF EXISTS `t_car`;
CREATE TABLE `t_car`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自然主键,和业务没有关系,自增',
  `car_num` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '汽车编号',
  `brand` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '汽车品牌',
  `guide_price` decimal(10, 2) NULL DEFAULT NULL COMMENT '厂商指导价',
  `produce_time` char(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '生产日期',
  `car_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '汽车类型 燃油车 新能源',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 17 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

    • 使用navicat for mysql工具向t_car表中插入两条数据,如下:
    • 创建Project:建议创建Empty Project,设置Java版本以及编译版本等。
    • 设置IDEA的maven
    • 创建Module:普通的Maven Java模块
  • 步骤1:打包方式:jar(不需要war,因为mybatis封装的是jdbc。)

<groupId>com.powernode</groupId>
<artifactId>mybatis-001-introduction</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
  • 步骤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>
  • 步骤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="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!--sql映射文件创建好之后,需要将该文件路径配置到这里-->
        <mapper resource=""/>
    </mappers>
</configuration>

注意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">
<!--namespace先随意写一个-->
<mapper namespace="car">
    <!--insert sql:保存一个汽车信息-->
    <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:sql语句最后结尾可以不写“;”

注意2:CarMapper.xml文件的名字不是固定的。可以使用其它名字。

注意3:CarMapper.xml文件的位置也是随意的。这里选择放在resources根下,相当于放到了类的根路径下。

注意4:将CarMapper.xml文件路径配置到mybatis-config.xml:

<mapper resource="CarMapper.xml"/>
  • 步骤5:编写MyBatisIntroductionTest代码
package cn.yangbocsu.mybatis.test;

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 java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

/**
 * @author yangbocsu
 * @create 2022/10/16:07
 * @projectName mybatis
 */
public class MyBatisIntroductionTest 
    public static void main(String[] args) throws IOException 
        // 1. 获取 SqlSessionFactoryBuilder 对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();

        // 2. 获取 SqlSessionFactory 对象
            // InputStream is = new FileInputStream("mybatis-config.xml");
            // InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("mybatis-config.xml");
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml"); // Resources.getResourceAsStream 默认从类的根路径下查找资源
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is); // 一般情况下都是一个数据库对应一个SqLSessionFactory对象。


        // 3. 获取 SqlSession 对象
        SqlSession sqlSession = sqlSessionFactory.openSession();

        // 4. 执行 sql 语句
        int count = sqlSession.insert("insertCar");  // 返回值是影响数据库表当中的记录条数。
        System.out.println("插入了几条记录?:" + count);

        // 5. 提交(mybatis默认采用的事务管理器是JDBC,默认是不提交的,需要手动提交。)
        sqlSession.commit();
        
        // 6. 关闭资源(只关闭是不会提交的)
        sqlSession.close();
    

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

  • 步骤6:运行程序,查看运行结果,以及数据库表中的数据

2.4 关于MyBatis核心配置文件的名字和路径详解

  • 核心配置文件的名字是随意的,因为以下的代码:
// 文件名是出现在程序中的,文件名如果修改了,对应这里的java程序也改一下就行了。
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("mybatis-config.xml");
  • 核心配置文件必须放到resources下吗?放到D盘根目录下,可以吗?测试一下:

将mybatis-config.xml文件拷贝一份放到D盘根下,然后编写以下程序:

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.FileInputStream;
import java.io.InputStream;

public class MyBatisConfigFilePath 
    public static void main(String[] args) throws Exception
        // 1. 创建SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // 2. 创建SqlSessionFactory对象
        // 这只是一个输入流,可以自己new。
        InputStream is = new FileInputStream("D:/mybatis-config.xml"); 
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
        // 3. 创建SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 4. 执行sql
        int count = sqlSession.insert("insertCar");
        System.out.println("插入几条数据:" + count);
        // 5. 提交(mybatis默认采用的事务管理器是JDBC,默认是不提交的,需要手动提交。)
        sqlSession.commit();
        // 6. 关闭资源(只关闭是不会提交的)
        sqlSession.close();
    

以上程序运行后,看到数据库表t_car中又新增一条数据,如下(成功了):

经过测试说明mybatis核心配置文件的名字是随意的,存放路径也是随意的。

虽然mybatis核心配置文件的名字不是固定的,但通常该文件的名字叫做:mybatis-config.xml

虽然mybatis核心配置文件的路径不是固定的,但通常该文件会存放到类路径当中,这样让项目的移植更加健壮。

  • 在mybatis中提供了一个类:Resources【org.apache.ibatis.io.Resources】,该类可以从类路径当中获取资源,我们通常使用它来获取输入流InputStream,代码如下
// 这种方式只能从类路径当中获取资源,也就是说mybatis-config.xml文件需要在类路径下。
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");

2.5 MyBatis第一个比较完整的代码写法

package cn.yangbocsu.mybatis.test;

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 java.io.IOException;

/**
 * @author yangbocsu
 * @create 2022/10/21:55
 * @projectName mybatis
 */
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();
            
        
    

运行后数据库表的变化:

2.6 引入JUnit

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

    • 在实际开发中,单元测试一般是由我们Java程序员来完成的。
    • 我们要对我们自己写的每一个业务方法负责任,要保证每个业务方法在进行测试的时候都能通过。
    • 测试的过程中涉及到两个概念:
      • 期望值
      • 实际值
    • 期望值和实际值相同表示测试通过,期望值和实际值不同则单元测试执行时会报错。
  • 这里引入JUnit是为了代替main方法。

  • 使用JUnit步骤:

    • 第一步:引入依赖
<!-- junit依赖 -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13.2</version>
    <scope>test</scope>
</dependency>
    • 第二步:编写单元测试类【测试用例】,测试用例中每一个测试方法上使用@Test注解进行标注。
      • 测试用例的名字以及每个测试方法的定义都是有规范的:
        • 测试用例的名字:XxxTest
        • 测试方法声明格式:public void test业务方法名()
// 测试用例
public class CarMapperTest
    
    // 测试方法
    @Test
    public void testInsert()
    
    @Test
    public void testUpdate()
    

    • 第三步:可以在类上执行,也可以在方法上执行
      • 在类上执行时,该类中所有的测试方法都会执行。
      • 在方法上执行时,只执行当前的测试方法。
  • 编写一个测试用例,来测试insertCar业务

package cn.yangbocsu.mybatis.test;

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.Test;

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();
            
        
    

执行单元测试,查看数据库表的变化:

2.7 引入日志框架logback

  • 引入日志框架的目的是为了看清楚mybatis执行的具体sql。
  • 启用标准日志组件,只需要在mybatis-config.xml文件中添加以下配置:【可参考mybatis手册】
<settings>
  <setting name="logImpl" value="STDOUT_LOGGING" />
</settings>
The content of element type "configuration" must match "
properties、
settings、
typeAliases、
typeHandlers、
objectFactory、
objectWrapperFactory、
reflectorFactory、
plugins、
environments、
databaseIdProvider、
mappers

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

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

  • 引入logback的步骤:

    • 第一步:引入logback相关依赖
<dependency>
  <groupId>ch.qos.logback</groupId跟着老杜学MyBatis+第2天+MyBatis入门程序

跟着老杜学MyBatis+第1天+MyBatis概述

跟着老杜学MyBatis+第1天+MyBatis概述

跟着老杜学MyBatis+第4天+MyBatis核心配置文件详解

跟着老杜学MyBatis+第4天+MyBatis核心配置文件详解

跟着老杜学MyBatis+第4天+MyBatis核心配置文件详解