【Mybatis】01 概述 & 快速入门Part1

什么是 MyBatis?

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。

MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。

MyBatis 可以通过简单的 XML 或注解来

配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

官方文档地址:

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

环境所需的组成部分

MySQL 5.0 +

JDK 1.8 + 

IDEA 2018 +

Maven 3.0 + 

总而言之:越新越好

快速入门 Quickstart:

用IDEA创建一个使用Maven构建的Mybatis学习工程

填好工程名称

为了解释多个要点,我们把主工程的目录删除,建立多模块结构

右键工程,新建

填写模块名称

新建的项目不会自动分配约定目录,这里我们需要手动设置

打开ProjectStructure

蓝色表示我们的源码目录

绿色表示我们的测试目录

带有黄色堆叠块的目录表示是资源存放目录

根据第一次新建工程的目录结构来看

我们只需要把java目录 和 test的Java目录更改即可

点选目录 再点选所要约定的目录种类即可

这是另一种实现的方式

依赖导入 Dependency Import

因为我们使用的是父子多模块模式

依赖直接导入在父Pom下即可

(Mybatis)pom.xml

    <dependencies>
        <!-- Mybatis 组件 -->
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.4</version>
        </dependency>

        <!-- JDBC 驱动-->
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.20</version>
        </dependency>
        
        <!-- lombok -->
        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
            <scope>provided</scope>
        </dependency>


        <!-- Junit 单元测试 -->
        <!-- https://mvnrepository.com/artifact/junit/junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
            <scope>test</scope>
        </dependency>

    </dependencies>

创建数据库,制作模拟数据

From SQLyog

或者SQL指令

DROP DATABASE IF EXISTS myabtis;
CREATE DATABASE IF NOT EXISTS mybatis;

创建user表

或者SQL指令

CREATE TABLE user(
    id int(20) primary key,
    name varchar(30) default null,
    password varchar default null
)engine=innodb default charset=utf8;   

插入数据

INSERT INTO user(`user_id`,`user_name`,`user_password`) values
(1,"张三","123456"),
(2,"李四","234567"),
(3,"王五","345678"),
(4,"钱六","456789");

创建Mybatis核心配置文件

配置信息获取位置:https://mybatis.org/mybatis-3/zh/getting-started.html

XML 配置文件中包含了对 MyBatis 系统的核心设置,

包括获取数据库连接实例的数据源(DataSource)

以及决定事务作用域和控制方式的事务管理器(TransactionManager)。

后面会再探讨 XML 配置文件的详细内容,这里先给出一个简单的示例:

src\main\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="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="org/mybatis/example/BlogMapper.xml"/>
  </mappers>
</configuration>

当然,还有很多可以在 XML 文件中配置的选项,上面的示例仅罗列了最关键的部分。

注意 XML 头部的声明,它用来验证 XML 文档的正确性。

environment 元素体中包含了事务管理和连接池的配置。

mappers 元素则包含了一组映射器(mapper),

这些映射器的 XML 映射文件包含了 SQL 代码和映射定义信息。

对配置信息的注释解释:

<?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>

    <!-- Mybatis多环境配置 default="development"表示默认使用的1个环境 -->
    <environments default="development">

        <!-- default 环境 -->
        <environment id="development">

            <!-- 事务管理 默认使用JDBC -->
            <transactionManager type="JDBC"/>

            <!-- 数据源 ,也就是我们所学的连接池技术 -->
            <dataSource type="POOLED">

                <!-- 不用我说是了把,老4样了 -->

                <!-- 这是jdbc8.0+ 的版本驱动,老版本5.0+ 是com.mysql.jdbc.Driver -->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>

                <!-- 本机连接可以不用写 localhost:3306 -->
                <!-- 8.0+的驱动访问数据库必须声明时区参数 ,5.0+不需要 直接就是 jdbc:mysql:///mybatis -->
                <!-- 时区还可以设置为 -->
                <!-- jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8&useSSL=true&amp;serverTimezone=GMT&useUnicode=true -->
                <property name="url" value="jdbc:mysql:///mybatis?serverTimezone=GMT"/>

                <!-- 用户&密码 -->
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>

        <!-- 我们复制粘贴,可以使用第二套环境 -->
        <environment id="development2">
            <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>

    <!-- 我们需要绑定的Dao,按Mybatis的话来说,就是Mapper映射器 -->
    <mappers>
        <mapper resource="org/mybatis/example/BlogMapper.xml"/>
    </mappers>

</configuration>

我们可以使用IDEA先连接数据库

数据库的使用

https://www.cnblogs.com/mindzone/p/12718287.html

确认可用之后,开始编写MybatisUtil工具类

从 XML 中构建 SqlSessionFactory

每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。

SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。

而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。

从 XML 文件中构建 SqlSessionFactory 的实例非常简单,

