第一个MyBatis程序
配置开发环境
想要创建一个 Spring MVC 项目,首先我们必须先配置好开发环境。具体的开发环境配置,如下表。| MyBatis | 3.5.13 |
|---|---|
| JDK 版本 | 17+ |
| Maven | 3.6+ |
| MySQL | 8.0.23 |
| IntelliJ IDEA | IntelliJ IDEA 2022.x |
浏览器访问 IntelliJ IDEA 官方下载页面,下载并安装 IntelliJ IDEA。
创建数据库表
首先,我们需要在 MySQL 数据库中新建一个名为 54benniao_mybatis 的数据库,然后在该数据库中执行以下 SQL 语句创建一个名为 user 的表。
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int NOT NULL AUTO_INCREMENT,
`username` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
`password` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
`status` int DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', 'admin', 'admin', '2');
INSERT INTO `user` VALUES ('2', '用户1', '123456', '0');
创建 MyBatis 项目
接下来我们就可以在 Intellij IDEA 中借助 Maven 创建一个 MyBatis 项目了。
1. 创建 Maven 父工程
首先,我们先创建一个 Maven 父工程,并通过它来管理我们在本教程中所创建的所有 MyBatis 项目,具体步骤如下。
1) 点击 IntelliJ IDEA 左上角的 File 菜单,然后依次选择 New -> Project -> New Project,并在 New Project 窗口完善 Maven 父工程的 Name(名称)、Location(位置)、Language(编程语言)、Build system(构建方式)、JDK 以及 GroupId 和 ArtifactId 等信息,如下图。

图1:创建父工程
2)Maven 父工程 my-baitis-parent-project 创建完成后,其目录结构如下图。

图2:父工程目录结构
作为 Maven 父工程,my-baitis-parent-project 中并不会包含任何的 Java 代码,因此我们可以将该工程下的 src 目录直接删除,让项目结构更加清晰整洁。当然,如果不删除,也并不会造成任何影响。
2. 创建子模块
在完成了 Maven 父工程的创建之后,接下来我们就可以在该父工程(my-baitis-parent-project)中创建 MyBatis 项目了,该项目是作为 my-baitis-parent-project 中的一个子模块而存在的。
1) 右键点击 Maven 主工程 my-baitis-parent-project,然后在弹出的菜单中依次选择 New -> Module...,如下图。

图3:新建子模块
2)在 New Module 窗口的右侧分别完善 Spring 项目的 Name(子模块名称)、Location(位置)、Language(编程语言)、Build system(构建方式)、JDK 以及 GroupId 和 ArtifactId 等信息,最后点击下方的“Create”完成创建,如下图。

图4:创建子模块
3) 子模块 my-first-mybatis-demo 创建完成之后,整个工程的目录结构如下图。

图5:目录结构
3. 引入依赖
在完成了 Maven 父工程以及第一个子模块的创建之后,接下来,我们可以将 MyBatis 相关的 Maven 依赖引入到 my-first-mybatis-demo 中。
1) 在 my-first-mvc-demo 的 pom.xml 中将相关依赖引入到该模块之中,具体配置内容如下。
<dependencies>
<!--MyBatis 核心依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.13</version>
</dependency>
<!--mysql 驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.32</version>
</dependency>
<!--Junit 测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<!-- log4j日志 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
2) 如果我们第一次将上面的依赖引入到工程模块中时,Maven 会自动联网去下载依赖包。下载完成后,点击 IntelliJ IDEA 最右侧的 Maven 选项,此时会弹出一个 Maven 窗口,这里我们可以看到子模块 my-first-mybatis-demo 的依赖(Dependencies),如下图。

