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 { String resource = "mybatis-config.xml"; InputStream is = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is); SqlSession session = sqlSessionFactory.openSession(); List<Job> jobs = session.selectList("test.selectAll"); System.out.println(jobs); 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
配置文件的位置。
项目结构:
Main.java
1 2 3
| 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
。
查询
设计到查询时,我们需要关注参数如何传播。有两种方式:
此外,如果我们的查询条件中有 >
等特殊字符,同样有两种方法:
之前我们一直在讨论单条件查询,接下来,我们来剖析一下多条件查询。
与单条件查询不同,多条件查询有多个参数,MyBatis
是如何知道参数对应哪个位置呢?
- 使用
@Param(占位符)
注解
- 使用实体类
- 使用 map 集合
但是如果多条件查询中的条件数目可变 (动态 SQL),又该如何描述 sql
语句呢?MyBatis 为我们提供了逻辑判断标签来解决。