1.MyBatis快速入门

MyBatis快速入门

  1. 第一个MyBatis起步案例
  2. 第一个MyBatis起步案例解析
  3. 基于Java的配置方式说明

生日快乐!🎂🎂🎂🎉🎉🎉🎉🎉

MyBatis初体验

0.需要编写的文件

  • Mybatis总配置文件(Mybatis-config.xml
  • SQL映射文件(Mapper.xml
  • DAO接口
  • 实体类

1.创建MyBatis项目

首先确保你的项目工程和下面的一样,创建的是Maven项目。

image-20220630164435677

2.添加坐标

pom.xml文件里面,需要添加MyBatis的依赖。

1
2
3
4
5
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>

理论上只需要添加这个依赖就可以使用MyBatis了,但是在快速上手案例中,除了核心的MyBatis之外,还需要加几个框架:

  • junit4:测试框架,用来测试MyBatis的运行
  • mysql驱动包:连接MySQL数据库的驱动包
  • slf4j(log4j):日志框架

注意版本问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<!-- junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>

<!-- 驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
</dependency>

<!-- slf4j -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.33</version>
</dependency>

<!-- slf4j实现log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>

<!-- slf4j--log4j的适配器 -->
<!-- 类似于Spring和Mybatis的整合需要的Mybatis-Spring框架一样-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.12</version>
</dependency>

3.创建数据库

4.配置总配置文件(Mybatis-config.xml)

配置mybatis-Config.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?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>
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="UNPOOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/oracleData"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mappers/DepartmentDAOMapper.xml"/>
</mappers>
</configuration>

Mybatis的总配置文件里面有好多配置,这里稍微解释下这几个配置的一些作用:

configuration:作为一个主体配置,是总配置文件里面必须要有的标签,是一个顶层标签。

settingsMybatis框架中的各种设置就靠这个标签,以setting子标签为主题,Mybatis为我们提供了很多以键值对的形式存在的配置,我们通过配置这些键值对,可以把Mybatis框架调教配置得更加好用。

environments:这个标签可以说是核心配置了,主要用来配置与数据库连接有关的东西,如连接URL、连接用户名、连接密码等。同样的,拥有子标签environment,实际上可以配置多套environment(合理,毕竟有些时候涉及到多个数据库连接),只要设置了default属性,说明使用哪套环境即可。

剩下的有一个dataSource标签,这个标签里面的东西,用过JDBC的同学估计都不会陌生,第一个driver是驱动包的驱动文件,第二个url是连接地址,第三个username是用户名,第四个password是密码。这四个配置需要根据实际情况自己做更改

mappers:该标签指定mapper映射文件的位置,所谓的mapper文件,我们一般称之为mapper映射文件,这个文件一般存放我们执行的SQL语句,并且和我们的DAO接口绑定在一起。

5.创建实体类

创建domains/Department.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package domains;

public class Department {
private Integer DEPTNO;
private String DNAME;
private String LOC;

@Override
public String toString() {
return "Department{" +
"DEPTNO=" + DEPTNO +
", DNAME='" + DNAME + '\'' +
", LOC='" + LOC + '\'' +
'}';
}

public Integer getDEPTNO() {
return DEPTNO;
}

public Department setDEPTNO(Integer DEPTNO) {
this.DEPTNO = DEPTNO;
return this;
}

public String getDNAME() {
return DNAME;
}

public Department setDNAME(String DNAME) {
this.DNAME = DNAME;
return this;
}

public String getLOC() {
return LOC;
}

public Department setLOC(String LOC) {
this.LOC = LOC;
return this;
}
}

所谓的实体类,也叫做Bean,通过实体类创建出来的对象在数据库层面可以代表一行数据。那么啥是实体类对象呢?大家可以把实体类对象看成是一个个业务数据。

正如我们所说,实体类主要是承载我们开发的时候需要的业务数据,这些数据以类级别变量(字段)的形式存在,类似于我们学习C时候的结构体。但实体类的组成添加了面向对象的特性,因此在获取实体类的数据的时候,我们需要给它编写setXXX()getxxx()方法,我们一般称这一类的方法为SetterGetter,除此之外,当我们需要把这个对象用于传输的时候,还需要把这个对象写成字符串的形式,因此还会有个方法叫toString()

image-20220630222459990

6.创建DAO接口

大家在学习JavaWeb的时候都会接触到一种对数据库的设计架构,叫DAO,在DAO架构里面,我们即需要些DAO接口,还需要写实现类。

那么所谓的DAO接口又是啥?传送门暂不可用

那我们现在创建一个简单的DAO

创建java/mappers/DepartmentDAO接口

1
2
3
4
5
6
7
8
9
package mappers;

import domains.Department;

import java.util.List;

public interface DepartmentDAO {
List<Department> selectAll();
}

7.创建映射配置文件

我们之前稍微提了一嘴,所谓的映射配置文件,它的主要用于存储SQL语句吧,同时跟DAO的接口方法绑定在一起。那具体这个映射配置文件是怎么生效的,后面再介绍,这里可以先按着我写:

创建在resource/mappers/DepartmentDAOMapper.xml文件

1
2
3
4
5
6
7
8
9
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="mappers.DepartmentDAO">
<select id="selectAll" resultType="domains.Department">
SELECT DEPTNO, DNAME, LOC
FROM dept
</select>
</mapper>

8.配置日志框架配置文件

配置日志框架不属于mybatis的具体内容。所以这里不具体介绍了。照着写吧

配置log4j.properties文件

1
2
3
4
5
6
7
8
# 全局配置
log4j.rootLogger=ERROR, stdout
# Mybatis日志配置
log4j.logger.mapper=TRACE
# 控制台输出配置
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

9.运行MyBatis

现在只剩下一步了,只要运行了这一步MyBatis就能够跑起来了。这一步通常用于测试数据库连接用。想要运行MyBatis需要靠测试框架JUnit

要想把MyBatis跑起来,需要按照这个步骤:

1.创建SqlSessionFactoryBuilder对象,传入总配置文件

2.通过SqlSessionFactoryBuilderbuild()创建SqlSessionFactory

3.通过SqlSessionFactoryopenSession()创建SqlSession

4.通过

src/test/java/DepartmentMapperTest.java文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package mappers;

import domains.Department;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.function.Consumer;

public class DepartmentMapperTest {

private static SqlSessionFactory sqlSessionFactory;

@Before
public void init() throws IOException {
InputStream stream = getClass().getResourceAsStream("../mybatis-config.xml");
// 1.创建SqlSessionFactoryBuilder
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 2.创建SqlSessionFactory
sqlSessionFactory = sqlSessionFactoryBuilder.build(stream);
stream.close();
}

@Test
public void testSelectAll(){
// 3.创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 4.获取DAO接口实现类
DepartmentDAO departmentDAO = sqlSession.getMapper(DepartmentDAO.class);
// 5.执行查询
List<Department> countries = departmentDAO.selectAll();
countries.forEach(new Consumer<Department>() {
public void accept(Department country) {
System.out.println(country);
}
});
// 6.记得关闭sqlSession
sqlSession.close();
}
}

10.运行结果

image-20220630230852521

如果你的控制台能够打印出这样的东西,那恭喜你。MyBatis的第一个入门案例,搞定啦!🎉🎉🎉

MyBatis初体验解析

在这里我们解析一下MyBatis的一些运行细节:

首先第一步我们需要定义一个mybatis-config.xml这个也是MyBatis的总配置文件,里面最核心的东西是定义数据库的连接URL、驱动、用户名、密码等。当我们把定义好的总配置文件传递给SqlSessionFactoryBuilderSqlSessionFactoryBuilder通过build()+总配置文件构建出SqlSessionFactory代表一套连接环境。然后再通过SqlSessionFactoryopenSession(),拿到SqlSession对象,SqlSessiongetMapper()获取DAO接口的实现类,从而走上人生巅峰进行SQL语句查询。

基于Java代码的总配置文件起步

当然也可以使用Java代码的形式来代替XML的形式来配置起步,这里只贴上代码,并稍微解释下步骤:

  1. 创建DataSource对象
  2. 创建TransactionFactory对象,对应transactionManager标签
  3. 创建Environment对象,相当于environment标签
  4. 创建Configuration对象,相当于configuration标签
  5. 创建SqlSessionFactoryBuilder对象,传入Configuration对象
  6. 接下来的步骤和测试时候一模一样
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
@Test
public void testSelectAll2(){
// 配置Configuration类
// 1.创建DataSource对象
MysqlDataSource mysqlDataSource = new MysqlDataSource();
mysqlDataSource.setURL("jdbc:mysql://localhost:3306/oracleData");
mysqlDataSource.setUser("root");
mysqlDataSource.setPassword("sujiewei");
// 2.创建TransactionFactory对象,对应transactionManager标签
TransactionFactory transactionFactory = new JdbcTransactionFactory();
// 3.创建Environment对象,相当于environment标签
Environment environment = new Environment("development", transactionFactory, mysqlDataSource);
// 4.创建Configuration对象,相当于configuration标签
Configuration configuration = new Configuration(environment);
configuration.addMapper(DepartmentDAO.class);

SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
sqlSessionFactory = sqlSessionFactoryBuilder.build(configuration);
SqlSession sqlSession = sqlSessionFactory.openSession();
DepartmentDAO departmentDAO = sqlSession.getMapper(DepartmentDAO.class);
List<Department> countries = departmentDAO.selectAll();
countries.forEach(new Consumer<Department>() {
public void accept(Department country) {
System.out.println(country);
}
});
sqlSession.close();
}

实际上总配置文件里面的所有东西,都能通过Java代码的形式进行构建。像Settings标签、typealisa标签等。