MyBatis基本介绍及快速入门案例

2023-12-26 18:30:32

?(2)前身是ibatis,在ibatis3.x时,更名为MyBatis
(3)MyBatis 在java和sql之间提供更灵活的映射方案
(4)MyBatis将sql语句和方法实现,直接写到xml文件中,实现和java程序解耦
(5)mybatis 只负责sql,建库建表的工作由程序员完成

?快速入门案例

0、项目结构

1、新建一个java project ,?并写好maven依赖

这里注意配置末尾的resorce配置,否则会找不到映射文件

maven项目中有一个目录标准,除了标准的resources目录外,src下的xml文件构建时不会被输出到target/classes目录下,故可以将xml文件移至resources目录下(方法一),或者将src下的xml文件也添加成资源(resource),使构建时也会输出到target/classes目录下(方法二)。
?

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>myBatisHello</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
<!--        mybatis核心包-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.15</version>
        </dependency>
<!--java字节码操作框架-->
        <dependency>
            <groupId>org.ow2.asm</groupId>
            <artifactId>asm</artifactId>
            <version>7.1</version>
        </dependency>
<!--生成和转换Java字节码的高级API。-->
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>3.3.0</version>
        </dependency>
<!---->
        <dependency>
            <groupId>ch.qos.reload4j</groupId>
            <artifactId>reload4j</artifactId>
            <version>1.2.25</version>
        </dependency>
<!--日志-->
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.3.0</version>
        </dependency>
<!--        -->
        <dependency>
            <groupId>ognl</groupId>
            <artifactId>ognl</artifactId>
            <version>3.4.2</version>
        </dependency>
<!--日志-->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.22.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.17.1</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
<!--        在Java中编辑字节码的类库-->
        <dependency>
            <groupId>org.javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.29.2-GA</version>
        </dependency>
<!--        作为各种日志框架的简单门面或抽象,允许最终用户在部署时插入所需的日志框架。-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>2.0.9</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
        </dependency>
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.5</version>
        </dependency>
        <!--         拓展c3p0功能的mchange包 -->
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>mchange-commons-java</artifactId>
            <version>0.2.9</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.caches</groupId>
            <artifactId>mybatis-ehcache</artifactId>
            <version>1.2.3</version>
        </dependency>
<!--        java本地缓存技术-->
        <dependency>
            <groupId>net.sf.ehcache</groupId>
            <artifactId>ehcache-core</artifactId>
            <version>2.6.11</version>
        </dependency>

    </dependencies>

 <build>
        <resources>
            <!-- src/main/resources目录下的所有文件 -->
            <resource>
                <directory>src/main/resources</directory>
            </resource>

            <!-- src/main/java目录下的xml文件,也就是我们需要的 XxxMapper.xml 映射文件 -->
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>


</project>

2、创建数据库表

create table `mybatis_monster_` (
	`monster_id` int  	primary key  auto_increment,
	`age` mediumint unsigned not null default 0,
	`birthday` date not null,
	`email` varchar(255) not null default 'dd@qq.com',
	`gender` TINYINT unsigned not null default 1,
	`name` varchar(255) not null default '',
	`salary` double not null default 0.0
	)charset=utf8 engine=InnoDB;

3、配置一个log4j.xml的日志输出文件

注意会使用这个log4j的模版即可(模板来自网络,log4j2是新版,log4j已停止维护,log4j目前还不太懂,先不做深究),不需要记住。

以后会修改就行了,不用管太多,告诉你这么用,你就这么用就可以了。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
<log4j:configuration>
<!--    使用 ConsoleAppender 来输出日志,到IDE的控制台-->
    <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<!--        输出的编码是utf-8 -->
        <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) \n"/>
        </layout>
    </appender>
<!--   日志记录 java.sql包下的类产生的debug级别的错误信息 -->
    <logger name="java.sql">
        <level value="debug"/>
    </logger>
<!--    日志记录 org.apache.ibatis产生的debug级别的错误信息-->
    <logger name="org.apache.ibatis">
        <level value="debug"/>
    </logger>
    <root>
        <level value="debug"/>
        <appender-ref ref="STDOUT"/>
    </root>


</log4j:configuration>

4、配置myBatis-config.xml

mybatis官网mybatis – MyBatis 3 | 配置icon-default.png?t=N7T8https://mybatis.org/mybatis-3/zh_CN/configuration.html

从官网文档中复制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>
    <environments default="development">
<!--        配置我们myBatis的环境-->
        <environment id="development">
<!--            mybatis使用事务管理器是jdbc直连方式-->
            <transactionManager type="JDBC"/>
<!--            配置我们的数据源-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatisdb"/>
                <property name="username" value="root"/>
                <property name="password" value=""/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
<!--        这里引入或者说注册我们的MonsterMapper.xml文件-->
<!--        <mapper resource="com/bin/mybatis/mapper/MonsterMapper.xml"/>-->
        <package name="com.bin.mybatis.mapper"/>
    </mappers>
</configuration>

5、写好javaBean :Monster

//这就是一个普通的Pojo类
//因为使用原生态的sql语句查询结果还是要封装成对象
//所以这里的实体类属性名和数据库表字段名一致
// (必须遵守,否则处理会踩坑,
// 当然也有方法可以处理)

