Yunyuzuiluo

我的MyBatis快速入门

花了我四个小时,三个小时在找问题,哭死。

这是最终版的结构,每个文件的内容放最后了。

来谈谈步骤:
1.创建Maven项目,配置pom.xml
2.数据库建表,
3.创建目录结构(如图所示)
4.pojo包下的User实体类先弄好
5.定义 MyBatis 接口UserMapper.java
6.编写映射文件UserMapper.xml
7.配置mybatis-config.xml
8.配置日志log4j.properties(没有也行)
9.编写测试类TestMyBatis.java

我犯了什么错:
1.java下的UserMapper和resources下的UserMapper.xml路径不一致(图片里一致了)
2.数据库名称写错了,因为自己用的和AI用的不一致
3.这么简单的的程序有俩错够多了,别三了

代码:
UserMapper:
package com.ljy001.mapper;

import com.ljy001.pojo.User;
import java.util.List;

public interface UserMapper {
// 根据 ID 查询用户
User getUserById(int id);

// 查询所有用户
List<User> getAllUsers();

// 插入用户
int insertUser(User user);

// 更新用户信息
int updateUser(User user);

// 根据 ID 删除用户
int deleteUserById(int id);

}

User:
package com.ljy001.pojo;

public class User {
// 用户的唯一标识
private Integer id;
// 用户姓名
private String name;
// 用户年龄
private Integer age;

// 无参构造方法,方便创建对象时不传入初始值
public User() {
}

// 全参构造方法,方便在创建对象时直接初始化所有属性
public User(Integer id, String name, Integer age) {
    this.id = id;
    this.name = name;
    this.age = age;
}

// 获取用户 ID
public Integer getId() {
    return id;
}

// 设置用户 ID
public void setId(Integer id) {
    this.id = id;
}

// 获取用户姓名
public String getName() {
    return name;
}

// 设置用户姓名
public void setName(String name) {
    this.name = name;
}

// 获取用户年龄
public Integer getAge() {
    return age;
}

// 设置用户年龄
public void setAge(Integer age) {
    this.age = age;
}

// 重写 toString 方法,方便打印对象信息
@Override
public String toString() {
    return "User{" +
            "id=" + id +
            ", name='" + name + '\'' +
            ", age=" + age +
            '}';
}

}

TestMyBatis:
package com.ljy001;

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 com.ljy001.mapper.UserMapper;
import com.ljy001.pojo.User;
import java.io.InputStream;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class TestMyBatis {
private static final Logger logger = LoggerFactory.getLogger(TestMyBatis.class);

public static void main(String[] args) {
    try {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        performDatabaseOperations(sqlSessionFactory);
    } catch (Exception e) {
        logger.error("发生异常: ", e);
    }
}

private static void performDatabaseOperations(SqlSessionFactory sqlSessionFactory) {
    try (SqlSession session = sqlSessionFactory.openSession()) {
        UserMapper userMapper = session.getMapper(UserMapper.class);

        User user = getUserById(userMapper, 1);
        if (user != null) {
            logger.info("根据ID查询的用户: {}", user);
        }

        List<User> users = getAllUsers(userMapper);
        if (!users.isEmpty()) {
            logger.info("查询到的所有用户: {}", users);
        }

        User newUser = createNewUser();
        insertUser(userMapper, session, newUser);

        updateUser(userMapper, session, newUser);

        deleteUserById(userMapper, session, newUser.getId());
    }
}

private static User getUserById(UserMapper userMapper, int id) {
    try {
        return userMapper.getUserById(id);
    } catch (Exception e) {
        logger.error("查询用户时发生异常: ", e);
        return null;
    }
}

private static List<User> getAllUsers(UserMapper userMapper) {
    try {
        return userMapper.getAllUsers();
    } catch (Exception e) {
        logger.error("查询所有用户时发生异常: ", e);
        return null;
    }
}

private static User createNewUser() {
    return new User(null, "Tom", 26);
}

private static void insertUser(UserMapper userMapper, SqlSession session, User user) {
    try {
        userMapper.insertUser(user);
        session.commit();
        logger.info("插入用户成功: {}", user);
    } catch (Exception e) {
        logger.error("插入用户时发生异常: ", e);
        session.rollback();
    }
}

private static void updateUser(UserMapper userMapper, SqlSession session, User user) {
    try {
        user.setName("Jerry");
        userMapper.updateUser(user);
        session.commit();
        logger.info("更新用户成功: {}", user);
    } catch (Exception e) {
        logger.error("更新用户时发生异常: ", e);
        session.rollback();
    }
}

private static void deleteUserById(UserMapper userMapper, SqlSession session, Integer id) {
    try {
        if (id != null) {
            userMapper.deleteUserById(id);
            session.commit();
            logger.info("删除用户成功,ID: {}", id);
        }
    } catch (Exception e) {
        logger.error("删除用户时发生异常: ", e);
        session.rollback();
    }
}

}

UserMapper.xml

<!-- 定义结果映射,将数据库表的列名映射到实体类的属性 -->
<resultMap id="UserResultMap" type="com.ljy001.pojo.User">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <result property="age" column="age"/>
</resultMap>

<!-- 根据 ID 查询用户 -->
<select id="getUserById" parameterType="int" resultMap="UserResultMap">
    SELECT * FROM users WHERE id = #{id}
