Mybatis 札记(一)麻雀虽小,五脏俱全

本文详细介绍了MyBatis的基础概念、配置步骤、使用流程,包括数据库搭建、Maven依赖、实体类与Mapper接口配置,以及如何进行CRUD操作的实战演示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先献上中文官网:https://mybatis.org/mybatis-3/zh/index.html

一:什么是 MyBatis?

在这里插入图片描述

MyBatis 是一款优秀的持久层框架
支持自定义 SQL、存储过程以及高级映射
免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作
MyBatis 本是apache的一个开源项目iBatis,。
2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。
2013年11月迁移到Github

小麻雀提醒您:持久化VS持久层

持久化
  1. 持久化就是将程序的数据在持久状态和瞬时状态转化的过程
  2. 内存的特点是:断电即失
  3. 数据库(JDBC)、IO文件持久化( 太耗资源 )
持久层

之前的JavaWeb总共有这三个层

  1. Dao层
  2. Service层
  3. Controller层

所以 Mybatis是完成 持久化工作的 一个持久层框架

二:相关配置

maven仓库

导入坐标依赖 或者 jar包 点击进入 maven 官网

<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.7</version>
</dependency>

三:使用流程

1、搭建数据库

create database `mybatis`;

use mybatis;

create table `user`(
	`id` int(20) PRIMARY key,
	`name` varchar(20) DEFAULT null,
	`pwd` varchar(30) default null
)ENGINE = INNODB DEFAULT CHARSET = utf8;

insert into user(`id`,`name`,`pwd`) VALUES
(1,'潮汕奴仔','123456'),
(2,'狮头鹅','159357'),
(3,'潮汕牛','789456');

2、新建父项目、导入坐标依赖

新建一个普通的maven项目即可
在这里插入图片描述
在这里插入图片描述
项目构建完成后的整体目录结构
在这里插入图片描述
接下来我们把src目录删掉 让MyBatis工程成为父工程
接下来在 pom.xml 中导入依赖坐标

<!--导入依赖坐标-->
    <dependencies>
        <!--MySQL驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.24</version>
        </dependency>
        <!--MyBatis-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>
        <!--Junit单元测试-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>

可以打开右侧maven查看依赖是否导入成功 或 左侧External Libraries
在这里插入图片描述在这里插入图片描述
或左侧
在这里插入图片描述

⭐1、新建一个子工程 开始 practices Demo

在这里插入图片描述

⭐2、创建mybatis的核心配置文件 mybatis-config.xml

主要功能:连接数据库 其中的数据库连接信息填写符合自己的信息

在子模块的 resource 中新建
在这里插入图片描述

<?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核心配置文件-->
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
</configuration>

⭐3、创建mybatis工具类

在这里插入图片描述

package com.csnz.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;

/**
 * @Des MyBatis的工具类 通过 SqlSessionFactory 获取 SqlSession
 * @Date 2021/7/12/0012 22:39
 **/

public class MyBatisUtils {
    private static SqlSessionFactory sqlSessionFactory;

    //初始化静态代码块
    static {
        try {
            //一: 获取SqlSessionFactory对象
            String resource = "mybatis-config.xml";
            InputStream in = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * @Des     获取 SqlSession实例
     *          有了 SqlSessionFactory 我们可以通过它获取SqlSession实例 (包含了执行SQL命令所需的所有方法)
     * @Date 2021/7/12/0012 22:45
     * @Param []
     * @Return org.apache.ibatis.session.SqlSession
     */
    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();
    }


}

3、编写代码

1、实体类

package com.csnz.pojo;/*
 *
 *@create 2021-07-13-0:21
 */
/**
 * @Des 对应数据库表中的实体类
 * @Author zzj
 * @Date 2021/7/13/0013 0:21
 **/
public class User {
    private int id;
    private String name;
    private String pwd;

    public User() {
    }

    public User(int id, String name, String pwd) {
        this.id = id;
        this.name = name;
        this.pwd = pwd;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                '}';
    }
}

2、Dao接口

package com.csnz.dao;/*
 *
 *@create 2021-07-13-0:25
 */

import com.csnz.pojo.User;

import java.util.List;
/**
 * @Des User的持久层接口
 * @Author zzj
 * @Date 2021/7/13/0013 0:28
 **/
public interface UserDao {
    /**
     * @Des 获取所有用户列表
     * @Date 2021/7/13/0013 0:28
     * @Param []
     * @Return java.util.List<com.csnz.pojo.User>
     */
    public abstract List<User> getUserList();
}

3、接口实现类(由原来的UserDapImpl 转变为一个Mapper配置文件)

<?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绑定一个对应的Dao/Mapper接口-->
<mapper namespace="com.csnz.dao.UserDao">
    <!--select查询语句 id为 接口中的方法名称 resultType为结果类型(写全限定类名)-->
    <select id="getUserList" resultType="com.csnz.pojo.User">
        select * from user;
    </select>
</mapper>

4、进行测试

使用Junit进行单元测试

package com.csnz.dao;/*
 *
 *@create 2021-07-13-9:51
 */

import com.csnz.pojo.User;
import com.csnz.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;

/**
 * @Des UserDao接口的测试类 使用Junit单元测试
 * @Author zzj
 * @Date 2021/7/13/0013 9:51
 **/
public class UserDaoTest {
    @Test
    public void test(){
        //1、获取SqlSession对象 (执行SQL语句的对象)
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        //2、getMapper
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        List<User> userList = userDao.getUserList();
        for (User user : userList) {
            System.out.println(user);
        }
        //3、关闭SqlSession
        sqlSession.close();
    }
}

运行结果:
在这里插入图片描述

项目至此结构目录图

在这里插入图片描述

测试过程中遇到的问题及解决方法

注意点: namespace 中的包名 要和 Dao / Mapper 接口的包名一致

1、 Type interface com.csnz.dao.UserDao is not known to the MapperRegistry.
解决方法:出现 在mapper中心找不到此接口 是因为在mybatis的核心配置文件中没配置mapper
在这里插入图片描述

2、Invalid bound statement (not found): com.csnz.dao.UserDao.getUserList
你可能写错了mapper 映射的路径 下图是引发 问题的代码
在这里插入图片描述

3、Could not find resource com/csnz/dao/UserMapper.xml
问题出在静态资源导出上 你编写的UserMapper.xml 是在java文件夹中无法导出 参考如下:解决Maven静态资源导出问题

四:进一步巩固CRUD(增删改需提交事务!)

在接口中新增根据用户id查询用户信息的方法
在这里插入图片描述
并在UserMapper.xml中进行配置
在这里插入图片描述
最后进行测试
在这里插入图片描述

增 (注意需提交事务)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

删 (注意需提交事务)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

改 (需提交事务)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值