建议使用类路径下的资源文件进行配置。

但也可以使用任意的输入流(InputStream)实例,

比如用文件路径字符串或 file:// URL 构造的输入流。

MyBatis 包含一个名叫 Resources 的工具类,

它包含一些实用方法,使得从类路径或其它位置加载资源文件更加容易。

String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

 src\main\java\cn\dai\util\MybatisUtil.java

public class MybatisUtil {
    
    private static org.apache.ibatis.session.SqlSessionFactory sqlSessionFactory;
    
    static {
        
        try{
            // 核心配置文件名称
            String config = "mybatis-config.xml";
            
            // 读取核心配置 加载进内存为读取流对象
            java.io.InputStream inputStream = org.apache.ibatis.io.Resources.getResourceAsStream(config);
            
            // 通过工场建造者获取了配置流对象,读取配置信息后,生成会话工厂实例
            sqlSessionFactory = new org.apache.ibatis.session.SqlSessionFactoryBuilder().build(inputStream);

        } catch (Exception exception){
            exception.printStackTrace();
        }
    }
    
    // 获取会话实例即可
    public static org.apache.ibatis.session.SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();
    }
}

编写对应的实体类,用lombok省略相关方法

src\main\java\cn\dai\pojo\User.java

package cn.dai.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author ArkD42
 * @file Mybatis
 * @create 2020 - 05 - 03 - 15:58
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    // 最好和数据表的字段同名
    private Integer user_id;
    private String user_name;
    private String user_password;
}

声明我们的DAO接口,应该说映射接口

只写一个方法即可

src\main\java\cn\dai\mapper\UserMapper.java

package cn.dai.mapper;

import cn.dai.pojo.User;

import java.util.List;

/**
 * @author ArkD42
 * @file Mybatis
 * @create 2020 - 05 - 03 - 16:00
 */
public interface UserMapper {
    List<User> getUserList();
}

从最经典的XML配置开始,这里我们不再写实现类了,

而是写Mapper接口的配置文件

src\main\java\cn\dai\mapper\UserMapper.xml

<?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">

<!-- 映射的Mapper接口名称-->
<mapper namespace="cn.dai.mapper.UserMapper">
    
    <!-- 我们的SQL语句使用这种标签来实现 -->
    <!-- id 是我们的Mapper接口中的 方法名称 -->
    <!-- resultType 表示查询的结果类型,因为是List 这里我们直接填写泛型的元素类型就好了 -->
    <select id="getUserList" resultType="cn.dai.pojo.User">
        /* 这里填写我们的SQL语句 */
        SELECT * FROM `user`; 
    </select>
</mapper>

回到mybatis-conifg.xml 核心配置文件,注册我们的映射器文件

    <!-- 所有的映射器都需要被注册到!!!-->
    <!-- 我们需要绑定的Dao,按Mybatis的话来说,就是Mapper映射器 -->
    <mappers>
        <mapper resource="cn/dai/mapper/UserMapper.xml"/>
    </mappers>

 测试类

src\test\java\Quickstart.java

import cn.dai.mapper.UserMapper;
import cn.dai.pojo.User;
import cn.dai.util.MybatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

/**
 * @author ArkD42
 * @file Mybatis
 * @create 2020 - 05 - 03 - 16:10
 */
public class Quickstart {

    @Test
    public void quickstartMybatis(){
        
        // 获取会话对象
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        
        // 获得映射实现实例
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        
        // 调用接口方法
        List<User> userList = mapper.getUserList();

        for (User user : userList) {
            System.out.println(user);
        }
        
        // 释放资源
        sqlSession.close();
    }
}

结果:


常见的错误总结:

1、Maven依赖问题

  这个可能是IDEA版本问题,建议直接下载最新IDEA版本使用

  2017、2018、都可能会出现,然后是Maven版本不一样的问题,建议最新

2、核心配置文件的问题

  如果在配置中不小心写错了标签,尽管IDEA会自动提示,

  但是你刚刚上手,根本不会注意这个问题,异常提示会给出准确的错误行,只要修改即可

3、映射器未注册异常

  配置完接口的Mapper就开始跑了,你在想屁吃?

 4、资源过滤问题

  这个问题在IDEA2019.3版本出现过,原因有很多问题

  1 工程内的文件的编码不统一设置UTF8

  2 Maven旧版本不过滤配置资源,导致读不了文件

  3 Mapper接口配置注释了中文,导致初始化失败,这个问题跟1有关

在父pom.xml中设置此配置即可

如果,UserMapper.xml不能注释中文的话,

两个过滤标签都改成false或者true,我也想不起来了。。。

<!--在build中配置resources,来防止我们资源导出失败的问题-->
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

猜你喜欢

转载自www.cnblogs.com/mindzone/p/12822111.html