MyBatis基本介绍

  |   0 评论   |   0 浏览

MyBatis基本介绍

https://www.bilibili.com/video/BV1zZ4y1M7zN?share_source=copy_web

1.MyBatis介绍

1.MyBatis中文手册

https://mybatis.org/mybatis-3/zh/index.html

https://mybatis.net.cn/

2.Maven仓库

https://mvnrepository.com/

image-20220625171131848

2.概述

1.为什么需要MyBatis

● 传统的 Java 程序操作DB分析

1、工作示意图

image-20220625171227582

2、传统方式问题分析(如上)

3、引出 MyBatis

2.基本介绍

  1. MyBatis 是一个持久层框架
  2. 前身是 ibatis, 在 ibatis3.x 时,更名为 MyBatis
  3. MyBatis 在 java 和 sql 之间提供更灵活的映射方案
  4. mybatis 可以将对数据表的操作(sql,方法)等等直接剥离,写到 xml 配置文件,实现和 java 代码的解耦
  5. mybatis 通过 SQL 操作 DB, 建库建表的工作需要程序员完成

3.MyBatis工作原理

● MyBatis 工作示意图

image-20220625171512644

2.MyBatis快速入门

1.快速入门-需求说明

要求: 开发一个 MyBatis 项目,通过 MyBatis 的方式可以完成对 monster 表的 crud 操作

2.快速入门-代码实现

  1. 创建 mybatis 数据库 - monster 表
CREATE DATABASE `mybatis` 
USE `mybatis`
CREATE TABLE `monster` (
	`id` INT NOT NULL AUTO_INCREMENT,
	`age` INT NOT NULL,
	`birthday` DATE DEFAULT NULL,
	`email` VARCHAR ( 255 ) NOT NULL,
	`gender` TINYINT NOT NULL,
	`name` VARCHAR ( 255 ) NOT NULL,
	`salary` DOUBLE NOT NULL,
PRIMARY KEY ( `id` ) 
) CHARSET = utf8
  1. 创建 maven 项目, 方便项目需要 jar 包管理

image-20220625225718502

<!--
1. 将mybatis作为父项目管理多个子模块/子项目
2. 父项目的完整的坐标 groupId[组织名]+artifactId[项目名]
3. 后面该父项目会管理多个子模块/子项目 , 将来父项目中的引入的依赖可以直接给子项目用
   , 这样开发简单,提高复用性,也便于管理
4. <packaging>pom</packaging> 表示父项目以多个子模块/子项目管理工程

-->
<groupId>com.llp</groupId>
<artifactId>mybatis</artifactId>
<version>1.0-SNAPSHOT</version>
<!--
   modules指定管理的哪些子模块
-->
<modules>
    <module>mybatis-quickstart</module>
</modules>
<packaging>pom</packaging>

<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.49</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.7</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <!--如果这里有一个scope-test 表示该jar的作用范围在test目录 -->
        <scope>test</scope>
    </dependency>
</dependencies>

image-20220626091619740

<!--
    1. parent指定了该模块的父项目的完整坐标 groupId+artifactId
    2. artifactId 子模块的名称
    3. 当前模块的groupId 就是 com.llp
    4. 这里配置后, 该模块就可以使用/引用到父项目的依赖
-->
<parent>
    <artifactId>mybatis</artifactId>
    <groupId>com.llp</groupId>
    <version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>mybatis-quickstart</artifactId>

3.创建 resources/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>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
</configuration>

4.创建Monster.java

@AllArgsConstructor
@NoArgsConstructor
@Data
@ToString
public class Monster {
    //属性-和表字段有对应关系
    private Integer id;
    private Integer age;
    private String name;
    private String email;
    private Date birthday;
    private double salary;
    private Integer gender;

}

5.创建MonsterMapper.java

public interface MonsterMapper {
    
    //添加Monster
    int save(Monster monster);
}

6.创建MonsterMapper.xml

