您现在的位置是:首页 >技术交流 >如何在自己的Maven工程上搭建Mybatis框架?网站首页技术交流

如何在自己的Maven工程上搭建Mybatis框架?

siaok 2023-07-01 20:00:04
简介如何在自己的Maven工程上搭建Mybatis框架?

编译软件:IntelliJ IDEA 2019.2.4 x64
操作系统:win10 x64 位 家庭版
Maven版本:apache-maven-3.6.3
Mybatis版本:3.5.6



前言

“Mybatis框架”,“Mybatis框架“…, 拆解其名词,我们可以得到”Mybatis是一个框架的名字“这一浅显的结论,但是何为框架?何为Mybatis?且看本文为你分解。


一. 什么是Mybatis框架?

1.1 框架是什么?

举个生活中的例子,当我们努力工作,攒钱买房时,买到的房子是可以直接拧包入住吗?当我们花钱购置自己的的个人电脑时,自己的电脑一买回来就可以直接拿来使用的吗?并不是,买到的房子只是毛胚房,需要后期的装修以及添置家具,才能入住;买到的电脑,需要我们首次开机时设置相应的系统参数,比如设置网络与登录账户或者创建账户等等,才能使用。

框架就相当于上述例子中的毛胚房刚买回但未配置的电脑,是个半成品,Java程序中的框架也是如此,其他语言中的框架亦是如此。

Java程序中常见的框架【后端开发】有:

  1. Mybatis框架持久化层框架【dao层】
  2. SpringMVC框架控制层框架【Servlet)层】
  3. Spring框架全能选手

1.2 什么是MyBatis ?

  1. MyBatis是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架
  2. MyBatis避免了几乎所有的DBC代码和手动设置参数以及获取结果集
  3. MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的 POJO(Plain Ordinary Java Object,普通的Java对象)映射成数据库中的记录
  4. Mybatis是一个半自动的持久化层的ORM(Object Relation Mapping)框架

什么是ORM?

ORM (Object Relation Mapping) --> 【对象 关系 映射】

将java中的对象与数据库中表建立映射关系

优势就是操作java中的对象,就可以影响数据库中表的数据

为何称MyBatis是半自动的?

这是相对于真正的 ORM 框架(例如 Hibernate、Spring Data JPA 等)来说,Mybatis 在对象关系映射方面自动化程度较低。

在 Mybatis 中,开发人员需要手动将 SQL 语句与 Java 对象之间的映射规则定义在 XML 文件或注解中。这意味着,Mybatis 不会自动生成 SQL 语句,并且不会在 Java 对象和数据库表之间进行自动转换。

但是,与此同时,Mybatis 也提供了很多功能上强大的 SQL 语句生成特性,例如:可以动态拼接 SQL 语句、支持使用 DAO 层接口代理执行 SQL 语句等,使得开发人员能够更加灵活地操作数据库。

1.3 MyBatis的参考资料在哪找?

MyBatis的源码地址

MyBatis的官方文档地址


二. 如何搭建Mybatisi框架(入门案例)?

不论导入什么框架,都要历经以下的三步:

  1. 导入jar包
  2. 编写配置文件
  3. 使用核心类库

案例需求:在数据库中建立一个数据表tbl_employee,同时在maven工程中建立一个Employee类,实现从数据库中根据id(员工编号)查找对应的员工信息,尝试使用mybatis框架实现它

2.1 准备数据

①建库建表建约束并导入测试数据

CREATE TABLE tbl_employee(
id INT(11)PRIMARY KEY AUTO_INCREMENT,
last_name VARCHAR(50),
email VARCHAR(50),
salary DOUBLE(10,2)
);

在这里插入图片描述

②准备maven工程

在这里插入图片描述

2.2 搭建Mybatis框架步骤

2.2.1 在该maven工程下的pop.xml中导入jar包

我们需要以下三个jar包:

  • MySQL的驱动jar包 8.0.26
  • junit 4.12
  • Mybatis框架的jar包 3.5.6

示例代码如下:

//pop.xml中导入相关jar包
<dependencies>

    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.26</version>
    </dependency>


    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.6</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/junit/junit -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>



</dependencies>

2.2.2 编写核心配置文件【mybatis-config.xml】

位置:

resources目录下

文件命名:

推荐使用mybatis-config.xml

代码示例如下:

相关代码可直接在 https://mybatis.org/mybatis-3/zh/getting-started.html 中复制相应代码,粘贴到自己的核心配置文件中即可,如下所示。

