Mybatis基础的使用与原理
Mybatis
Mybatis概述
Mybatis概念
MyBatis 是一款优秀的持久层框架,用于简化 JDBC 开发
MyBatis 本是 Apache 的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github
官网:Mybits
持久层:
- 
负责将数据到保存到数据库的那一层代码。 以后开发我们会将操作数据库的Java代码作为持久层。而Mybatis就是对jdbc代码进行了封装。 
- 
JavaEE三层架构:表现层、业务层、持久层 三层架构在后期会给大家进行讲解,今天先简单的了解下即可。 
框架:
- 框架就是一个半成品软件,是一套可重用的、通用的 、软件基础代码模型
- 在框架的基础之上构建软件编写更加高效、规范、通用、可扩展
举例给大家简单的解释一下什么是半成品软件。大家小时候应该在公园见过给石膏娃娃涂鸦
 如下图所示有一个石膏娃娃,这个就是一个半成品。你可以在这个半成品的基础上进行不同颜色的涂鸦
如下图所示有一个石膏娃娃,这个就是一个半成品。你可以在这个半成品的基础上进行不同颜色的涂鸦

了解了什么是Mybatis后,接下来说说以前 JDBC代码 的缺点以及Mybatis又是如何解决的。
JDBC 缺点
下面是 JDBC 代码,我们通过该代码分析都存在什么缺点:
/**
 - JDBC快速入门
 */
public class JDBCDemo {
    public static void main(String[] args) throws Exception {
        //1. 注册驱动
        //Class.forName("com.mysql.jdbc.Driver");
        //2. 获取连接
        String url = "jdbc:mysql://127.0.0.1:3306/db1";
        String username = "root";
        String password = "1234";
        Connection conn = DriverManager.getConnection(url, username, password);
        //3. 定义sql
        String sql = "update account set money = 2000 where id = 1";
        //4. 获取执行sql的对象 Statement
        Statement stmt = conn.createStatement();
        //5. 执行sql
        int count = stmt.executeUpdate(sql);//受影响的行数
        //6. 处理结果
        System.out.println(count);
        //7. 释放资源
        stmt.close();
        conn.close();
    }
}
- 
硬编码 - 
注册驱动、获取连接 以上代码有很多字符串,而这些是连接数据库的四个基本信息,以后如果要将Mysql数据库换成其他的关系型数据库的话,这四个地方都需要修改,如果放在此处就意味着要修改我们的源代码。 
- 
SQL语句 以上的代码。如果表结构发生变化,SQL语句就要进行更改。这也不方便后期的维护。 
 
- 
- 
操作繁琐 - 
手动设置参数 
- 
手动封装结果集 上图标4的代码是对查询到的数据进行封装,而这部分代码是没有什么技术含量,而且特别耗费时间的。 
 
- 
Mybatis 优化
- 硬编码可以配置到配置文件
- 操作繁琐的地方mybatis都自动完成
如图所示

下图是持久层框架的使用占比。

Mybatis快速入门
需求:查询user表中所有的数据
- 
创建user表,添加数据 create database mybatis;
 use mybatis;
 drop table if exists tb_user;
 create table tb_user(
 id int primary key auto_increment,
 username varchar(20),
 password varchar(20),
 gender char(1),
 addr varchar(30)
 );
 INSERT INTO tb_user VALUES (1, 'zhangsan', '123', '男', '北京');
 INSERT INTO tb_user VALUES (2, '李四', '234', '女', '天津');
 INSERT INTO tb_user VALUES (3, '王五', '11', '男', '西安');
- 
创建模块,导入坐标 在创建好的模块中的 pom.xml 配置文件中添加依赖的坐标 <dependencies>
 <!--mybatis 依赖-->
 <dependency>
 <groupId>org.mybatis</groupId>
 <artifactId>mybatis</artifactId>
 <version>3.5.5</version>
 </dependency>
 <!--mysql 驱动-->
 <dependency>
 <groupId>mysql</groupId>
 <artifactId>mysql-connector-java</artifactId>
 <version>5.1.46</version>
 </dependency>
 <!--junit 单元测试-->
 <dependency>
 <groupId>junit</groupId>
 <artifactId>junit</artifactId>
 <version>4.13</version>
 <scope>test</scope>
 </dependency>
 <!-- 添加slf4j日志api -->
 <dependency>
 <groupId>org.slf4j</groupId>
 <artifactId>slf4j-api</artifactId>
 <version>1.7.20</version>
 </dependency>
 <!-- 添加logback-classic依赖 -->
 <dependency>
 <groupId>ch.qos.logback</groupId>
 <artifactId>logback-classic</artifactId>
 <version>1.2.3</version>
 </dependency>
 <!-- 添加logback-core依赖 -->
 <dependency>
 <groupId>ch.qos.logback</groupId>
 <artifactId>logback-core</artifactId>
 <version>1.2.3</version>
 </dependency>
 </dependencies>注意:需要在项目的 resources 目录下创建logback的配置文件 
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!--
        CONSOLE :表示当前的日志信息是可以输出到控制台的。
    -->
    <appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>[%level]  %cyan([%thread]) %boldGreen(%logger{15}) - %msg %n</pattern>
        </encoder>
    </appender>
    <logger name="com.wrm244" level="DEBUG" additivity="false">
        <appender-ref ref="Console"/>
    </logger>
    <!--
      level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF
     , 默认debug
      <root>可以包含零个或多个<appender-ref>