简介

1、什么是mybatis


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

关键词解释

持久化

狭义的理解: “持久化”仅仅指把域对象永久保存到数据库中;

广义的理解,“持久化”包括和数据库相关的各种操作(持久化就是将有用的数据以某种技术保存起来,将来可以再次取出来应用,数据库技术,将内存数据一文件的形式保存在永久介质中(磁盘等)都是持久化的例子.)。

  • 保存:把域对象永久保存到数据库。
  • 更新:更新数据库中域对象的状态。
  • 删除:从数据库中删除一个域对象。
  • 加载:根据特定的OID,把一个域对象从数据库加载到内存。
  • 查询:根据特定的查询条件,把符合查询条件的一个或多个域对象从数据库加载内在存中。

持久层

  • 我们在此之前已经学过mvc三层架构都知道 Dao层,Servcie 层 Controlle r层, 层与层之间相互关联。
  • 持久层从广义上来说在持久化的基础上做了一个明显的划分,完成持久化工作的代码块
  • 层与层之间具有十分明显的界限。

为什么要持久化呢?

  • 通过持久化技术可以减少访问数据库数据次数,增加应用程序执行速度;
  • 代码重用性高,能够完成大部分数据库操作;
  • 松散耦合,使持久化不依赖于底层数据库和上层业务逻辑实现,更换数据库时只需修改配置文件而不用修改代码。

2、为什么要用Mybatis


  • 使操作数据库更为轻松简单
  • 传统jdbc代码复杂,ibatis实现自动化 简化
  • 程序员使用起来得心应手
  • 优点

    • 简单易学
    • 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。通过sql语句可以满足操作数据库的所有需求。
    • sql和代码的分离,提高了可维护性。
    • 提供映射标签,支持对象与数据库的orm字段关系映射
    • 提供对象关系映射标签,支持对象关系组建维护
    • 提供xml标签,支持编写动态sql。

3、Mybatis第一个应用程序


实现思路: 搭建环境-->导入mybatis-->编写代码-->测试

1、数据库(可随意创建一个数据库进行测试)

CREATE DATABASE `java_project`;

use `java_project`;

CREATE TABLE `mybatis_user`(
    `id` Int NOT NULL PRIMARY KEY,
    `name` VARCHAR(30)    DEFAULT NULL,
    `pwd`  VARCHAR(30)    DEFAULT NULL,
)ENGINE=INNODB DEFAULT CHARSET=utf8;

mysql>INSERT INTO `mybatis_user` (`id`,`name`,`pwd`) VALUES (1,'juran','123');

2、新建maven项目

删除src目录

导入依赖

    <dependencies>
        <!--Mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>
        <!--Mybatis-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>
        <!--junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
        </dependency>
    </dependencies>

通过模块创建子工程

编写核心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.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/java_project?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        
        <mapper resource="org/mybatis/example/BlogMapper.xml"/>
    </mappers>
</configuration>

编写工具类

package com.juran.untils;

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;

public class MybatisUtils {
    private static SqlSessionFactory sqlSessionFactory
    static {
        try {
            //使用mybatis第一步:获取sqlseesionFactory 对象。
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。
    // 你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。
    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();
    }

}

编写实体类(根据各个数据库字段来定义类)

package com.juran.pojo;

public class Mybatis_User {
    private int id;
    private  String name;
    private  String pwd;

    public Mybatis_User() {
    }

    public Mybatis_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 "Mybatis_User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                '}';
    }
}

Dao层接口

package com.juran.dao;

import com.juran.pojo.Mybatis_User;

import java.util.List;

public interface Mybatis_UserDao{
    List<Mybatis_User> UserList();
}

Dao层接口由原来的接口也实现类转换成一个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 namespace="com.juran.dao.Mybatis_UserDao">
    <!--id:绑定-->
    <select id="getUserList"  resultType="com.juran.pojo.Mybatis_User">
        select * from java_project.mybatis_user
    </select>
</mapper>

创建测试类

package com.juran.dao;

import com.juran.pojo.Mybatis_User;
import com.juran.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

public class Mybatis_UserTest {
    @Test
    public void test(){
        //获得sqlsession对象
        SqlSession sqlSession =  MybatisUtils.getSqlSession();
//        //执行Sql方式一: 通过mapper获取类
        Mybatis_UserDao mapper = sqlSession.getMapper(Mybatis_UserDao.class);
        List<Mybatis_User> mybatis_users = mapper.getUserList();
        //执行Sql方式二:根据方法的返回值返回
//        List<Mybatis_User> mybatis_users = sqlSession.selectList("com.juran.dao.Mybatis_UserDao.getUserList");
        //遍历
        for (Mybatis_User mybatis_user : mybatis_users) {
            System.out.println(mybatis_user);
        }
        //关闭
        sqlSession.close();
    }
}

报错注意事项

  • org.apache.ibatis.binding.BindingException: Type interface com.juran.dao.Mybatis_UserDao is not known to the MapperRegistry.

该报错是因为我们没有在没有mybatis核心文件下注册mapper.xml文件

我们需要在mybatis-confing.xml文件之中注册mapper

  <!--每一个都mapper.xml文件需要在mybatis核心文件之中注册-->
    <mappers>
        <mapper resource="com/juran/dao/Mybatis_UserMapper.xml"/>
    </mappers>
  • java.lang.ExceptionInInitializerError

该问题涉及资源过滤问题,我们写得配置文件,无法被导出或生效。解决方案在mybatis核心配置文件中加入。

 <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
            </resource>
        </resources>
    </build>
  • org.apache.ibatis.exceptions.PersistenceException:

该问题主要涉及mapper文件配置问题,请仔细核对mapper文件中的配置参数是否存在其错误。

最后修改:2021 年 08 月 20 日
如果觉得我的文章对你有用,请随意赞赏