mybatis - [02] 第一个Mybatis程序
实现
select * from user
的mybatis demo
一、开发思路
二、搭建环境
2.1、数据库
-- 创建数据库
CREATE DATABASE `mybatis`;
-- 切换数据库
USE `mybatis`;
-- 创建表
CREATE TABLE IF NOT EXISTS `user`(
`id` INT(20) NOT NULL COMMENT '序号',
`name` VARCHAR(30) DEFAULT NULL COMMENT '账号',
`pwd` VARCHAR(30) DEFAULT NULL COMMENT '密码',
PRIMARY KEY (`id`)
) ENGINE = INNODB DEFAULT CHARSET=utf8;
引擎为INNODB,默认字符集设置为utf8
-- 插入数据
insert into `user` (`id`,`name`,`pwd`) values
(1,'漩涡鸣人','123456'),
(2,'宇智波佐助','123456'),
(3,'春野樱','123456'),
(4,'旗木卡卡西','123456'),
(5,'奈良鹿丸','123456'),
(6,'秋道丁次','123456'),
(7,'山中井野','123456'),
(8,'猿飞阿斯玛','123456'),
(9,'日向雏田','123456'),
(10,'犬冢牙','123456'),
(11,'油女志乃','123456'),
(12,'夕日红','123456');
2.2、新建项目
创建一个普通的
Maven
项目,把默认的src
目录(父项目)删掉,新建Project Module
(子项目)。
三、导入依赖
在父项目的pom.xml中进行如下配置,配置完成之后记得刷新Maven,Maven会加载对应的jar包到本地仓库
<!-- 导入依赖 -->
<dependencies>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.31</version>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.13</version>
</dependency>
<!-- junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
</dependency>
</dependencies>
配置mybatis配置文件(mybatis-config.xml)
使用idea进行开发,该配置文件放在
src/main/resources
目录下
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
以上为官网默认配置,以下为本文使用的配置
<?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>
<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/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai"/>
<property name="username" value="账号"/>
<property name="password" value="密码"/>
</dataSource>
</environment>
</environments>
</configuration>
每个基于Mybatis的应用都是以一个SqlSessionFactory的实例为核心的。
SqlSessionFactory的实例可以通过SqlSessionFactoryBuilder获得。
四、编写代码
(1)首先在src/main/java/com/harley/utils
下编写工具类MybatisUtils.java
package com.harley.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 kylin
* @since 2024-03-11 20:16:27
*/
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
// 使用Mybatis获取SqlSessionFactory对象
String resource = "mybatis-config.xml";
try {
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 有了SqlSessionFactory, 就可以从中获得SqlSession实例
* SqlSession完全包含了面向数据库执行SQL命令所需的所有方法
*/
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
该类运用了设计模式中的工厂模式,调用该类的getSqlSession()方法返回的SqlSession,即可和数据库进行交互(SqlSession中封装了很多insert、update...的API)。
(2)在src/main/java/com/harley/pojo
下编写实体类User.java
package com.harley.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
/**
* @author kylin
* @since 2024-03-11 20:31:15
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class User {
private Integer id;
private String name;
private String pwd;
}
此处使用了lombok的注解
@Data
可以为实体类的属性自动生成Getter/Setter
方法
@AllArgsConstructor
可以为实体类自动生成有参构造方法
@NoArgsConstructor
可以为实体类自动生成无参构造方法
@ToString
可以为实体类自动生成toString
方法
(3)在src/main/java/com/harley/dao
下编写UserDao.java
package com.harley.dao;
import com.harley.pojo.User;
import java.util.List;
public interface UserMapper {
List<User> getUserList();
}
dao层是与数据库进行交互的一层。
dao接口中方法和mapper配置文件中的标签一一对应。
一个dao接口文件需要有一个mapper与之对应。
(4)在src/main/java/com/harley/dao
下编写UserMapper.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 namespace="com.harley.dao.UserMapper">
<select id="getUserList" resultType="com.harley.pojo.User">
select * from User where id = #{id}
</select>
</mapper>
代替了UserDaoImpl的功能,之前sql语句是在UserDaoImpl中编写的。
(5)在src/test/java/com/harley/dao
下编写UserDaoTest.java
package com.harley.dao;
import com.harley.pojo.User;
import com.harley.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
/**
* @author harley
* @date 2024/05/31 14:22
*/
public class UserDaoTest {
@Test
public void test(){
// 第一步: 获取到sqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
// 第二步(方式一): getMapper
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = userMapper.getUserList();
// 第二步(方式二):selectList
List<User> userList = sqlSession.selectList("com.harley.dao.UserMapper.getUserList");
// 第三步: 遍历结果集
for (User user : userList) {
System.out.println(user);
}
// 第四步: 关闭sqlSession
sqlSession.close();
}
}
运行之后会有如下报错:
org.apache.ibatis.binding.BindingException: Type interface com.harley.dao.UserMapper is not known to the MapperRegistry.
报错原因:mybatis-config.xml
中未配置<mapper resource="com/harley/dao/UserMapper.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>
<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/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai"/>
<property name="username" value="root"/>
<property name="password" value="!QAZ2wsx"/>
</dataSource>
</environment>
</environments>
<!-- 每一个Mapper.xml都需要在Mybatis核心配置文件中注册 -->
<mappers>
<mapper resource="com/harley/dao/UserMapper.xml"/>
</mappers>
</configuration>
再次运行报错如下:
Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration.
Cause: java.io.IOException: Could not find resource com/harley/dao/UserMapper.xml
报错原因:UserMapper.xml
资源导出失败
在<build>
中配置<resources>
,以防止资源导出失败的问题
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
执行maven:clean
之后,再次运行
一般来说,
xxxMapper.xml
应该放在reosurces
目录下
五、总结
(1)MapperRegistry是什么?
核心配置文件中注册mappers
(2)可能遇到的问题
- 配置文件没有注册
- 绑定接口错误
- 方法名不对
- 返回类型不对
- Maven导出资源问题
— 业精于勤荒于嬉,行成于思毁于随 —
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南