1:准备工作
- 创建module(Maven的普通Java模块)
- pom.xml:添加依赖(mybatis依赖、mysql驱动依赖、junit依赖、logback依赖)
- mybatis-config.xml放在类的根路径下
- UserMapper.xml放在resources三级包下
- logback.xml放在类的根路径下
- 提供 三级包(com.tom.mybatis).mybatis.SqlSessionUtils工具类
- 创建测试数据库表及数据 这里创建User表用以测试
- 创建测试用例:com.tom.mapper.UserMapperTest
注:这里三级包就不演示了,以图示的方式给大家参考,下面的代码每行我都写了注解,希望能帮助到你。
1.1在pom.xml添加依赖
//下列内容添加到<dependencies> </dependencies> 标签对中,刷新Maven
<dependencies>
<!-- Logback 日志库 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.11</version>
<scope>test</scope>
</dependency>
<!-- MySQL Connector/J 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
<!-- Druid 数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.18</version>
</dependency>
<!-- MyBatis 持久化框架 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.13</version>
</dependency>
<!-- Servlet API,由 Servlet 容器(例如 Tomcat)提供 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<!-- Tomcat Catalina 类库,由 Servlet 容器(例如 Tomcat)提供 -->
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-catalina</artifactId>
<version>8.5.91</version>
<scope>provided</scope>
</dependency>
<!-- Lombok 注解库 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-maven-plugin</artifactId>
<version>1.18.20.0</version>
<scope>provided</scope>
</dependency>
<!-- JUnit 测试库 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
1.2数据库表及数据准备:
//1.创建数据库
create database if not exists school;
//2.选中数据库
use school;
//3.创建表
CREATE TABLE `user` (
`id` int NOT NULL AUTO_INCREMENT,
`uname` varchar(20) NOT NULL,
`password` varchar(32) NOT NULL,
`gender` varchar(20) NOT NULL,
`age` int NOT NULL,
`home` varchar(20) NOT NULL,
`qq` varchar(11) NOT NULL,
`email` varchar(30) NOT NULL,
`isdel` bit(1) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uname` (`uname`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
//4.添加数据,这里以十条数据为样本
INSERT INTO `user` (uname, password, gender, age, home, qq, email, isdel) VALUES
('张三', 'e10adc3949ba59abbe56e057f20f883e', '男', 28, '北京', '12345678901', 'zhangsan@example.com', 0),
('李四', '5f4dcc3b5aa765d61d8327deb882cf99', '女', 25, '上海', '98765432109', 'lisi@example.com', 0),
('王五', 'md5password', '男', 30, '广州', '11111111111', 'wangwu@example.com', 0),
('赵六', 'password123', '女', 32, '深圳', '22222222222', 'zhaoliu@example.com', 0),
('陈七', 'securepassword', '男', 27, '成都', '33333333333', 'chenqi@example.com', 0),
('刘八', 'liubapassword', '女', 29, '重庆', '44444444444', 'liuba@example.com', 0),
('吴九', 'wujiumima', '男', 35, '杭州', '55555555555', 'wuj@example.com', 0),
('周十', 'zhoushipassword', '女', 26, '南京', '66666666666', 'zhoushi@example.com', 0),
('孙十一', 'sunshiyimima', '男', 31, '武汉', '77777777777', 'sunshi@example.com', 0),
('郑十二', 'zhengshiermima', '女', 27, '西安', '88888888888', 'zhengshi@example.com', 0);
1.3编写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">
<!-- MyBatis 配置文件,用于配置 MyBatis 的全局设置、数据库连接信息和加载 Mapper 文件 -->
<configuration>
<!-- MyBatis 设置 -->
<settings>
<!-- 配置 MyBatis 日志实现方式为 STDOUT_LOGGING,将日志输出到控制台 -->
<setting name="logImpl" value="STDOUT_LOGGING" />
</settings>
<!-- 数据库连接环境配置 -->
<environments default="development">
<!-- 默认开发环境 -->
<environment id="development">
<!-- 使用 JDBC 事务管理器 -->
<transactionManager type="JDBC"/>
<!-- 使用 POOLED 数据源,即数据库连接池 -->
<dataSource type="POOLED">
<!-- 数据库驱动类 -->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<!-- 数据库连接 URL -->
<property name="url" value="jdbc:mysql://localhost:3306/school"/>
<!-- 数据库用户名 -->
<property name="username" value="root"/>
<!-- 数据库密码 -->
<property name="password" value="123"/>
</dataSource>
</environment>
</environments>
<!-- 加载 Mapper 文件 -->
<mappers>
<!-- 加载 UserMapper.xml 文件,即 UserMapper 接口对应的 SQL 映射文件 -->
<mapper resource="com/tom/mapper/User
1.4创建logback.xml文件:代码固定可直接替换
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定义⽇志⽂件的存储地址-->
<property name="LOG_HOME" value="/home"/>
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示⽇期,%thread表示线程名,%-5level:级别从左显示5
个字符宽度%msg:⽇志消息,%n是换⾏符-->
<pattern>%cyan(%d{yyyy-MM-dd HH:mm:ss.SSS}) %yellow([%thread]) %highlight(%-5level) %blue(%logger{50}) - %msg%n</pattern>
</encoder>
</appender>
<!-- 按照每天⽣成⽇志⽂件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--⽇志⽂件输出的⽂件名-->
<FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--⽇志⽂件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示⽇期,%thread表示线程名,%-5level:级别从左显示5
个字符宽度%msg:⽇志消息,%n是换⾏符-->
<pattern>%cyan(%d{yyyy-MM-dd HH:mm:ss.SSS}) %yellow([%thread]) %highlight(%-5level) %blue(%logger{50}) - %msg%n</pattern>
</encoder>
<!--⽇志⽂件最⼤的⼤⼩-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>100MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!--mybatis log configure-->
<logger name="com.apache.ibatis" level="TRACE"/>
<logger name="java.sql.Connection" level="DEBUG"/>
<logger name="java.sql.Statement" level="DEBUG"/>
<logger name="java.sql.PreparedStatement" level="DEBUG"/>
<!-- ⽇志输出级别,logback⽇志级别包括五个:TRACE < DEBUG < INFO < WARN < ERROR -->
<root level="DEBUG">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE"/>
</root>
</configuration>
1.5 在resources中创建三级包,要求包名与main包下的Java中的三级包名保持一致,详情请看图:
注: 解析各个接口、类的作用:(从上依次向下)
- 接口:UserMapper 作用:替代JDBC的dao(持久)层
- mybatis文件夹下:SqlSessionUtil 作用:见名知意,它是用来提供一个用于获取MyBatis的 ’SqlSession‘ 对象的工具方法。其中'SqlSeesion' 对象是MyBatis中用于执行SQL查询和数据库交互的关键对象。
- pojo下: User 类的作用是表示用户实体对象。这个类定义了用户的基本信息。
- UserMapper.xml文件是MyBatis 的XML的映射文件。可用于定义SQL语句(增删改查的SQL语句)
- UserTest:是测试CRUD的类
那让我们按照顺序一个一个完成吧。
2.在java文件夹下创建三级包及各个文件
注:com.tom.pojo/mapper/mybatis
2.1在pojo下创建User类:
package com.tom.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private Integer id;
private String uname;
private String password;
private String gender;
private Integer age;
private String home;
private String qq;
private String email;
private boolean isdel;
}
2.2在文件夹mapper下创建UserMapper 接口
package com.tom.mapper;
import com.tom.pojo.User;
import java.util.List;
/**
* 用户 Mapper 接口
*/
public interface UserMapper {
/**
* 添加用户
* @param user 用户对象
* @return 添加成功的用户数
*/
int addUser(User user);
/**
* 更新用户信息
* @param user 用户对象
* @return 更新成功的用户数
*/
int updateUser(User user);
/**
* 删除用户
* @param user 用户对象
* @return 删除成功的用户数
*/
int deleteUser(User user);
/**
* 查询单个用户
* @param user 用户对象,包含查询条件
* @return 查询到的单个用户对象,若未找到则返回 null
*/
User querySingle(User user);
/**
* 查询所有用户
* @return 查询到的所有用户列表
*/
List<User> queryAll();
}
2.3在文件夹mybatis下创建SqlSessionUtil类
package com.tom.mybatis;
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;
/**
* 版权所有 (c) 2023, 61813631@qq.com 保留所有权利。
* 作者:Spades--K
*/
public class SqlSessionUtil {
// 静态代码块,用于初始化 SqlSessionFactory
static SqlSessionFactory sqlSessionFactory = null;
static {
try {
// 创建 SqlSessionFactoryBuilder 对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 通过 Resources 类加载 mybatis-config.xml 配置文件,创建 SqlSessionFactory
sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsReader("mybatis-config.xml"));
} catch (IOException e) {
// 如果出现异常,将异常包装成 RuntimeException 并抛出
throw new RuntimeException(e);
}
}
// 获取 SqlSession 对象的静态方法
public static SqlSession getSqlSession() {
// 使用 SqlSessionFactory 创建并打开一个自动提交事务的 SqlSession 对象
SqlSession sqlSession = sqlSessionFactory.openSession(true);
return sqlSession;
}
}
2.4创建UserMapper.xml
<?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 XML 文件,用于定义对用户表 user 进行增删改查的 SQL 语句 -->
<!-- Mapper 命名空间,用于标识该 Mapper 文件所属的接口或类 -->
<mapper namespace="com.tom.mapper">
<!-- 添加用户的 SQL 语句 -->
<insert id="addUser">
insert into user(uname, password, gender, age, home, qq, email, isdel)
values (#{uname}, #{password}, #{gender}, #{age}, #{home}, #{qq}, #{email}, #{isdel})
</insert>
<!-- 删除用户的 SQL 语句 -->
<delete id="deleteUser">
delete from user where id = #{id}
</delete>
<!-- 更新用户信息的 SQL 语句 -->
<update id="updateUser">
update user set uname = #{uname}, password = #{password}, age = #{age} where id = #{id}
</update>
<!-- 查询单个用户的 SQL 语句 -->
<select id="querySingle" resultType="com.tom.pojo.User">
select * from user where id = #{id}
</select>
<!-- 查询所有用户的 SQL 语句 -->
<select id="queryAll" resultType="com.tom.pojo.User">
select * from user
</select>
</mapper>
3.最后在Test中创建测试类UserTest
package com.tom.mybatis;
import com.tom.pojo.User;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.io.IOException;
import java.util.List;
/**
* 版权所有 (c) 2023, 61813631@qq.com 保留所有权利。
* 作者:Spades--K
*/
public class UserTest {
@Test
public void addUser() throws IOException {
// 获取一个 SqlSession 对象
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
// 创建一个 User 对象,表示要添加的用户信息
User user = new User(null, "胡十三", "hushisanpassword", "男", 28, "缅甸", "123456789", "hushi@qq.com", false);
// 执行 addUser SQL 语句,插入新用户
sqlSession.insert("addUser", user);
sqlSession.close();
}
@Test
public void deleteUserById() {
// 获取一个 SqlSession 对象
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
// 执行 deleteUser SQL 语句,删除 id 为 11 的用户
int del = sqlSession.delete("deleteUser", 11);
System.out.println(del);
sqlSession.close();
}
@Test
public void updateUser() {
// 获取一个 SqlSession 对象
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
// 创建一个 User 对象,表示要更新的用户信息
User user = new User();
user.setId(10);
user.setUname("胡十十");
user.setPassword("hushishi");
user.setAge(30);
// 执行 updateUser SQL 语句,更新 id 为 10 的用户信息
sqlSession.update("updateUser", user);
sqlSession.close();
}
@Test
public void querySingle() {
// 获取一个 SqlSession 对象
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
// 执行 querySingle SQL 语句,查询 id 为 8 的用户信息
Object querySingle = sqlSession.selectOne("querySingle", 8);
sqlSession.close();
}
@Test
public void queryAll() {
// 获取一个 SqlSession 对象
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
// 执行 queryAll SQL 语句,查询所有用户信息,并将结果存储在一个 List 中
List<Object> queryAll = sqlSession.selectList("queryAll");
// 遍历输出所有用户信息
queryAll.forEach(i -> System.out.println(i));
sqlSession.close();
}
}
运行每个Test测试即可。