第一个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笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。