【Java】MyBatis(创建过程、配置文件)

发布于:2025-08-13 ⋅ 阅读:(18) ⋅ 点赞:(0)

一、MyBatis 是什么?它解决了什么问题?

        MyBatis 最初是 Apache 的一个开源项目 iBatis,2010 年更名为 MyBatis。它是一款支持定制化 SQL、存储过程以及高级映射的持久层框架,核心思想是将 SQL 语句与 Java 代码分离,让开发者能够更专注于 SQL 本身的编写,同时简化参数映射和结果集处理的过程。

        在 JDBC 时代,开发者需要手动编写加载驱动、创建连接、处理结果集等重复代码,不仅繁琐,还容易出错。而 Hibernate 等全自动化 ORM 框架虽然简化了操作,却在复杂 SQL 场景下显得不够灵活,难以优化性能。MyBatis 的出现恰好弥补了两者的不足:它保留了 SQL 的灵活性,同时通过 XML 或注解的方式实现了参数和结果集的自动映射,让开发者在 “手写 SQL” 和 “自动化处理” 之间找到了完美平衡。

二、MyBatis 核心组件

要掌握 MyBatis,首先需要了解它的核心组件,这些组件相互配合,共同完成数据库操作的全流程:

  1. SqlSessionFactoryBuilder:顾名思义,它是SqlSessionFactory的构建者。通过加载 MyBatis 的核心配置文件(通常是mybatis-config.xml),生成SqlSessionFactory实例,生命周期短暂,一般在程序启动时执行一次即可。

  2. SqlSessionFactory:作为创建SqlSession的工厂,它一旦被创建就会在应用程序运行期间一直存在,通常采用单例模式管理,避免频繁创建造成资源浪费。

  3. SqlSession:数据库操作的会话对象,提供了增删改查的方法,同时负责管理事务。它是线程不安全的,因此每次使用后需要及时关闭,通常通过try-with-resources语法确保资源释放。

  4. Mapper 接口:开发者定义的数据库操作接口,MyBatis 会通过动态代理为其生成实现类,将接口方法与 XML 映射文件中的 SQL 语句关联起来,无需手动编写实现类。

  5. 映射文件(Mapper XML):存储 SQL 语句的地方,通过namespace与 Mapper 接口绑定,支持动态 SQL、结果集映射等功能,是 MyBatis 灵活性的核心体现

三、MyBatis项目创建过程

1. 环境准备

  • 引入依赖(以 Maven 为例):
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.13</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.33</version>
</dependency>
  • 编写核心配置文件mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    
    <!-- 配置全局配置 -->
    <settings>
        <!-- 允许下划线命名的列名自动映射到驼峰命名的属性 -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    
    <!--开发模式-->
    <environments default="env">
        <environment id="env">
            <!--事务管理-->
            <transactionManager type="JDBC"/>
            <!--数据源-->
            <dataSource type="pooled">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/summer_practice?serverTimezone=GMT"/>
                <property name="username" value="root"/>
                <property name="password" value="162534"/>
            </dataSource>
        </environment>
    </environments>

    <!--映射器的注册-->
    <mappers>
        <mapper resource="com/ape/mapper/StudentMapper.xml"/>
    </mappers>
</configuration>

2. 定义实体类和 Mapper 接口

// 实体类
public class Student implements Serializable {
    private int stuId;
    private String stuName;
    private String nickName;
    private String stuSex;
    private int stuAge;
    
    @Override
    public String toString() {
        return "Student{" +
                "stuId=" + stuId +
                ", stuName='" + stuName + '\'' +
                ", nickName='" + nickName + '\'' +
                ", stuSex='" + stuSex + '\'' +
                ", stuAge=" + stuAge +
                '}';
    }

    public int getStuId() {
        return stuId;
    }

    public void setStuId(int stuId) {
        this.stuId = stuId;
    }

    public String getStuName() {
        return stuName;
    }

    public void setStuName(String stuName) {
        this.stuName = stuName;
    }

    public String getNickName() {
        return nickName;
    }

    public void setNickName(String nickName) {
        this.nickName = nickName;
    }

    public String getStuSex() {
        return stuSex;
    }

    public void setStuSex(String stuSex) {
        this.stuSex = stuSex;
    }

    public int getStuAge() {
        return stuAge;
    }

    public void setStuAge(int stuAge) {
        this.stuAge = stuAge;
    }

    public Student(String stuName, String nickName, String stuSex, int stuAge) {
        this.stuName = stuName;
        this.nickName = nickName;
        this.stuSex = stuSex;
        this.stuAge = stuAge;
    }
    public Student() {
    }
    public Student(int stuId, String stuName, String nickName, String stuSex, int stuAge) {
        this.stuId = stuId;
        this.stuName = stuName;
        this.nickName = nickName;
        this.stuSex = stuSex;
        this.stuAge = stuAge;
    }
}



// Mapper接口
public interface StudentMapper {

    public List<Student> selectStudent();

}

    3. 编写映射文件StudentMapper.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
    <mapper namespace="com.ape.mapper.StudentMapper">
    
        <select id="selectStudent" resultType="com.ape.pojo.Student">
    #         select stu_id AS stuId,stu_name AS stuName,nick_name AS nickName,stu_age AS atuAge,stu_sex AS stuSex from student;
            select * from student;
        </select>
        
    </mapper>

    4. 测试

    public class test {
        InputStream is = null;
        SqlSession session = null;
        StudentMapper mapper = null;
    
        @Before
        public void beforeMethod(){
            try {
                //1.加载mybatis的主配置文件
                is = Resources.getResourceAsStream("Mybatis_config.xml");
    
                //2.创建SqlSessionFactoryBuilder(会话工厂制造器)
                SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
    
                //3.创建SqlSessionFactory(会话工厂对象)
                SqlSessionFactory factory = sqlSessionFactoryBuilder.build(is);
    
                //4.创建SqlSession,类似jdbc的Connection与Statment的结合(会话对象)
                session = factory.openSession();
    
                //5.加载映射器(获取mapper映射器)
                mapper =  session.getMapper(StudentMapper.class);
                
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    
    
        @After
        public void afterMethod(){
            try {
                //7.资源回收
                session.close();
                is.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    
        @Test
        public void test01() throws IOException {
            //6.调用方法
            List<Student> students = mapper.selectStudent();
            for (int i = 0; i < students.size(); i++) {
                Student student =  students.get(i);
                System.out.println(student);
            }
        }
    }
    

    5、项目创建好的结构

    四、总结

            MyBatis 以其 “半自动化” 的特性,在灵活性和开发效率之间找到了平衡,成为 Java 持久层框架的佼佼者。它让开发者能够专注于 SQL 优化,同时通过映射机制简化参数和结果集处理,极大地提升了开发效率。无论是小型项目的快速开发,还是大型项目的复杂 SQL 场景,MyBatis 都能胜任。掌握 MyBatis,不仅是 Java 开发者的必备技能,更是理解数据持久层设计思想的重要途径。如果你还在为数据库操作的繁琐而困扰,不妨试试 MyBatis,相信它会给你带来全新的开发体验。

     


    网站公告

    今日签到

    点亮在社区的每一天
    去签到