mybatis 笔记

发布时间 2023-06-13 00:05:06作者: 吾执青剑向天涯

mybatis

前提 环境

  • JDK 1.8
  • mysql 5.7
  • maven 3.6.3
  • idea

回顾:

  • JDBC
  • MYSQL
  • JAVA基础
  • Maven
  • Junit

SSM 框架:配置文件的。 看官方文档

1、 简介

1.1、 什么是mybatis

mybatis-logo

  • MyBatis 是一款优秀的持久层框架,
  • 它支持自定义 SQL、存储过程以及高级映射。
  • MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

如何获取mybatis?

1.2、持久层

数据持久化

  • 持久化就是将程序的数据在持久状态和瞬时状态的转化的过程

  • 内存:断电即失

  • 数据库(JDBC), io文件持久化

  • 生活 冷藏 罐头 保鲜膜 … …

为什么要持久化

  • 有一些对象,不能让他丢掉。
  • 内存太贵

1.3、 持久层

Dao层,Service层,Controller层…

  • 完成持久化工作的代码块
  • 层界限十分明显

1.4、为什么需要Mybatis?

  • 帮助程序员将数据存入到数据库中。

  • 方便

  • 传统的JDBC代码太复杂。简化。框架。自动化。

  • 不用mybatis也可以。 但是Mybatis容易上手。技术没有高低之分

  • 优点

    • 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件。易于学习,易于使用。通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
    • 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
    • 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
    • 提供映射标签,支持对象与数据库的ORM字段关系映射。
    • 提供对象关系映射标签,支持对象关系组建维护。
    • 提供xml标签,支持编写动态sql。

最总要的一点:使用的人多

Spring SpringMVC SpringBoot

2、 第一个mybatis程序

思路: 搭建环境–>导入Mybatis–>编写代码–>测试!

2.1、 搭建环境

搭建数据库

create DATABASE `mybatis`;

use `mybatis`;

create table `user`(
	`id` int(20) not NULL PRIMARY KEY,
	`name` VARCHAR(30) DEFAULT NULL,
	`pwd` VARCHAR(30) DEFAULT null
)ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT into `user` (`id`,`name`,`pwd`)values
(1,'小明','123456'),
(2,'小王','123789'),
(3,'大明','456789')

新建项目

  1. 新建一个普通的maven项目

  2. 删除src

  3. 导入maven依赖

    <?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>lmq.com</groupId>
        <artifactId>demo01</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <properties>
            <maven.compiler.source>8</maven.compiler.source>
            <maven.compiler.target>8</maven.compiler.target>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>
    
    
        <dependencies>
            <!-- mysql-->
            <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.28</version>
            </dependency>
    
            <!-- mybatis -->
            <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.4.6</version>
            </dependency>
            <!-- junit -->
            <!-- https://mvnrepository.com/artifact/junit/junit -->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12-beta-3</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
    
    </project>
    

2.2、创建一个模块

  • 编写mybatis的核心配置文件

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "https://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://124.71.168.125:3310/mybatis?useSSL=true&amp;userUnicode=true&amp;characterEncoding=UTF-8"/>
                    <property name="username" value="root"/>
                    <property name="password" value="123456"/>
                </dataSource>
            </environment>
        </environments>
    </configuration>
    
  • 编写mybatis工具库

    package lmq.com.utils;
    
    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;
    import java.io.InputStream;
    
    /**
     * @author 羡鱼
     * @version 1.0
     * @date 2023/6/12 21:18
     */
    
    //sqlSessionFactory --> sqlSession
    public class mybatisUtils {
        private static SqlSessionFactory sqlSessionFactory;  // 提升作用域
        static{
            try {
            String resource = "org/mybatis/example/mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    
        public static SqlSession getSqlSession(){
            return sqlSessionFactory.openSession();
        }
    
    }
    
    

2.3、 编写代码

  • 实体类

  • Dao接口

    package lmq.com.dao;
    
    import lmq.com.pojo.User;
    
    import java.util.List;
    
    /**
     * @author 羡鱼
     * @version 1.0
     * @date 2023/6/12 21:30
     */
    public interface UserDao {    //专业名称 Mapper
        List<User> getUserList();
    }
    
    
  • 接口实现类 由原来的UserDaoImp 转变为一个Mapper配置文件

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <!-- namespace=绑定一个对应的Dao/Mapper接口 -->
    <mapper namespace="lmq.com.dao.UserDao">
        <!-- select 查询语句   id 是原来的接口名字 -->
        <select id="getUserList" resultType="lmq.com.pojo.User">
            select * from mybatis.user
        </select>
    </mapper>
    

2.4、 测试

注意点:

org.apache.ibatis.binding.BindingException: Type interface lmq.com.dao.UserDao is not known to the MapperRegistry.

MapperRegistry是什么?

在核心文件中注册mappers

mybatis-config.xml


<!-- 每一个Mapper.xml都需要在mybatis核心配置文件中注册 -->
    <mappers>
        <mapper resource="lmq/com/dao/UserMapper.xml"/>
    </mappers>

注意2

maven 约定大于配置,我们之后可能遇到我们写的配置文件,无法被到出或者生效的问题,解决方法 maven

建议父子项目都放 以免父项目不生效

    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>

  • junit测试

    package lmq.com.dao;
    
    import lmq.com.pojo.User;
    import lmq.com.utils.MybatisUtils;
    import org.apache.ibatis.session.SqlSession;
    import org.junit.Test;
    
    import java.util.List;
    
    /**
     * @author 羡鱼
     * @version 1.0
     * @date 2023/6/12 22:16
     */
    public class UserDaoTest {
        @Test
        public void test(){
            // 获得sqlSersion 对象
            SqlSession sqlSession = MybatisUtils.getSqlSession();
    
    
            //方法一:getMapper  面相接口编程
            UserDao userDao = sqlSession.getMapper(UserDao.class);
            List<User> userList = userDao.getUserList();
    
            for (User user:userList){
                System.out.println(user);
            }
    
            // 关闭sqlSession
            sqlSession.close();
        }
    }
    
    

常见报错:

  1. 配置文件没有注册
  2. 绑定接口错误。
  3. 方法名不对
  4. 返回类型不对
  5. Maven导出资源

小结:

  1. 写一个工具类
  2. 写mybatis配置文件
  3. 写实体类
  4. 写接口
  5. 写maper.xml
  6. 写测试文件