MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。以下为我在学习和实战练习过程中所做的笔记,可供参考。
一、Mybatis 概述
MyBatis 是一款优秀的持久层框架,用于简化 JDBC 开发。
MyBatis 本是 Apache 的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
官网:https://mybatis.org/mybatis-3/zh/index.html 。
持久层:负责将数据到保存到数据库的那一层代码。以后开发我们会将操作数据库的 Java 代码作为持久层。而 Mybatis 就是对 jdbc 代码进行了封装。
JavaEE三层架构:表现层、业务层、持久层。
框架:框架就是一个半成品软件,是一套可重用的、通用的、软件基础代码模型。在框架的基础之上构建软件编写更加高效、规范、通用、可扩展。
JDBC 缺点
硬编码:注册驱动、获取连接代码有很多字符串,而这些是连接数据库的四个基本信息,以后如果要换成其他的关系型数据库的话,要修改源代码。如果表结构发生变化,SQL语句就要进行更改。这也不方便后期的维护。
操作繁琐:手动设置参数。手动封装结果集。
使用Mybatis 优化:硬编码可以配置到配置文件,操作繁琐的地方 MyBatis 都自动完成。
MyBatis 快速入门
需求:查询 user 表中所有的数据。
创建 user 表,添加数据。
1 2 3 4 5 6 7 8 9 10 11 12 13
| create database mybatis; use mybatis; drop table if exists tb_user; create table tb_user( id int primary key auto_increment, username varchar(20), password varchar(20), gender char(1), addr varchar(30) ); INSERT INTO tb_user VALUES (1, 'zhangsan', '123', '男', '北京'); INSERT INTO tb_user VALUES (2, '李四', '234', '女', '天津'); INSERT INTO tb_user VALUES (3, '王五', '11', '男', '西安');
|
创建模块,导入坐标:需要在项目的 resources 目录下创建 logback 的配置文件。
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"?> <configuration>
<appender name="Console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>[%level] %blue(%d{HH:mm:ss.SSS}) %cyan([%thread]) %boldGreen(%logger{15}) - %msg %n</pattern> </encoder> </appender>
<logger name="com.itheima" level="DEBUG" additivity="false"> <appender-ref ref="Console"/> </logger>
<root level="DEBUG"> <appender-ref ref="Console"/> </root> </configuration>
|
在创建好的模块中的 pom.xml 配置文件中添加依赖的坐标。
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
| <dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.5</version> </dependency>
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.46</version> </dependency>
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13</version> <scope>test</scope> </dependency>
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.20</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.2.3</version> </dependency> </dependencies>
|
编写 MyBatis 核心配置文件 — > 替换连接信息 解决硬编码问题。
- 在模块下的 resources 目录下创建 MyBatis 的配置文件
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 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| <?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>
<typeAliases> <package name="com.itheima.pojo"/> </typeAliases>
<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:///mybatis?useSSL=false"/> <property name="username" value="root"/> <property name="password" value="1234"/> </dataSource> </environment>
<environment id="test"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/> <property name="username" value="root"/> <property name="password" value="1234"/> </dataSource> </environment> </environments> <mappers> <mapper resource="UserMapper.xml"/> </mappers> </configuration>
|
编写 SQL 映射文件:统一管理sql语句,解决硬编码问题。
- 在模块的
resources
目录下创建映射配置文件 UserMapper.xml
,内容如下:
1 2 3 4 5 6 7
| <?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"> <mapper namespace="test"> <select id="selectAll" resultType="com.itheima.pojo.User"> select * from tb_user; </select> </mapper>
|
编码
- 在
com.itheima.pojo
包下创建 User类。
1 2 3 4 5 6 7 8
| public class User { private int id; private String username; private String password; private String gender; private String addr; }
|
- 在
com.itheima
包下编写 MybatisDemo 测试类。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public class MyBatisDemo { public static void main(String[] args) throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = sqlSessionFactory.openSession(); List<User> users = sqlSession.selectList("test.selectAll"); System.out.println(users); sqlSession.close(); } }
|
二、Mapper 代理开发
Mapper 代理方式的目的:解决原生方式中的硬编码,简化后期执行SQL。
使用 Mapper 代理要求
定义与 SQL 映射文件同名的 Mapper 接口,并且将 Mapper 接口和 SQL 映射文件放置在同一目录下。
设置 SQL 映射文件的 namespace 属性为 Mapper 接口全限定名。
在 Mapper 接口中定义方法,方法名就是 SQL 映射文件中 sql 语句的 id,并保持参数类型和返回值类型一致。
Mapper 代理代码实现
在 com.itheima.mapper
包下创建 UserMapper接口,代码如下:
1 2 3 4
| public interface UserMapper { List<User> selectAll(); User selectById(int id); }
|
在 resources
下创建 com/itheima/mapper
目录,并在该目录下创建 UserMapper.xml 映射配置文件:
1 2 3 4 5 6 7 8
|
<mapper namespace="com.itheima.mapper.UserMapper"> <select id="selectAll" resultType="com.itheima.pojo.User"> select * from tb_user; </select> </mapper>
|
在 com.itheima
包下创建 MybatisDemo2 测试类,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
public class MyBatisDemo2 {
public static void main(String[] args) throws IOException {
String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); List<User> users = userMapper.selectAll();
System.out.println(users); sqlSession.close(); } }
|
如果Mapper接口名称和SQL映射文件名称相同,并在同一目录下,则可以使用包扫描的方式简化SQL映射文件的加载。
也就是将核心配置文件的加载映射配置文件的配置修改为:
1 2 3 4 5 6
| <mappers> <package name="com.itheima.mapper"/> </mappers>
|
三、MyBatis 核心配置文件
多环境配置
在核心配置文件的 environments
标签中其实是可以配置多个 environment
,使用 id
给每段环境起名,在 environments
中使用 default='环境id'
来指定使用哪儿段配置。一般就配置一个 environment
即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| <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:///mybatis?useSSL=false"/> <property name="username" value="root"/> <property name="password" value="1234"/> </dataSource> </environment>
<environment id="test"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/> <property name="username" value="root"/> <property name="password" value="1234"/> </dataSource> </environment> </environments>=
|
类型别名
在映射配置文件中的 resultType
属性需要配置数据封装的类型(类的全限定名)。
Mybatis 提供了 类型别名
(typeAliases) 可以简化这部分的书写。
首先需要现在核心配置文件中配置类型别名,也就意味着给pojo包下所有的类起了别名(别名就是类名),不区分大小写。
1 2 3 4
| <typeAliases> <package name="com.itheima.pojo"/> </typeAliases>
|
通过上述的配置,我们就可以简化映射配置文件中 resultType
属性值的编写。
1 2 3 4 5
| <mapper namespace="com.itheima.mapper.UserMapper"> <select id="selectAll" resultType="user"> select * from tb_user; </select> </mapper>
|