目录
前言
一、准备工作
1.1、下载MyBatis
1.2、数据库设计
二、搭建框架
2.1、创建Maven项目
2.2、jar包、引入依赖
2.3、创建MyBatis核心配置文件
2.4、映射文件
2.5、通过junit测试功能
2.6、框架优化
三、小结——注意事项
前言
本篇全程从0到1搭建MyBatis框架,连接MySQL,以向数据库中插入一条信息为例进行使用,再到最后的优化,绝对的一条龙服务~
一、准备工作
1.1、下载MyBatis
MyBatis下载地址:GitHub - mybatis/mybatis-3: MyBatis SQL mapper framework for Java


注意:这里的mybatis版本之间差异不是很大,可以自己选择版本,本篇以3.5.7为例;安装位置就放在一个你能找到的地方就ok;
1.2、数据库设计
这里以向用户表插入信息为例,搭建MyBatis框架;
(1)、用MySQL创建一个库名为:ssm;
(2)、在ssm数据库下创建一个表,名为user的用户表,sql语句如下:
create table user(id int, username varchar(20), password varchar(20));二、搭建框架
2.1、创建Maven项目
创建Maven项目基本上就是把项目名自定义一下,然后一路next就完事了;
2.2、jar包、引入依赖
都是在pom.xml的project中加入:
jar包:
    <packaging>jar</packaging>
引入依赖:
    <dependencies>
        <!-- Mybatis核心 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.7</version>
        </dependency>
        <!-- junit测试 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
            <!-- MySQL驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.16</version>
        </dependency>
    </dependencies>2.3、创建MyBatis核心配置文件
习惯上命名为mybatis-config.xml,这个文件名仅仅只是建议,并非强制要求。将来整合Spring之后,这个配置文件可以省略;
用处:用来连接数据库以及全局配置信息;
核心配置文件存放的位置是src/main/resources目录下,如下:
注意:所有的配置文件都放在resources文件下

文件配置内容如下:
<?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.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="1111"/>
            </dataSource>
        </environment>
    </environments>
    
    <!--这里需要引入映射文件-->
    <mappers>
        <mapper resource="mappers/UserMapper.xml"/> 
    </mappers>
</configuration>这里直接复制粘贴即可,别忘记输入你的数据库名称和密码以及url,如下图:

2.4、映射文件

这里需要映射什么呢,就是我们所要插入信息的用户表,所以还需要在java中创建一个用户表,如下:

public class User {
    private int id;
    private String username;
    private String password;
    public User(int id, String username, String password) {
        this.id = id;
        this.username = username;
        this.password = password;
    }
    public User() {
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}那怎么样才能通过mybatis实现与数据库的交互呢?我们可以提供一个公开的接口供MyBatis使用,如下:

解释:
MyBatis中的mapper接口相当于以前的dao。但是区别在于,mapper仅仅是接口,我们不需要 提供实现类;
为什么可以这么做呢,还记得JDBC实现与数据库的连接吗,咱们用MyBatis就可以不用像JDBC那一套那么繁琐,按照规定,我们只需要提供一个接口即可;
如何将这个接口和刚刚创建的映射文件关联起来呢?接着往下看!
映射文件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 namespace="com.bite.mybatis.mapper.UserMapper"> <!--这里建立映射关系-->
<!--
    mapper接口和映射文件要保证两个一致
    1.mapper接口的全类名和映射文件的namespace一致
    2.mapper接口中的方法的方法名要和映射文件的sql的id一致
-->
    <!--int insertUser();-->
    <insert id="insertUser">
        insert into user values(null, "admin", "123");
    </insert>
</mapper解释:
这里的<mapper namespace="com.bite.mybatis.mapper.UserMapper"> 就是在建立映射关系(注意看代码中的注释,那是我们需要格外注意的地方,否则就会报错!),然后将你想要写的sql语句写在这个标签下即可,仔细观察你会发现,不是直接将sql语句写入其中,而是通过一个inser的标签,实际上这个标签就表明了你要对这个表进行一个什么操作,MyBatis不仅提供了这个insert,还有很多其他方法,如下图:

咱们只需要将我们所要实现的逻辑(sql语句), 写入对应功能的标签下即可,例如select标签就是查询功能,那咱们只需要在这个标签下写查询的sql语句即可;
这里我的是插入功能,那么这里所需要的sql代码就是插入逻辑,向user表中插入数据;
insert标签后面的id熟悉是什么?
这便是我们需要像MyBatis提供的接口;
2.5、通过junit测试功能
在java文件下创建如下目录结构,用于测试;

测试代码如下:(解释都在注释中)
import com.bite.mybatis.mapper.UserMapper;
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 org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
public class MyBatisTest {
    @Test
    public void testInsert() throws IOException {
        //获取核心配置文件的输入流
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        //获取SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        //获取sqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
        //获取sql的会话对象SqlSession,是MyBatis提供操作数据库的对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //获取UserMapper类的代理实现类对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        //调用mapper接口中的方法,实现添加用户信息的功能
        int result = mapper.insertUser();
        System.out.println("结果:" + result);
        //提交事务(若没有commit,只会插入表中,但是不显示插入结果)
        sqlSession.commit();
        //关闭会话
        sqlSession.close();
    }
}执行结果:

 
2.6、框架优化
优化一:自动提交事务(commit)
上面我们提到,若不写commit方法,是不会自动提交sql语句的,并且每次此提交都要写是很麻烦的,实际上我们在创建SqlSession会话的时候是可以指定是否自动提交的,只需要在openSession构造参数中填写true,即可实现自动提交事务~
如下代码:
import com.bite.mybatis.mapper.UserMapper;
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 org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
public class MyBatisTest {
    @Test
    public void testInsert() throws IOException {
        //获取核心配置文件的输入流
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        //获取SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        //获取sqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
        //获取sql的会话对象SqlSession(不会自动提交事务,如下),是MyBatis提供操作数据库的对象
        //SqlSession sqlSession = sqlSessionFactory.openSession();
        //获取sql的会话对象SqlSession(会自动提交事务,如下),是MyBatis提供操作数据库的对象
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        //获取UserMapper类的代理实现类对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        //调用mapper接口中的方法,实现添加用户信息的功能
        int result = mapper.insertUser();
        System.out.println("结果:" + result);
        //提交事务(若没有commit,只会插入表中,但是不显示插入结果)
        //sqlSession.commit();
        //关闭会话
        sqlSession.close();
    }
}优化二:日志功能
日志功能就是可以在我们执行代码后,会给打印一些日志信息,如:执行的sql代码,修改了几行...等等;
(1)首先先向pom.xml中加入log4j依赖
        <!-- log4j日志 -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
(2)向resources中添加如下配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
            <param name="Encoding" value="UTF-8" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS}
%m (%F:%L) \n" />
        </layout>
    </appender>
    <logger name="java.sql">
        <level value="debug" />
    </logger>
    <logger name="org.apache.ibatis">
        <level value="info" />
    </logger>
    <root>
        <level value="debug" />
        <appender-ref ref="STDOUT" />
    </root>
</log4j:configuration>注意:如下图,这里标红,是没事的,直接点击运行没有关系:

执行效果:

三、小结——注意事项
注意:mapper接口和映射文件要保证两个一致
1.mapper接口的全类名和映射文件的namespace一致;
2.mapper接口中的方法的方法名要和映射文件的sql的id一致;
以上两点一定要注意,否则就会失败;




















