zoukankan      html  css  js  c++  java
  • 【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 配置文件的详细内容,这里先给出一个简单的示例:

    srcmain esourcesmybatis-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);

     srcmainjavacndaiutilMybatisUtil.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省略相关方法

    srcmainjavacndaipojoUser.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接口,应该说映射接口

    只写一个方法即可

    srcmainjavacndaimapperUserMapper.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接口的配置文件

    srcmainjavacndaimapperUserMapper.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 estjavaQuickstart.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、资源过滤问题

      刚写这篇快速入门都没有这个错误,

      早上起来测试修改的工具类发生的报错

      一看是UserMapper.xml找不到,然后我们可以去看看产出的实际类目录有没有

      如果没有就说明Maven把配置文件过滤了,那就要设置Maven的build目录过滤了

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

    两个过滤标签都设置false让UserMapper.xml可以设置中文注释,否则报错不允许

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

     时区设置的补充

    <!-- 时区还可以设置为 serverTimezone=Asia/Shanghai  serverTimezone=GMT -->
  • 相关阅读:
    vmware fusion和mac共享目录
    安卓linker源码阅读01
    sublime text 快捷键
    eclipse使用经验汇总
    递归池:
    ubuntu下adb红米
    蛋疼问题汇总you must restart adb and eclipse
    JNI
    ARM寻址
    了解装饰器
  • 原文地址:https://www.cnblogs.com/mindzone/p/12822111.html
Copyright © 2011-2022 走看看