MyBatis

MyBatis

快速入门

首先,我们需要导入依赖包。

1
2
3
4
5
6
7
8
9
10
<dependency>  
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>

第一步,在 resources 文件夹下创建 mybatic-config.xml 。此配置文件可以在 mybatis 官网找到,主要用来配置 sql 数据源以及 mapper 文件的存放位置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://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/atguigudb"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="JobMapper.xml"/>
</mappers>
</configuration>

第二步,同样在 resources 文件夹下新建 mapper 配置文件,如 JobMapper.xml 。Mapper 文件也就是存放着对数据库操作的 SQL 语句。

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="test">
<select id="selectAll" resultType="cn.d4wn.pojo.Job">
select * from jobs
</select>
</mapper>

其中 id 代表着下面这条 sql 语句,而 namespace 是命名空间,因为不同的表可能有相同的命令,例如,都是 seleseAll。右边的 resultType 也就是我们的实体类对象,注意要使用全类名。

第三步,执行 SQL 语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Main {  
public static void main(String[] args) throws IOException {
// 创建 session 对象
String resource = "mybatis-config.xml";
InputStream is = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = sqlSessionFactory.openSession();
// 执行SQL语句
List<Job> jobs = session.selectList("test.selectAll");
System.out.println(jobs);
// 关闭Session
session.close();
}
}

首先加载配置文件,然后就可以通过 命名空间.id 调用我们的 SQL 语句了。

以上就是 MyBatis 框架中的 "Hello World"。不难看出,创建 session 对象的代码其实有很多都是一次性的,只需要复制粘贴即可。而此时操作 SQL 的流程其实有很多可以优化的地方,这将在下面详细介绍。

代码:模块 MyBatisDemo1

Mapper 代理开发

总体流程

首先,加载 mybatis-config.xml 的代码没有变,创建的 session 对象也没有变。接下来就是调用 session 对象的方法,之前我们使用的是 命名空间.id,但是这种使用硬编码的格式并不好,我们能否想办法解决硬编码的问题呢?

答案是肯定的,我们可以单独建立一个 mappers 包,里面存放着各种接口,同级目录下有各种对应的 mapper 配置文件。那么,当加载该接口时,就会转而加载该接口下与之同名的 mapper 配置文件。

而当我们调用接口的某方法时,就会去对应的 mapper 文件中查找对应的 id,进而执行指定的 sql。

因此,要想实现 mapper 代理开发,需要做到 3 件事情:

  • 定义 Mapper 接口 (接口名与 mapper 配置文件相同),在 Mapper 接口中定义方法 (即 mapper 配置文件的 id)。保证 mapper 配置文件与接口在同一目录下。
  • 设置 mapper 文件中的 namespace 为 Mapper 接口的全限定名。
  • mybatis-config.xml 中设置 mapper 配置文件的位置。

项目结构:

|331

Main.java

1
2
3
// 执行SQL语句  
JobMapper mapper = session.getMapper(JobMapper.class);
List<Job> jobs = mapper.selectAll();

JobMapper.xml

1
2
3
4
5
<mapper namespace="cn.d4wn.mappers.JobMapper">  
<select id="selectAll" resultType="cn.d4wn.pojo.Job">
select * from jobs
</select>
</mapper>

JobMapper.java

1
2
3
public interface JobMapper {  
List<Job> selectAll();
}

代码:模块 MyBatisDemo2

别名配置

前面我们在配置 resultType 的时候,需要使用到实体类的全限定名,我们可以通过配置别名来简化。

mybatis-config.xml 中,添加配置如下:

1
2
3
<typeAliases>  
<package name="cn.d4wn.pojo"/>
</typeAliases>

上面指明的是实体类的包。然后在 returnType 中就不必指明全类名了。

1
2
3
4
5
<mapper namespace="cn.d4wn.mappers.JobMapper">  
<select id="selectAll" resultType="job">
select * from jobs
</select>
</mapper>

这里的 job 也可以是 Job,不区分大小写。

代码:模块 MyBatisDemo3

ResultMap

一般来说,实体类中的属性遵循小驼峰命名规则,而数据库中的字段名则可能是下划线,这就起了冲突,而 resultMap 可以用来解决这个问题。

1
2
3
4
5
6
7
<resultMap id="JobMap" type="job">  
<result column="job_title" property="jobTitle"/>
</resultMap>

<select id="selectAll" resultMap="JobMap">
select * from jobs
</select>

column 即数据库中的字段,property 即实体类中的属性名。type 指的是实体类。

注意,如果是查询全部的操作,从数据库中查询出的数据,是按照列顺序进入实体类的构造参数。

例如,若实体类的构造函数参数为 (String jobId, String jobTitle, int minSalary, int maxSalary),而查询出的列为 (job_id, jot_title, min_salary, max_salary)。二者将一一对应,此时不需要 resultMap 也可以。但是如果不是查询全部列,而是单一列名,或者列顺序与构造参数不一致,则需要使用 resultMap

查询

设计到查询时,我们需要关注参数如何传播。有两种方式:

  • #{xxx}
  • ${xxx}:有 sql 注入问题

此外,如果我们的查询条件中有 > 等特殊字符,同样有两种方法:

  • 转义,如 &gt;
  • <![CDATA[内容]]>

之前我们一直在讨论单条件查询,接下来,我们来剖析一下多条件查询。

与单条件查询不同,多条件查询有多个参数,MyBatis 是如何知道参数对应哪个位置呢?

  • 使用 @Param(占位符) 注解
  • 使用实体类
  • 使用 map 集合

但是如果多条件查询中的条件数目可变 (动态 SQL),又该如何描述 sql 语句呢?MyBatis 为我们提供了逻辑判断标签来解决。


MyBatis
https://d4wnnn.github.io/2024/04/01/Dev/MyBatis/
作者
D4wn
发布于
2024年4月1日
许可协议