图6:Maven 依赖
温馨提示,当我们在项目的 POM 文件中引入了新的依赖后,若 IDEA 并未自动将下载,则可以手动点击一下图 6 左上角的 Reload All Maven Projects 按钮,重新加载所有的 Maven 工程,此时 IDEA 会重新下载并引入所有依赖。
4. 创建 MyBatis 核心配置文件
在 src/main/resources 目录下创建 MyBatis 的核心配置文件,该配置主要用于配置连接数据库的环境以及 MyBatis 的全局配置信息。该文件的名称可以使任意的,但习惯上会被命名为 mybatis-config.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">
<configuration>
<!--设置连接数据库的环境-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<!--数据源配置-->
<dataSource type="POOLED">
<!--数据库驱动-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<!--连接数据库的 url-->
<property name="url" value="jdbc:mysql://127.0.0.1:3306/54benniao_mybatis"/>
<!--连接数据库的用户名-->
<property name="username" value="root"/>
<!--连接数据库的密码-->
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!--引入映射文件-->
<mappers>
<mapper resource="mappers/UserMapper.xml"/>
</mappers>
</configuration>
5. 添加实体类
在 src/main/java 目录下新建一个 net.biancheng.c.entity 包,然后在该包下新建一个名为 User 的 Java 类,代码如下。
package net.biancheng.c.entity;
/**
* 实体类 User
* 与 MySql 数据库中的 user 表相对应
*/
public class User {
//唯一标识
private Integer id;
//用户名
private String username;
//密码
private String password;
//状态
private Integer status;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", status=" + status +
'}';
}
}
6. 创建 mapper 接口
在 src/main/java 目录下新建一个 net.biancheng.c.mapper 包,并在该包下创建一个名为 UserMapper 的接口,该接口代码如下。
package net.biancheng.c.mapper;
import net.biancheng.c.entity.User;
import java.util.List;
/**
* Mapper 接口
*/
public interface UserMapper {
/**
* 查询 user 表中的所有数据
*
* @return
*/
public List<User> getUsers();
/**
* 根据 id 查询指定的 user 数据
*
* @param id
* @return
*/
public User getUserById(int id);
/**
* 插入新数据
*
* @param user
* @return
*/
public int insertUser(User user);
/**
* 修改 user 信息
*
* @param user
* @return
*/
public int updateStatus(User user);
/**
* 删除指定的 uer 信息
*
* @param user
* @return
*/
public int deleteUser(User user);
}
7. 创建 MyBatis 映射文件
MyBatis 的映射文件是用来编写 SQL 语句,访问以及操作数据库表中数据的,因此一个映射文件都只与一个实体类相对应,一个映射文件也只与一张数据库表相对应。MyBatis 的映射文件需要遵守以下命名规则:
表所对应的实体类的类名 + Mapper.xml例如,数据库 user 表,映射的实体类为 User,所对应的映射文件为 UserMapper.xml
在 src/main/resrouces 目录下新建一个名为 mappers 的文件夹,然后在这个文件夹下创建一个名为 UserMapper 的 MyBatis 的映射文件,具体配置内容下。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="net.biancheng.c.mapper.UserMapper">
<!--结果映射,手动将实体类中属性映射到数据库表中的字段上-->
<resultMap id="userMaps" type="net.biancheng.c.entity.User">
<id property="id" column="id"></id>
<result property="username" column="username"></result>
<result property="password" column="password"></result>
<result property="status" column="status"></result>
</resultMap>
<!--查询 user 表中的所有数据-->
<select id="getUserById" resultType="net.biancheng.c.entity.User">
select * from user where id = #{id}
</select>
<!--插入新数据-->
<insert id="insertUser">
insert into user value (null,#{username},#{password},#{status});
</insert>
<!--修改用户状态-->
<update id="updateStatus">
update user set status = #{status} where id = #{id};
</update>
<!--修改数据库表中的设置-->
<select id="getUsers" resultMap="userMaps">
select * from user;
</select>
</mapper>
在上面的配置文件中中,namespace 属性指定了映射文件对应的 mapper 接口的全类名。各个 SQL 操作都使用了不同的标签,例如 <select> 用于查询语句,<insert> 用于插入语句,<update> 用于更新语句,<delete> 用于删除语句。每个标签都有一个 id 属性,该属性值应与 mapper 接口中对应方法的方法名保持一致。
8. 创建 log4j 日志配置文件
在 src/main/resources 下创建一个名为 log4j.xml 的日志配置文件,配置内容如下。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<param name="Encoding" value="UTF-8" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS}
%m (%F:%L) \n" />
</layout>
</appender>
<logger name="java.sql">
<level value="debug" />
</logger>
<logger name="org.apache.ibatis">
<level value="info" />
</logger>
<root>
<level value="debug" />
<appender-ref ref="STDOUT" />
</root>
</log4j:configuration>
9. 创建测试类
在 src/test/java 目录下,新建一个名为 UserTest 的 测试类,代码如下。
import net.biancheng.c.entity.User;
import net.biancheng.c.mapper.UserMapper;
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 org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class UserTest {
@Test
public void test() throws IOException {
//加载 MyBatis 的核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
//获取 SqlSessionFactoryBuilder 对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//通过 SqlSessionFactoryBuilder 构建 SqlSessionFactory 对象
SqlSessionFactory sessionFactory = sqlSessionFactoryBuilder.build(resourceAsStream);
//获取 SqlSession 对象,设置为自动提交
SqlSession sqlSession = sessionFactory.openSession(true);
//获取 Mapper 接口对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
System.out.println();
System.out.println("开始新增数据...");
//新增用户
User user = new User();
user.setUsername("root");
user.setPassword("root");
user.setStatus(0);
mapper.insertUser(user);
List<User> users = mapper.getUsers();
System.out.println("id 用户名 密码 登陆状态");
for (User u : users) {
System.out.println(u.getId() + " " + u.getUsername() + " " + u.getPassword() + " " + (u.getStatus() == 0 ? "未登录" : "已登录"));
}
System.out.println();
System.out.println("开始修改数据...");
//修改用户状态
User user1 = new User();
user1.setId(1);
user1.setStatus(2);
mapper.updateStatus(user1);
System.out.println();
System.out.println("查询是否修改成功...");
User userById = mapper.getUserById(user1.getId());
System.out.println(userById.getId() + " " + userById.getUsername() + " " + userById.getPassword() + " " + (userById.getStatus() == 0 ? "未登录" : "已登录"));
}
}
测试
运行测试类 UserTest 中的 test() 方法,控制态输出内容如下。开始新增数据... DEBUG 05-09 17:32:01,633 ==> Preparing: insert into user value (null,?,?,?); (BaseJdbcLogger.java:135) DEBUG 05-09 17:32:01,690 ==> Parameters: root(String), root(String), 0(Integer) (BaseJdbcLogger.java:135) DEBUG 05-09 17:32:01,707 <== Updates: 1 (BaseJdbcLogger.java:135) DEBUG 05-09 17:32:01,711 ==> Preparing: select * from user; (BaseJdbcLogger.java:135) DEBUG 05-09 17:32:01,712 ==> Parameters: (BaseJdbcLogger.java:135) DEBUG 05-09 17:32:01,761 <== Total: 3 (BaseJdbcLogger.java:135) id 用户名 密码 登陆状态 1 admin admin 已登录 2 用户1 123456 未登录 5 root root 未登录 开始修改数据... DEBUG 05-09 17:32:01,771 ==> Preparing: update user set status = ? where id = ?; (BaseJdbcLogger.java:135) DEBUG 05-09 17:32:01,772 ==> Parameters: 2(Integer), 1(Integer) (BaseJdbcLogger.java:135) DEBUG 05-09 17:32:01,774 <== Updates: 1 (BaseJdbcLogger.java:135) 查询是否修改成功... DEBUG 05-09 17:32:01,775 ==> Preparing: select * from user where id = ? (BaseJdbcLogger.java:135) DEBUG 05-09 17:32:01,776 ==> Parameters: 1(Integer) (BaseJdbcLogger.java:135) DEBUG 05-09 17:32:01,781 <== Total: 1 (BaseJdbcLogger.java:135) 1 admin admin 已登录
声明:《MyBatis系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。