玩转MyBatis01——第一个Mybatis程序
Mybatis 是一款优秀的持久层框架,是我们工作学习过程中不可或缺的一部分。 本教程致力于打造 Mybatis 的保姆级教程,祝您学习愉快~
1 准备工作
1.1 创建父工程
-
File -> New -> Project
-
选择 maven ,next
-
填写项目名称 Name,GroupId 以及 ArtifactId,点击 Finish
-
删除 src 目录,把当前项目当作父工程目录
-
在 pom.xml 文件中导入 jar 包
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
</dependencies>
1.2 创建当前工程module
- 在父目录上点击右键,New -> Module
- 继续创建一个 maven 项目,添加 module 的 Name、ArtifactId,最后 finish,得到如下目录结构
1.3 数据库准备
CREATE DATABASE `mybatis`;
USE `mybatis`;
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(20) NOT NULL,
`name` varchar(30) DEFAULT NULL,
`pwd` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into `user`(`id`,`name`,`pwd`) values (1,'狂神','123456'),(2,'张三','abcdef'),(3,'李四','987654');
2 实操
利用 Mybatis 的整体的过程是:
- SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例
- 通过 SqlSessionFactory 实例获得 SqlSession 实例
- 通过 SqlSession 实例操作数据库
上述过程的前两步都是固定的,因此我们可以将其抽象出来,方便后续直接调用。详细介绍可以看官网入门教程。
2.1 编写配置文件
- 在 resources 目录下新增 jdbc.properties 配置文件,用于配置数据库连接信息
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT
jdbc.username=root
jdbc.password=******
- 在 resources 目录下新增 mybatis-config.xml 配置文件
<?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>
<properties resource="jdbc.properties"></properties>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
</configuration>
2.2 编写 Mybatis 工具类
在 java.com.jason.utils 包下创建 MybatisUtils.java 文件
package com.jason.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 Jason
* @Date 2022/1/10 1:09 下午
* @Description
*/
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
//获取SqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession() {
return sqlSessionFactory.openSession();
}
}
2.3 编写实体类
在 java.com.jason.pojo 包下创建 User.java 文件。注意该类的字段需要与 1.3 中数据库的列严格一致。
package com.jason.pojo;
/**
* @Author Jason
* @Date 2022/1/10 1:11 下午
* @Description
*/
public class User {
private long id;
private String name;
private String pwd;
public User() {}
public User(long id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = pwd;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", pwd='" + pwd + '\'' +
'}';
}
}
2.4 编写 mapper
- 创建 UserMapper 接口类
package com.jason.mapper;
import com.jason.pojo.User;
import java.util.List;
/**
* @Author Jason
* @Date 2022/1/10 1:14 下午
* @Description
*/
public interface UserMapper {
List<User> getUserList();
}
- 编写 UserMapper.xml 配置文件,注意 namespace 不能写错,对应 Mapper 接口或者 Dao 接口的完整包名。id 是接口中的方法,resultType 是返回类型,如果返回的是集合的话就写集合中的范型类型。
<?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(Dao)接口-->
<mapper namespace="com.jason.mapper.UserMapper">
<!--select查询语句, resultType 写集合的范型的类型-->
<select id="getUserList" resultType="com.jason.pojo.User">
select *
from mybatis.user
</select>
</mapper>
2.5 编写测试文件
建议创建同名包路径下的测试文件!
package com.jason.mapper;
import com.jason.pojo.User;
import com.jason.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
/**
* @Author Jason
* @Date 2022/1/10 1:19 下午
* @Description
*/
public class UserMapperTest {
@Test
public void selectTest() {
// 获取 SqlSession 对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
// 执行 SQL
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = mapper.getUserList();
for (User user : userList) {
System.out.println(user);
}
// 关闭 SqlSession
sqlSession.close();
}
}
- 问题1:
此时如果直接运行该测试用例,可能提示org.apache.ibatis.binding.BindingException: Type interface com.jason.mapper.UserMapper is not known to the MapperRegistry.
,需要我们将编写的 mapper 注册到 mybatis-config.xml 文件中
- 问题2:
可能出现报错### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.io.IOException: Could not find resource com/jason/mapper/UserMapper.xml
,需要我们按照 2.6 步骤添加之后,clean 掉target ,关闭并重新打开 idea。
2.6 解决静态资源过滤问题
在 pom.xml 文件(dependencies 的同级)中添加以下内容, 并更新一下 maven
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>