1、创建数据库
使用SQL
创建一个名称为 mybatis
的的数据库,并船舰一个名为 tb_brand
的表,创建初始测试数据。
-- 删除tb_brand表
drop table if exists tb_brand;
-- 创建tb_brand表
create table tb_brand
(
-- id 主键
id int primary key auto_increment,
-- 品牌名称
brand_name varchar(20),
-- 企业名称
company_name varchar(20),
-- 排序字段
ordered int,
-- 描述信息
description varchar(100),
-- 状态:0:禁用 1:启用
status int
);
-- 添加数据
insert into tb_brand (brand_name, company_name, ordered, description, status)
values ('三只松鼠', '三只松鼠股份有限公司', 5, '好吃不上火', 0),
('华为', '华为技术有限公司', 100, '华为致力于把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界', 1),
('小米', '小米科技有限公司', 50, 'are you ok', 1);
创建的数据库表如下图:
2、接下来创建一个Maven项目用来测试用例:
(1)在IDEA中创建一个普通的Maven项目。(有对创建项目感兴趣的朋友可以参看文章《springboot基础篇(快速入门+要点总结)》)。
(2)在porm.xml文件中导入mybatis相关依赖
<!-- 导入Maven依赖 -->
<dependencies>
<!-- MySQL驱动依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!-- MyBatis依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<!-- junit依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
3、创建MyBatis核心配置文件
(可以参考官网的配置文件方法:https://mybatis.org/mybatis-3/)
在Maven子项目的src/main/resources
目录下新建一个名称为mybatis-config.xml
的配置文件。该配置文件中包含了对MyBatis
系统的核心设置,包括获取数据库连接实例的数据源(DataSource
)、决定事务作用域和控制方式的事务管理器(TransactionManager
)、注册所有的XML映射器配置文件等。
<?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">
<!--MyBatis核心配置文件-->
<configuration>
<environments default="development">
<!--开发环境-->
<environment id="development">
<!--事务管理器-->
<transactionManager type="JDBC"/>
<!--数据源-->
<dataSource type="POOLED">
<!--驱动(固定写法)-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<!--连接信息(URL、用户名和密码)-->
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8&useSSL=true"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--注册所有的映射器-->
<mappers>
<mapper resource="com/atangbiji/dao/UserMapper.xml"/>
</mappers>
</configuration>
-
数据源连接信息与使用IDEA连接数据库相同(可参看文章《解锁MyBatis:探索数据库交互的奇妙之旅》)
-
每一个Mapper.xml映射配置文件都需要在MyBatis和配置中心进行注册
4、封装MyBaris工具类
在项目中创建一个utils包,用来创建封装的MyBatis工具类,MyBatisUtils.java,用来获取SqlSession对象。
package com.atangbiji.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;
//MyBatis工具类
public class MyBatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
//从XML中构建SqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
//从SqlSessionFactory中获取SqlSession对象
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
//重载getSqlSession方法
//若autoCommit为true:则事务自动提交;若autoCommit为false:则需要手动提交事务。
public static SqlSession getSqlSession(boolean autoCommit){
return sqlSessionFactory.openSession(autoCommit);
}
}
`SqlSessionFactory` 类是 MyBatis 应用的核心类,它的实例可以通过 `SqlSessionFactoryBuilder` 类创建。`SqlSessionFactoryBuilder` 可以从 `mybatis-config.xml` 核心配置文件中构建出 `SqlSessionFactory` 实例。从 `SqlSessionFactory` 中我们可以获取 `SqlSession` 对象。`SqlSession` 类提供了在数据库执行 SQL 命令所需的所有方法,通过 `SqlSession` 实例我们可以直接执行已映射的 SQL 语句。虽然我们可以将事务设置为自动提交,但在实际项目中为了数据的安全,建议手动提交事务。这样可以确保在执行一系列数据库操作后,只有当所有操作都成功完成时才提交事务,否则可以回滚到操作前的状态,保障数据的完整性和一致性。
5、创建与表对应的实体类,用来做关系映射
在项目的pojo包中创建Brand 实体类
public class Brand {
// id 主键
private Integer id;
// 品牌名称
private String brandName;
// 企业名称
private String companyName;
// 排序字段
private Integer ordered;
// 描述信息
private String description;
// 状态:0:禁用 1:启用
private Integer status;
//省略 setter and getter。自己写时要补全这部分代码
}
安装 MyBatisX 插件
-
MybatisX 是一款基于 IDEA 的快速开发插件,为效率而生。
-
主要功能
-
XML映射配置文件 和 接口方法 间相互跳转
-
根据接口方法生成 statement
-
-
安装方式
点击 file ,选择 settings ,就能看到如下图所示界面
注意:安装完毕后需要重启IDEA
红色头绳的表示映射配置文件,蓝色头绳的表示mapper接口。在mapper接口点击红色头绳的小鸟图标会自动跳转到对应的映射配置文件,在映射配置文件中点击蓝色头绳的小鸟图标会自动跳转到对应的mapper接口。也可以在mapper接口中定义方法,自动生成映射配置文件中的 statement ,如图所示
6、创建接口映射器
在项目的持久层中创建接口映射器(持久层映射器用于存放已经编写号的持久层代码,用来实际操作数据库)可参看文章MyBatis 动态sql必须要掌握的标签你知道吗
public interface BrandMapper {
/**
* 查询所有
*/
List<Brand> selectAll();
}
注:映射器接口中的接口函数是用来映射xml配置文件中对应标签的sql标签的
7、创建XML映射器配置文件(重点)
在项目的resources下创建映射器的配置文件BrandMapper.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">
<!--命名空间,用来绑定对应Mapper-->
<mapper namespace="com.itheima.mapper.BrandMapper">
<select id="selectAll" resultType="brand">
select *
from tb_brand;
</select>
</mapper>
在 MyBatis 项目中,与 JDBC 不同的是不再需要创建映射器接口的实现类。相反,我们使用一个 XML 映射器配置文件取代了 JDBC 项目中的接口实现类,从而减少了几乎所有的 JDBC 代码。在这个 XML 映射器配置文件中,我们只需配置以下标签属性:
-`namespace`:对应映射器接口的全限定名。
- `id`:对应映射器接口中的方法名。
- `resultType`:SQL 语句执行结果所对应的实体类(POJO)的全限定名。
需要注意的是:
- XML 映射器配置文件通过标签的方式实现 SQL 语句与映射器接口函数的映射。
- 每个标签对应一条 SQL 语句(即一个业务)。
- XML 映射器配置文件中的标签与映射器接口中的接口函数一一对应。
- 如果传入参数(`parameterType`)为简单类型(包括:基本数据类型、String、Date 等),则 `#{}` 预编译占位符中的形参与对应映射器接口函数的形参一一对应。
- 如果传入参数(`parameterType`)为实体类(POJO)类型,则 `#{}` 预编译占位符中的形参与该实体类的成员变量一一对应。
- 如果传入参数(`parameterType`)为 Map 类型,则 `#{}` 预编译占位符中的形参与该 Map 中键名(key)一一对应。
命名空间的作用主要有两个:
1. 利用更长的全限定名来将不同的 SQL 语句隔离开来。
2. 实现接口绑定。
一个 XML 映射器配置文件中,可以定义无数个 SQL 映射语句。为了增加代码的可读性,建议将 XML 映射器配置文件与映射器接口文件放在同一(dao)目录下。
8、测试
在项目的 src/test/java
目录下,创建MybatisTest 类中编写测试查询所有的方法
@Test
public void testSelectAll() throws IOException {
//1. 获取SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2. 获取SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//3. 获取Mapper接口的代理对象
BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
//4. 执行方法
List<Brand> brands = brandMapper.selectAll();
System.out.println(brands);
//5. 释放资源
sqlSession.close();
}
注意:现在我们感觉测试这部分代码写起来特别麻烦,我们可以先忍忍。以后我们只会写上面的第3步的代码,其他的都不需要我们来完成。
从上面结果我们看到了问题,有些数据封装成功了,而有些数据并没有封装成功。为什么这样呢?
这个问题可以通过两种方式进行解决:
-
给字段起别名
-
使用resultMap定义字段和属性的映射关系
起别名解决上述问题
起别名 + sql片段的方式可以解决上述问题,但是它也存在问题。如果还有功能只需要查询部分字段,而不是查询所有字段,那么我们就需要再定义一个 SQL 片段,这就显得不是那么灵活。
那么我们也可以使用resultMap来定义字段和属性的映射关系的方式解决上述问题。
-
在映射配置文件中使用resultMap定义 字段 和 属性 的映射关
注意:在上面只需要定义 字段名 和 属性名 不一样的映射,而一样的则不需要专门定义出来。
小结
实体类属性名 和 数据库表列名 不一致,不能自动封装数据
-
==起别名:==在SQL语句中,对不一样的列名起别名,别名和实体类属性名一样
-
可以定义 <sql>片段,提升复用性
-
-
==resultMap:==定义<resultMap> 完成不一致的属性名和列名的映射
而我们最终选择使用 resultMap的方式。查询映射配置文件中查询所有的 statement 书写如下:
<resultMap id="brandResultMap" type="brand">
<!--
id:完成主键字段的映射
column:表的列名
property:实体类的属性名
result:完成一般字段的映射
column:表的列名
property:实体类的属性名
-->
<result column="brand_name" property="brandName"/>
<result column="company_name" property="companyName"/>
</resultMap>
<select id="selectAll" resultMap="brandResultMap">
select *
from tb_brand;
</select>
注:喜欢的朋友可以关注公众号“JAVA学习课堂”方便阅读,内容更丰富哦。