MyBatis 学习笔记 - 2021-7-10 - 2021-7-13

1. MyBatis简介

视频链接【狂神说Java】Mybatis最新完整教程IDEA版通俗易懂_哔哩哔哩_bilibili

环境:

  • JDK 1.8
  • MySQL 5.7
  • maven 3.6.1
  • IDEA

什么是 MyBatis ?

  • MyBatis 是一款优秀的持久层框架
  • 它支持自定义 SQL、存储过程以及高级映射。
  • MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
  • MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
  • MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了[google code](https://baike.baidu.com/item/google code/2346604),并且改名为MyBatis 。
  • 2013年11月迁移到Github。

1.1 如何获取 MyBatis

  • maven 仓库

    
    <dependency>
        <groupId>org.mybatisgroupId>
        <artifactId>mybatisartifactId>
        <version>3.5.6version>
    dependency>
    
  • Github:Releases · mybatis/mybatis-3 (github.com)

  • 官方文档:mybatis – MyBatis 3 | 简介

1.2 持久化

数据持久化

  • 持久化就是将程序的数据在持久状态和瞬时状态转换的过程。
  • 内存:断电即失
  • 数据库 (jdbc),io 文件持久化
  • 生活:冷藏,罐头。

为什么需要持久化?

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

1.3 持久层

Dao 层,Service 层,Controller 层 …

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

1.4 为什么需要 MyBatis

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

最重要的一点:时用的人多!

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,'origami','123456'),
	(2,'tt','123456'),
	(3,'hyp','123456')

新建项目

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

  2. 删除 src 目录

  3. 导入 maven 依赖

    
    <groupId>com.ttgroupId>
    <artifactId>MyBatis-StuartifactId>
    <version>1.0.0version>
    
    
    <dependencies>
      
      <dependency>
        <groupId>mysqlgroupId>
        <artifactId>mysql-connector-javaartifactId>
        <version>5.1.47version>
      dependency>
      
      
      <dependency>
        <groupId>org.mybatisgroupId>
        <artifactId>mybatisartifactId>
        <version>3.5.6version>
      dependency>
      
      <dependency>
        <groupId>junitgroupId>
        <artifactId>junitartifactId>
        <version>4.12version>
        <scope>testscope>
      dependency>
    dependencies>
    

2.2 创建一个模块

  • 编写 mybatis 核心配置文件

    
    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://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8"/>
            <property name="username" value="root"/>
            <property name="password" value="hyp"/>
          dataSource>
        environment>
      environments>
    
    configuration>
    
  • 编写 mybatis 工具类

    // sqlSessionFactory --> sqlSession
    public class MyBatisUtils {
         
      private static SqlSessionFactory sqlSessionFactory;
    
      static {
         
        String resource = "mybatis-config.xml";
        InputStream inputStream = null;
        try {
         
          inputStream = Resources.getResourceAsStream(resource);
          sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
         
          e.printStackTrace();
        }
      }
    
      //  既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。
      //  SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。
      public static SqlSession getSqlSession() {
         
        return sqlSessionFactory.openSession();
      }
    }
    

2.3 编写代码

  • 实现类

    public class User {
         
      private int id;
      private String name;
      private String pwd;
    
      public User() {
         
      }
    
      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 + '\'' +
            '}';
      }
    }
    
  • Dao 接口

    public interface UserDao {
         
      List<User> getUserList();
    }
    
  • 接口实现类由原来的 UserDaoImpl 转变为一个 Mapper 配置文件

    
    DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
    
    <mapper namespace="com.tt.dao.UserDao">
      
      <select id="getUserList" resultType="com.tt.pojo.User">
        select *
        from mybatis.user
      select>
    mapper>
    

2.4 测试

注意点:

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

MapperRegistry是什么?

核心配置文件种注册 mappers

  • junit 测试

    public class UserDaoTest {
         
    
      @Test
      public void test() {
         
        // 第一步:获得 SqlSession对象
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        // 执行 SQL
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        List<User> userList = mapper.getUserList();
        for (User user : userList) {
         
          System.out.println(user);
        }
        sqlSession.close();
      }
    }
    

可能遇到的问题:

  1. 配置文件没有注册
  2. 绑定接口错误
  3. 方法名错误
  4. 返回值类型不对
  5. maven 导出资源问题
  6. 中文注释问题

3. CRUD

1. namespace

namespace 中的包名要和 Dao/mapper 中的包名一致!

2. select

选择,查询语句:

  • id:就是对于的 namespace 中的方法名
  • resultType:sql 语句执行的返回值
  • parameterType:参数类型!
  1. 编写接口

    // 根据ID查询用户
    User getUserById(int id);
    
  2. 编写对应的 mapper 中的 sql 语句

    <select id="getUserById" parameterType="int" resultType="com.tt.pojo.User">
      select * from mybatis.user where id = #{0};
    select>
    
  3. 测试

    @Test
    public void getUserById() {
         
      SqlSession sqlSession = MyBatisUtils.getSqlSession();
      UserMapper mapper = sqlSession.getMapper(UserMapper.class);
      User user = mapper.getUserById(1);
      System.out.println(user);
      sqlSession.close();
    }
    

3. insert

  1. 编写接口

    // insert 一个用户
    int addUser(User user);
    
  2. 编写对应的 mapper 的 sql 语句

    <insert id="addUser" parameterType="com.tt.pojo.User">
      insert into mybatis.user (id, name, pwd) values (#{id}, #{name}, #{pwd});
    insert>
    
  3. 测试

    @Test
    public void addUser() {
         
      SqlSession sqlSession = MyBatisUtils.getSqlSession();
      UserMapper mapper = sqlSession.getMapper(UserMapper.class);
      int i = mapper.addUser(new User(23, "哈哈", "1233412"));
    
      if (i > 0) {
         
        System.out.println("插入成功");
      }
    //    提交事务
      sqlSession.commit(

你可能感兴趣的:(MyBatis)