02-Mybatis入门案例
本节学习完成入门案例的编写,这是每次学习新的知识上手实操的第一步,编写入门案例的整体流程为:搭建环境 —> 导入依赖 —>编写代码 —>进行测试
- 搭建数据库环境,MySQL工具:SQLYog,创建一个数据库,表,插入数据:
# 创建数据库 mybatis01
CREATE DATABASE `mybatis01`;
# 使用该数据库
USE `mybatis01`;
# 库中如果有user表的话先删除
DROP TABLE IF EXISTS `users`;
# 创建数据库表
CREATE TABLE `users`(
`id` INT(20) NOT NULL PRIMARY KEY,
`name` VARCHAR(50) NOT NULL,
`age` INT(10) NOT NULL,
`sex` VARCHAR(10) NOT NULL,
`password` VARCHAR(20) NOT NULL,
`address` VARCHAR(30) NOT NULL
) ENGINE=INNODB DEFAULT CHARSET=utf8
# 插入多条数据
INSERT INTO `users` VALUES
(1, '张三', 20, 'man', '100024', '中国香港'),
(2, '小红', 18, 'woman', '103983s', '中国台湾'),
(3, '李四', 25, 'man', 'sajidlqwe', '中国广东'),
(4, '小明', 46, 'man', '12351432', '中国北京'),
(5, '小敏', 39, 'woman', '10qwij', '中国上海'),
(6, '小薇', 16, 'woman', '100234', '中国江苏'),
(7, '赵六', 30, 'man', '102039', '中国河南')
# 查询表中数据
SELECT * FROM users;
- 创建一个maven项目:mybatis-study项目,在父工程的pom.xml中导入相关依赖:mybatis,mysql, junit,lombok(从maven仓库中找:https://mvnrepository.com/)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--父工程-->
<groupId>com.kevin</groupId>
<artifactId>mybatis-study</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.1</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
- 编写mybtis的核心配置文件:XML 配置文件中包含了对 MyBatis 系统的核心设置,包括获取数据库连接实例的数据源(DataSource)以及决定事务作用域和控制方式的事务管理器(TransactionManager)。
<?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>
<!--设置mybatis的环境,可以配多套环境-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<!--配置数据源连接参数:DataSource-->
<dataSource type="POOLED">
<!--Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'-->
<!--驱动已经过时,需要使用新的驱动com.mysql.cj.jdbc.Driver-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<!--在mysql8之后,加上时区的设置-->
<property name="url" value="jdbc:mysql://localhost:3306/mybatis01?useSSL=true&useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai"/>
<!--设置自己数据库连接的username和password-->
<property name="username" value="****"/>
<property name="password" value="****"/>
</dataSource>
</environment>
</environments>
</configuration>
- 编写mybatis的工具类(获取sqlSession,用来执行sql语句)
- 每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。
- SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。
- 既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。
package com.kevin.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;
/**
* @author : kevin ding
* @date : 2022/1/9 17:02
* @description : mybatis的工具类,用来获取sqlSession
*/
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static{
try {
String resource = "mybatis-config.xml";
// 加载流
InputStream inputStream = Resources.getResourceAsStream(resource);
// 通过SqlSessionFactoryBuilder创建sqlSessionFactory
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
// 定义获取sqlSession的方法
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
- 创建数据库表users对应的实体类,通过注解@Data创建其属性的get和set方法,@AllArgsConstructor创建有参构造器,@NoArgsConstructor创建无参构造器
package com.kevin.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author : kevin ding
* @date : 2022/1/9 17:14
* @description : 数据库表users对应的实体类,类中的属性名与数据表中的字段属性一一对应;
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class users {
private int id;
private String name;
private int age;
private String sex;
private String password;
private String address;
}
- 编写Mapper接口类(之前为UserDao类)
package com.kevin.dao;
import com.kevin.pojo.Users;
import java.util.List;
/**
* @author : kevin ding
* @date : 2022/1/9 17:23
* @description : UserMapper接口,相当于之前的UserDao接口, 接口中编写操作数据库的方法
*/
public interface UserMapper {
// 获取数据库表中的所有User
List<Users> getAllUser();
}
- 编写UserMapper.xml配置文件(相当于之前的UserDaoImpl)
<?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">
<!-- namespace:绑定该mapper.xml与那个接口相关联(类似于UserDaoImpl中的implement实现哪个接口)-->
<mapper namespace="com.kevin.dao.UserMapper">
<!--绑定接口中的哪个方法,类似于对方法的实现,在里面写sql执行语句-->
<!--select 标签中的id值填写需要实现接口中的方法名,resultType为返回值类型-->
<select id="getAllUser" resultType="com.kevin.pojo.Users">
select * from users;
</select>
</mapper>
- 编写test类,使用junit进行测试
package com.kevin.dao;
import com.kevin.pojo.Users;
import com.kevin.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
/**
* @author : kevin ding
* @date : 2022/1/9 17:34
* @description : junit测试类,用于完成对程序的测试
*/
public class UserMapperTest {
@Test
public void getAllUsers(){
// 1. 通过创建的Mybatis工具类中的方法 获取sqlSession
SqlSession sqlSession = MybatisUtils.getSqlSession();
// 2. 获取mapper操作对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 3. 通过mapper调用所要测试的方法
List<Users> allUsers = mapper.getAllUsers();
// 对获取的结果进行处理(遍历显示数据)
for (Users allUser : allUsers) {
System.out.println(allUser);
}
}
}
至此,查询的入门案例已经全部完毕,运行试一下,发现报以下错误:
需要到mybatis的配置文件中,绑定对应的mapper.xml
<!--绑定对应操作的mapper.xml, 告诉mybatis是对哪个mapper.xml进行的操作,路径之间用/分隔-->
<mappers>
<mapper resource="com/kevin/dao/UserMapper.xml"/>
</mappers>
配置完毕,再次运行,报出另一个错误:java.lang.ExceptionInInitializerError
原因:maven中约定大于配置,可能会使得配置文件无法被导出生效的问题,需要在pom.xml中导入如下代码,完成资源过滤:
<!--Maven 静态资源过滤-->
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
再次进行测试:运行成功!
在编写入门案例的时候,可能会遇到的几个问题:
-
配置文件中没有注册对应的Mapper.xml
-
maven资源导出过滤问题
-
绑定的接口(namespace)错误
-
mapper.xml中标签内的id对应的方法名不对
-
resultType返回值类型不匹配