在这里插入图片描述

在这里插入图片描述

<?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">
                <!--   下面是mysql8版本            -->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <!--    url后要加时区 ?serverTimezone=UTC" ,不然报错           -->
                <property name="url" value="jdbc:mysql://localhost:3306/0411db?serverTimezone=UTC"/>
            <!-- 下面是mysql5版本的写法
                 <property name="driver"value="com.mysql.jdbc.Driver"/>
                 <property name="url"value="jdbc:mysql://localhost:3306/0411db"/>
                -->
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    //设置映射文件的路径
    <mappers>
        <mapper resource="org/mybatis/example/BlogMapper.xml"/>
    </mappers>
</configuration>

在这里插入图片描述

注意:

如果你的MySQL版本为8及以上, url后要加时区“ ?serverTimezone=UTC" ,不然会报错

针对MySQL的数据库版本不同, diver与url的value值写法会有所不同

以我的mysql数据库版本(8.0.26)举例如下所示:

MySQL8版本:

<property naurlme="driver" value="com.mysql.cj.jdbc.Driver"/>
/url后要加时区“ ?serverTimezone=UTC" ,不然会报错
<property name="url" value="jdbc:mysql://localhost:3306/0411db?serverTimezone=UTC"/>

MySQL5版本:

<property name="driver"value="com.mysql.jdbc.Driver"/>
<property name="url"value="jdbc:mysql://localhost:3306/0411db"/>

2.2.3 书写相关接口及映射文件

映射文件位置:

resources/mapper(这是新建一个包Mapper用以存放多个映射文件)

映射文件命名:

XXMapper.xml(推荐与对应的Mapper接口的命名一致)

映射文件作用:

为对应的Mapper接口书写sql语句

ps:

一个xxxMapper接口对应一个映射文件XXMapper.xml

如果有多个Mapper接口,那么resources目录下就必须有多个对应的映射文件,但是resources目录下也存放核心配置文件,为区分核心配置文件与多个映射文件,推荐在resources目录下新建一个包Mapper,用以存放多个映射文件

注意:

  • 映射文件名与接口名保持一致
  • 映射文件namespace与接口全类名保持一致
  • 映射文件Select的Id的属性值与接口的方法名保持一致

在这里插入图片描述

附注:

在这里插入图片描述

示例代码如下:

①在srcmainjavamybatismapper下定义EmployeeMapper接口

package mybatis.mapper;

import mybatis.pojo.Employee;

public interface EmployeeMapper {
	//根据员工编号查找对应的员工信息
    public Employee selectByempId(int empId);

}

②在srcmain esourcesmapper下定义EmployeeMapper接口对应的映射文件EmployeeMapper.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 namespace="mybatis.mapper.EmployeeMapper">
    <!--  resultType:Mapper接口中selectByempId方法的返回值类型【Employee类(写类的全名称)】  -->
    <select id=" selectByempId" resultType="mybatis.pojo.Employee">
        select
            id,
            last_name,
            email,salary
        from
            tbl_employee
        where
            id= #{empId}
    </select>
</mapper>

附注:映射文件中的基本配置信息的相关代码可直接在https://mybatis.org/mybatis-3/zh/getting-started.html 中复制代码,粘贴到自己的映射文件,修改部分参数值即可

在这里插入图片描述

2.2.4 测试(使用SqlSession对象)

步骤:

①先获取SqlSessionFactory对象

②再获取SqlSession对象

③通过SqlSession对象获取KXXMapper代理对象

④测试

代码示例如下:

import mybatis.mapper.EmployeeMapper;
import mybatis.pojo.Employee;
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;

public class TestMybatis {

    @Test
    public void test01(){

        try {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

            //通过SqlSessionFactory对象调用openSession();
            SqlSession sqlSession = sqlSessionFactory.openSession();

            //获取EmployeeMapper的代理对象
            EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
            System.out.println(" employeeMapper.getClass().getName() = "+employeeMapper.getClass().getName());

            Employee employee = employeeMapper.selectByempId(1);
            System.out.println(employee);


        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}

在这里插入图片描述

2.3 搭建log4j 日志框架

为什么要搭建log4j 日志框架?

log4j 日志框架可以把mybatis 的底层运行过程显示出来,便于我们开发者查找bug

步骤:

①在要应用的模块的pop.xml中引入log4j 的jar包

代码示例如下:

<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

②在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) 
" />
        </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>

③运行测试

在这里插入图片描述

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。