详细使用MyBatis、注解完成CRUD,每行都有注释,全套CRUD。

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测试即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@挠头怪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值