<mapper namespace="com.llp.mapper.MonsterMapper">
    <!--配置save
         1. id="save" 就是接口的方法名
         2. parameterType="com.llp.entity.Monster" 放入的形参的类型
         3. 注意"com.llp.entity.Monster" 可以简写
         4. 写入sql语句=> 现在sqlyog 写完成-测试通过,再拿过来
         5. (`age`, `birthday`, `email`, `gender`, `name`, `salary`) 表的字段
         6. (#{age}, #{birthday}, #{email}, #{gender}, #{name}, #{salary}) 是从传入的monster对象属性值
         7. 这里 #{age} age 对应monster对象的属性名,其它一样
     -->
    <insert id="save" parameterType="com.llp.entity.Monster" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO `monster`
        (`age`, `birthday`, `email`, `gender`, `name`, `salary`)
        VALUES (#{age}, #{birthday}, #{email}, #{gender}, #{name}, #{salary})
    </insert>
</mapper>

useGeneratedKeys="true" keyProperty="id"这两个属性配合使用,在新增成功之后会返回id给实体对象,如果不配置则monster.getId()=null

7.修改mybatis-config.xml

<mappers>
    <mapper resource="com/llp/mapper/xml/MonsterMapper.xml"/>
</mappers>

8.创建MyBatisUtil

public class MyBatisUtil {

    //属性
    private static SqlSessionFactory sqlSessionFactory;

    //编写静态代码块-初始化sqlSessionFactory
    static {
        try {
            //指定资源文件, 配置文件mybatis-config.xml
            String resource = "mybatis-config.xml";
            //获取到配置文件mybatis-config.xml 对应的inputStream
            //这里加载文件时,默认到resources目录=>运行后的工作目录target/classes
            InputStream resourceAsStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
            System.out.println("sqlSessionFactory="
                    + sqlSessionFactory.getClass());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //编写方法,返回SqlSession对象-会话
    public static SqlSession getSqlSession() {
        return sqlSessionFactory.openSession();
    }
}

9.创建测试类

public class MonsterMapperTest {

    private SqlSession sqlSession;

    private MonsterMapper monsterMapper;

    /**
     * 当方法标注 @Before, 表示在执行你的目标测试方法前,会先执行该方法
     */
    //编写方法完成初始化
    @Before
    public void init() {
        this.sqlSession = MyBatisUtil.getSqlSession();
        monsterMapper = sqlSession.getMapper(MonsterMapper.class);
        System.out.println(sqlSession);
        System.out.println("monsterMapper接口运行时类型:"+monsterMapper.getClass());
    }


    @Test
    public void save() {
        Monster monster = new Monster();
        monster.setSalary(12.21);
        monster.setName("测试");
        monster.setGender(1);
        monster.setEmail("123@qq.com");
        monster.setBirthday(new Date());
        monster.setAge(24);
        int save = monsterMapper.save(monster);
        //如果是增删改, 需要提交事务
        if(sqlSession != null) {
            sqlSession.commit();
        }
        System.out.println(save);
    }

    /**
     * 当方法标注 @After, 表示在执行你的目标测试方法后,会先执行该方法
     */
    @After
    public void close() {
        if (sqlSession != null) {
            //Returned connection 1412925683 to pool.释放链接返回给连接池,并不是说真正的关闭链接
            sqlSession.close();
        }
    }

}

image-20220626133055073

3.日志输出-查看SQL

1.看一个需求

  1. 在开发 MyBatis 程序时,比如执行测试方法,程序员往往需要查看 程序底层发给 MySQL 的 SQL 语句, 到底长什么样, 怎么办?
  2. 解决方案: 日志输出

2.日志文档

https://mybatis.org/mybatis-3/zh/logging.html

3.配置日志

https://mybatis.org/mybatis-3/zh/configuration.html#settings

4.配置日志-具体操作

<!--配置MyBatis自带的日志输出-查看原生的sql-->
<settings>
    <setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>

image-20220626135708068


标题:MyBatis基本介绍
作者:llp
地址:https://llinp.cn/articles/2022/06/26/1656223161070.html