</select>

<!-- 查询所有用户 -->
<select id="getAllUsers" resultMap="UserResultMap">
    SELECT * FROM users
</select>

<!-- 插入用户 -->
<insert id="insertUser" parameterType="com.ljy001.pojo.User">
    INSERT INTO users (name, age) VALUES (#{name}, #{age})
    <!-- 如果数据库支持自动生成主键,可以使用以下方式获取插入后的主键值 -->
    <selectKey keyProperty="id" resultType="int" order="AFTER">
        SELECT LAST_INSERT_ID()
    </selectKey>
</insert>

<!-- 更新用户信息 -->
<update id="updateUser" parameterType="com.ljy001.pojo.User">
    UPDATE users
    SET name = #{name}, age = #{age}
    WHERE id = #{id}
</update>

<!-- 根据 ID 删除用户 -->
<delete id="deleteUserById" parameterType="int">
    DELETE FROM users WHERE id = #{id}
</delete>

log4.properties:
log4j.rootLogger=DEBUG, stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n

mybatis-config.xml

<!-- 类型别名配置,简化全限定类名的使用 -->
<typeAliases>
    <!-- 为单个类定义别名 -->
    <typeAlias alias="User" type="com.ljy001.pojo.User"/>
    <!-- 批量扫描包,为包下的所有类自动生成别名,别名默认为类名(首字母小写) -->
    <package name="com.ljy001.pojo"/>
</typeAliases>

<!-- 插件配置,用于扩展 MyBatis 的功能,如分页插件 -->
<!-- 如果暂时不使用插件,可以保留注释 -->
<!-- <plugins>
    <plugin interceptor="com.example.plugin.MyPlugin"/>
</plugins> -->

<!-- 环境配置,可以配置多个环境,如开发、测试、生产环境 -->
<environments default="development">
    <environment id="development">
        <!-- 事务管理器类型,JDBC 表示使用 JDBC 的事务管理 -->
        <transactionManager type="JDBC"/>
        <!-- 数据源类型,POOLED 表示使用连接池 -->
        <dataSource type="POOLED">
            <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql://localhost:3306/250507?useSSL=false&amp;serverTimezone=UTC"/>
            <property name="username" value="root"/>
            <property name="password" value="123456"/>
        </dataSource>
    </environment>
</environments>

<!-- 映射器配置,指定 MyBatis 的映射文件或映射接口 -->
<mappers>
    <!-- 通过资源路径引入映射文件 -->
    <mapper resource="com/ljy001/mapper/UserMapper.xml"/>
    <!-- 通过接口的全限定名引入映射接口 -->
    <!-- <mapper class="com.ljy001.mapper.UserMapper"/> -->
    <!-- 批量扫描包下的所有映射接口 -->
    <!-- <package name="com.ljy001.mapper"/> -->
</mappers>

pom.xml:


4.0.0

<!-- 项目基本信息 -->
<groupId>com.ljy001</groupId>
<artifactId>250205</artifactId>
<version>1.0-SNAPSHOT</version>

<!-- 项目属性配置 -->
<properties>
    <!-- Java 编译版本,可根据实际情况调整 -->
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <!-- 项目编码 -->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <!-- 依赖版本定义 -->
    <mysql-connector.version>8.0.32</mysql-connector.version>
    <mybatis.version>3.5.10</mybatis.version>
    <junit.version>4.13.2</junit.version>
    <!-- SLF4J 版本 -->
    <slf4j.version>1.7.36</slf4j.version>
    <!-- log4j 版本 -->
    <log4j.version>1.2.17</log4j.version>
</properties>

<!-- 依赖管理 -->
<dependencyManagement>
    <dependencies>
        <!-- MySQL 数据库驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql-connector.version}</version>
        </dependency>
        <!-- MyBatis 框架 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>${mybatis.version}</version>
        </dependency>
        <!-- JUnit 测试框架 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
        <!-- SLF4J API -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <!-- log4j 实现 -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>${log4j.version}</version>
        </dependency>
        <!-- 添加 slf4j-log4j12 依赖管理 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
    </dependencies>
</dependencyManagement>

<!-- 项目依赖 -->
<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.10</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <!-- 建议显式指定 scope 为 test -->
        <scope>test</scope>
    </dependency>
    <!-- SLF4J API -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
    </dependency>
    <!-- log4j 实现 -->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
    </dependency>
    <!-- 添加 slf4j-log4j12 依赖 -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>${slf4j.version}</version>
    </dependency>
</dependencies>

<!-- 构建配置 -->
<build>
    <plugins>
        <!-- Maven 编译插件 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
        <!-- 资源插件,确保配置文件能正确打包 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>3.2.0</version>
            <configuration>
                <encoding>${project.build.sourceEncoding}</encoding>
                <resources>
                    <resource>
                        <directory>src/main/resources</directory>
                        <includes>
                            <include>**/*.properties</include>
                            <include>**/*.xml</include>
                        </includes>
                    </resource>
                </resources>
            </configuration>
        </plugin>
    </plugins>
</build>

建表语句:
把User实体类发给AI让它帮你生成吧

posted on 2025-03-07 21:49  刘晋宇  阅读(18)  评论(0)    收藏  举报

导航