Mybatis的基本工作流程

1.读取配置文件,配置文件包含数据库连接信息和Mapper映射文件或者Mapper包路径。

2.有了这些信息就能创建SqlSessionFactory,SqlSessionFactory的生命周期是程序级,程序运行的时候建立起来,程序结束的时候消亡

3.SqlSessionFactory建立SqlSession,目的执行sql语句,SqlSession是过程级,一个方法中建立,方法结束应该关闭

4.当用户使用mapper.xml文件中配置的的方法时,mybatis首先会解析sql动态标签为对应数据库sql语句的形式,并将其封装进MapperStatement对象,然后通过executor将sql注入数据库执行,并返回结果。

5.将返回的结果通过映射,包装成java对象。

MyBatis开发步骤

Mybatis项目开发步骤
1.建库建表

-- 建库
create database `mybatis`;

-- 建表
CREATE TABLE `employee` (
`id` int(20) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`age` int(3) DEFAULT NULL,
`sex` varchar(1) DEFAULT NULL,
`birthday` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
)DEFAULT CHARSET=utf8;

创建成功之后在表中添加信息:

Mybatis的基本工作流程和MyBatis开发步骤_mybatis


2.创建maven项目

Mybatis的基本工作流程和MyBatis开发步骤_mybatis_02


Mybatis的基本工作流程和MyBatis开发步骤_sql_03


项目创建完毕的初始目录:

Mybatis的基本工作流程和MyBatis开发步骤_mysql_04


初始pom.xml文件

3.引入依赖(配置pom.xml)

?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>cn.ymsd</groupId>
<artifactId>MybatisDemo</artifactId>
<version>1.0-SNAPSHOT</version>

<dependencies>
<!-- mybatis核心包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.1</version>
</dependency>
<!-- mysql驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.26</version>
</dependency>
<!-- junit测试包 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<!-- 局部jdk 1.8配置,pom.xml中 -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>

4.创建核心配置文件(mybatis-condig.xml)
4.1 准备数据库配置文件(db.properties)

#驱动全限定类名
jdbc.driverClassName=com.mysql.jdbc.Driver
#数据库连接地址
#url=jdbc:mysql://localhost:8080//mybatis
jdbc.url=jdbc:mysql:///mybatis
#数据库用户名
jdbc.username=root
#数据库密码
jdbc.password=123456

4.2 配置mybatis-condig.xml

MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。能配置的内容如下: configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)
<<<注意元素节点的顺序!顺序不对会报错 >>>


<?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>
<!-- 加载properties文件,一般都是存放数据库连接信息的文件 -->
<properties resource="db.properties"/>

<!-- 环境标签 可能连接多个数据库 可以在environments下面创建多个连接 default:默认,值就是对应下面的环境id -->
<environments default="mysql">
<environment id="mysql">
<!-- 配置事务 JDBC:支持事务 MANAGED:什么都不做 -->
<transactionManager type="JDBC"/>
<!-- 配置数据源dataSource 支持数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>

</configuration>

5.建包

src/main/java 
--创建domain包(存放javabean)
--创建mapper包(存放mapper接口,接口内定义了对数据库CRUD的抽象方法)
--创建utils包(存放工具类)
src/main/resources
--创建mapper文件夹(存放映射文件mapper.xml)
src/test/java
--创建mapper包(存放测试文件)

6.创建实体类(domain)
实体类的属性要和数据库里面表的字段相对应,数据类型采用包装类。

package cn.ymsd.domain;

import java.util.Date;
/**
* @Description: Employee实体类
* @Author: ZHl
* @Date: 2022-08-18 10;00
*/
public class Employee {
private Long id;//编号
private String name;//姓名
private Integer age;//年龄
private String sex;//性别
private Date birthday;//生日

public Employee() {
}

public Employee(Long id, String name, Integer age, String sex, Date birthday) {
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
this.birthday = birthday;
}

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Integer getAge() {
return age;
}

public void setAge(Integer age) {
this.age = age;
}

public String isSex() {
return sex;
}

public void setSex(String sex) {
this.sex = sex;
}

public Date getBirthday() {
return birthday;
}

public void setBirthDay(Date birthday) {
this.birthday = birthday;
}

@Override
public String toString() {
return "Employee{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", sex=" + sex +
", birthday=" + birthday +
'}';
}
}

7.创建Xxxmapper接口(mapper)
接口中定义对数据库进行操作的方法:

package cn.ymsd.mapper;

import cn.ymsd.domain.Employee;

import java.util.List;

/**
* @Description:
* @Author: ZHl
* @Date: 2022-08-18 10:05
*/
public interface EmployeeMapper {

//查询所有信息
List<Employee> findAllEmp();
}

8.创建Xxxmapper.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">

<!--namespace:该映射文件对应的接口的路径 -->
<mapper namespace="cn.ymsd.mapper.EmployeeMapper">

</mapper>
Mapper中的namespace(命名空间)用于绑定指定接口,对sql进行分类化管理,即面向接口编程。
通过namesapce的绑定直接通过id找到相应方法,执行相应的SQL语句。

8.1 在Xxxmapper.xml中编写sql语句
<?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">

<!--namespace:该映射文件对应的接口的路径-->
<mapper namespace="cn.ymsd.mapper.EmployeeMapper">

<select id="findAllEmp" resultType="cn.ymsd.domain.Employee">
SELECT * FROM employee
</select>

</mapper>

 id: 表示此段sql执行语句的唯一标识,也是接口的方法名称(必须一致才能找到方法)
resultType: 定义返回值类型,这里返回JavaBean类型
parameterType: 此参数是指定传入参数的类型
注意: parameterType可以不用写,mybatis在传参的时候会自动进行参数类型匹配,一般情况下parameterType可以不用写

8.2 在mybatis-config.xml中引入mapper映射文件
告诉MyBatis 去哪里找映射文件:

 <mappers>
<!-- 加载mapper.xml文件-->
<mapper resource="cn/ymsd/mapper/EmployeeMapper.xml"/>
</mappers>

9.创建MybatisUtils工具类

package cn.ymsd.utils;

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;

/**
* @Description:
* @Author: ZHl
* @Date: 2022-08-17 11:22
*/
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory = null;

static {
InputStream resourceAsStream;
try {
// 获取资源文件的流对象
resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
// 构建sqlSessionFactory
sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
} catch (IOException e) {
throw new RuntimeException(e);
}
}

/**
* 打开数据库的会话对象
*/
public static SqlSession getSqlSession(){
if (sqlSessionFactory != null) {
return sqlSessionFactory.openSession();
}
return null;
}

/**
* 关闭会话对象
* @param sqlSession
*/
public static void closeSqlSession(SqlSession sqlSession){
if (sqlSession != null) {
// 关闭会话对象之前提交事务
sqlSession.commit();
sqlSession.close();
}
}
}

10.创建测试类

package cn.ymsd.mapper;

import cn.ymsd.domain.Employee;
import cn.ymsd.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

/**
* @Description:
* @Author: ZHl
* @Date: 2022-08-18 14:33
*/
public class EmployeeMapperTest {

//获取会话对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//获取mapper接口对象
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);

@Test
public void testFindAllEmp(){
List<Employee> allEmp = mapper.findAllEmp();
allEmp.forEach(System.out::println);
}

}

测试结果:

Mybatis的基本工作流程和MyBatis开发步骤_sql_05

项目完成后的目录:

Mybatis的基本工作流程和MyBatis开发步骤_java_06