MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
学习优秀框架最好的方式就是阅读官网文档,经过初步理解和掌握,初试第一个mybatis程序。
根据官网文档。创造一个Maven项目并且在pom文件中进入如下必备的代码配置。
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>x.x.x</version>
</dependency>
当然初次之外还需要mysql依赖和一个测试junit依赖,配置后的pom为(最后一个是为了解决maven的小缺陷,我认为是小缺陷,文件过滤(之后再深入学习)没有这个的话,mapper.xml无法加载进target然后报错 )
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 父工程-->
<groupId>org.example</groupId>
<artifactId>Mybatis_first_study</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>mybatis-01</module>
</modules>
<!--引入依赖-->
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.36</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.2</version>
<scope>test</scope>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<build>
<!-- 资源目录 -->
<resources>
<resource>
<!-- 设定主资源目录 -->
<directory>src/main/java</directory>
<!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,只处理如下配置中包含的资源类型 -->
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,不处理如下配置中包含的资源类型(剔除下如下配置中包含的资源类型)-->
<excludes>
<exclude>**/*.yaml</exclude>
</excludes>
<!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,指定处理后的资源文件输出目录,默认是${build.outputDirectory}指定的目录-->
<!--<targetPath>${build.outputDirectory}</targetPath> -->
<!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,是否对主资源目录开启资源过滤 -->
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,只处理如下配置中包含的资源类型 -->
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
</project>
接下来从 XML 中构建 SqlSessionFactory,
每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。
从 XML 文件中构建 SqlSessionFactory 的实例非常简单,建议使用类路径下的资源文件进行配置。 但也可以使用任意的输入流(InputStream)实例,比如用文件路径字符串或 file:// URL 构造的输入流。MyBatis 包含一个名叫 Resources 的工具类,它包含一些实用方法,使得从类路径或其它位置加载资源文件更加容易。
必备的代码 我们做成工具类,如下
package com.util;
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;
/**
* @Author:XK
* @Date: Created in 23:08 2021/10/30
* @Description:
**/
public class MybatisUtil {
private static SqlSessionFactory sqlSessionFactory;
static
{
try {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
获得一个构造sqlsession的方法,
然后了解到一个mybatis-config.xml文件,XML 配置文件中包含了对 MyBatis 系统的核心设置,包括获取数据库连接实例的数据源。于是被迫进行一个xml文件的配置。如下,这个放在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.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/fisrt21?useUnicod=true&characterEncoding=utf-8&useSSL=true"/>
<property name="username" value="root"/>
<property name="password" value="2020"/>
</dataSource>
</environment>
</environments>
<!-- 每个mapper。xml都需要在核心配置文件中 注册mapper仓库-->
<mappers>
<mapper resource="com/util/Mapper/UserMapper.xml"></mapper>
</mappers>
</configuration>
跟jdbc的properties的配置非常像,driver包,url路径,username和pwd。并且在这要注意下面的<mappers>一定要存在,每一个mapper.xml文件必须注册在核心配置文件中,不然就会报错,具体错误如下 Exception in thread "main" org.apache.ibatis.binding.BindingException: Type interface com.util.Mapper.UserMapper is not known to the MapperRegistry.
![](https://img-blog.csdnimg.cn/e86b612bfe1945fe8e38bd58a2c04eaf.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAWW9rZV9fX19fXw==,size_20,color_FFFFFF,t_70,g_se,x_16)
从 SqlSessionFactory 中获取 SqlSession
既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。如
try (SqlSession session = sqlSessionFactory.openSession()) {
Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);
}
但这是古老的方式现在大多不这么使用。
现在的都是获取到一个mapper(官网提倡使用这种方法)
try (SqlSession session = sqlSessionFactory.openSession()) {
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);
}
对于mapper和sqlsession到底做了什么,我来白话一下。
简单来说sqlsession就是要执行在数据库的所有方法,但是这里引进了xml定义语句。1个语句既可以通过 XML 定义,也可以通过注解定义。我们先看看 XML 定义语句的方式,事实上 MyBatis 提供的所有特性都可以利用基于 XML 的映射语言来实现。
经过简单的实现完成一个mapper的配置。
<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--绑定一个mapper接口-->
<mapper namespace="com.util.Mapper.UserMapper">
<select id="selectAll" resultType="com.util.doclass.teacher">
select * from teacher
</select>
</mapper>
namespace 对应着一个mapper接口,也就是我们想要对数据库进行操作的行为
通过这个命名空间的映射就绑定住了一个接口文件,这个xml文件就类似于一个实现类、用全限名来调用映射语句就好像用全限定名调用一个java对象,这样,该命名就可以直接映射到在命名空间中同名的映射器类,并将已映射的 select 语句匹配到对应名称、参数和返回类型的方法。
与其绑定的Mapper类(接口)
package com.util.Mapper;
import com.util.doclass.teacher;
import java.util.List;
/**
* @Author:XK
* @Date: Created in 23:08 2021/10/30
* @Description:
**/
public interface UserMapper {
List<teacher> selectAll();
}
然后进行一下测试
package com.util;
import com.util.Mapper.UserMapper;
import com.util.doclass.teacher;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
/**
* @Author:XK
* @Date: Created in 23:27 2021/10/30
* @Description:
**/
public class UserMapperTest {
@Test
public static void main(String[] args) {
SqlSession sqlSession = MybatisUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<teacher> teachers = mapper.selectAll();
for (teacher t1:teachers
) {
System.out.println(t1);
}
}
}
获得成功!!
![](https://img-blog.csdnimg.cn/4be211d7624244f6b77ecbf364daff75.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAWW9rZV9fX19fXw==,size_16,color_FFFFFF,t_70,g_se,x_16)