package com.bin.mybatis.entity;

import java.util.Date;

//这就是一个普通的Pojo类
//因为使用原生态的sql语句查询结果还是要封装成对象
//所以这里的实体类属性名和数据库表字段名一致
// (必须遵守,否则处理会踩坑,
// 当然也有方法可以处理)
public class Monster {
    private Integer monster_id;
    private Integer age;
    private Date  birthday;
    private String  email;
    private Integer gender;
    private String  name;
    private Double salary;

    public Monster(Integer monster_id, Integer age, Date birthday, String email, Integer gender, String name, Double salary) {
        this.monster_id = monster_id;
        this.age = age;
        this.birthday = birthday;
        this.email = email;
        this.gender = gender;
        this.name = name;
        this.salary = salary;
    }

    public Monster() {
    }

    public Integer getMonster_id() {
        return monster_id;
    }

    public void setMonster_id(Integer monster_id) {
        this.monster_id = monster_id;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Integer getGender() {
        return gender;
    }

    public void setGender(Integer gender) {
        this.gender = gender;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Double getSalary() {
        return salary;
    }

    public void setSalary(Double salary) {
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "Monster{" +
                "monster_id=" + monster_id +
                ", age=" + age +
                ", birthday=" + birthday +
                ", email='" + email + '\'' +
                ", gender=" + gender +
                ", name='" + name + '\'' +
                ", salary=" + salary +
                '}';
    }
}

6、写好接口MonsterMapper?

接口中定义entity的crud方法

package com.bin.mybatis.mapper;

import com.bin.mybatis.entity.Monster;

public interface MonsterMapper {
    //添加方法
    public void addMonster(Monster monster);
}

7、配置映射器MonsterMapper.xml

表头从官网复制,地址前边mybatis配置已经给出

注意看注释,此处细节较多

特别注意:#{x}?这里表示的是entity的属性 。?如何理解:insert语句中,?前边是数据库字段值,后边是属性值,由于传递参数需要区分开,所以有此#{}

<?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:表示一个映射器
           1. namespace="com.bin.mybatis.mapper.MonsterMapper"
                  说明本mapper.xml文件是用来映射管理MonsterMapper接口
                 ,主要是去实现MonsterMapper接口声明方法
           2.select:实现一个查询操作 insert:表示一个添加操作
           3.id="addMonster"表示MonsterMapper接口的方法名
           4.resultType="xx"返回的结果类型,如果没有就不需要写
           5.parameterType="com.itbul1.mybatis.entity.Monster"表示该方法输入的参数类型
-->
<mapper namespace="com.bin.mybatis.mapper.MonsterMapper">
    <insert id="addMonster" parameterType="com.bin.mybatis.entity.Monster">
        INSERT INTO mybatis_monster_ (monster_id,age,birthday,email,gender,name,salary)
        VALUES (#{monster_id},#{age},#{birthday},#{email},#{gender},#{name},#{salary})
    </insert>
</mapper>

8、使用junit测试

注意测试方法

// ? ? ? ?得到myBatis-config.xml,转换成一个inputStream

? //通过sqlSessionFactory对象获取一个回话

?//通过session获取到 monsterMapper这个接口对象

package com.bin.mybatis.test;

import com.bin.mybatis.entity.Monster;
import com.bin.mybatis.mapper.MonsterMapper;
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.After;
import org.junit.Before;
import org.junit.Test;

import java.io.InputStream;
import java.util.Date;

public class testMybatis {
    private SqlSessionFactory sqlSessionFactory;
    private SqlSession session;
    private MonsterMapper monsterMapper;
    @Before
    public void init() throws Exception{
//        得到myBatis-config.xml,转换成一个inputStream
        InputStream inputStream = Resources.getResourceAsStream("myBatis-config.xml");
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //通过sqlSessionFactory对象获取一个回话
        session = sqlSessionFactory.openSession();
        //通过session获取到 monsterMapper这个接口对象
       monsterMapper = session.getMapper(MonsterMapper.class);

    }
    @Test
    public void test01() {
        Monster monster = new Monster();

        monster.setAge(100);
        monster.setBirthday(new Date());
        monster.setEmail("123@qq.com");
        monster.setGender(1);
        monster.setSalary(8928.00);
        monster.setName("银角");

        monsterMapper.addMonster(monster);

    }
    @After
    public void destory() throws Exception{
        if (session != null) {
            session.commit();
            session.close();
        }
    }
}

9、成功添加一条数据

?

细节说明(报错):

? ? ? ? ? ? ? ? 在此案例中,遇到了了几个异常

? ? ? ? ? ? ? ? 1、无法读取mybatis配置文件。?原因?复制粘贴表头时没有注意检查,多了点号

? ? ? ? ? ? ? ? 2、无法打开session,空指针异常。原因?换了一个配置映射文件的标签,改为扫描整个包

? ? ? ? ? ? ? ? 3、找不到映射文件 。 原因?开头已经说明。src下的xml文件构建时不会被输出到? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? target/classes目录下,故无法找到。

文章来源:https://blog.csdn.net/qq_36684207/article/details/135118510
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。