MyBatis是什么?

mybatis是一个集成了JDBC的持久层框架。
简化我们之前繁琐的JDBC操作。

1、创建Maven项目

1.1pom.xml文件中导入MyBatis,junit,mysql包

<?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>com.yiyu</groupId>
    <artifactId>MyBatisLogItem</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.27</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.9</version>
        </dependency>
    </dependencies>
    <build>
        <!-- 资源目录 -->
        <resources>
            <resource>
                <!-- 设定主资源目录  -->
                <directory>src/main/java</directory>
                <!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,只处理如下配置中包含的资源类型 -->
                <includes>
                    <include>**/*.xml</include>
                </includes>
                <!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,不处理如下配置中包含的资源类型(剔除下如下配置中包含的资源类型)-->
                <excludes>
                    <exclude>**/*.yaml</exclude>
                </excludes>
                <!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,是否对主资源目录开启资源过滤 -->
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>
</project>

junit:是为了我们再测试时方便写在一个类中

mybatis:我们学习mybatis当然要导入myatis包

mysql:因为我们的mybatis是一个集成了JDBC的框架,所以要涉及到数据库

2、创建数据库表,mysql版本为8
use master 
create database mybatis
use mybatis
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` int NOT NULL,
  `name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT 'NULL',
  `pwd` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT 'NULL',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
INSERT INTO `user` VALUES (0, '张九日', '32123');
INSERT INTO `user` VALUES (2, '李四', '123456');
INSERT INTO `user` VALUES (3, '张三', '123456');
INSERT INTO `user` VALUES (4, '赵久', '123456');
INSERT INTO `user` VALUES (6, '呓语', '123456');

数据库表结构

3、创建实体类[User]
package entity;

public class User {
    public User() {
    }

    public User(int id, String name, String pwd) {
        this.id = id;
        this.name = name;
        this.pwd = pwd;
    }

    int id;
    String name;
    String pwd;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                '}';
    }
}
4、创建接口UserDao
package dao;

import entity.User;

import java.util.List;

public interface UserDao {
    List<User>getList();
    int add();
}

我们用mybatis的话就不用去再写一个类去实现他了,因为mybatis都帮我们做了

再这里我们先写两个方法,后面在加

5、创建mybatis配置文件[mybatisConfig.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="mysql">
        <environment id="mysql">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <!--指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件-->
    <mappers>
        <mapper resource="UserMapper.xml" />
    </mappers>

</configuration>
  • configuration标签配置连接池
  • environments里面放的是数据源,defalut是使用哪个数据源,对应environment的id
  • 比如我们有mysql,oracle,sqlserver,sqlite 等
  • 现在我们默认使用的是mysql的数据源
environment数据源标签,id为唯一标识符

然后配置url,驱动,账号,密码

我们每一个dao都会配有一个独立的xml映射文件

mappers标签里放的是我们的映射源

6、创建UserMapper.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="dao.UserDao">
    <select id="getList" resultType="entity.User">
        select * from user
    </select>
</mapper>
一个映射文件映射一个dao

namespace:命名空间绑定我们的接口类

select标签
  • id:对应接口中的方法名
  • resultType:我们传统的JDBC操作是不是都会有一个返回值,我们这个属性就是配置我们结果集的返回类型,因为我们这里的返回类型是User,mybatis这里会把我们多个对象添加到集合中
  • select标签中就是我们要写的sql语句
7、创建获取SqlSession对象方法
package util;

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;
import java.io.InputStream;

public class MybatisUtils {

    private static  SqlSessionFactory sqlSessionFactory;

//    既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句
    public static SqlSession getSqlSession(){
        {
            try {
//            使用Mybatis获取sqlSessionFactory对象
                String resource="mybatisConfig.xml";
                InputStream inputStream= Resources.getResourceAsStream(resource);
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return sqlSessionFactory.openSession();
    }

}
8、最后我们创建测试类来测试一下
import dao.UserDao;
import entity.User;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import util.MybatisUtils;

import java.util.List;

public class MyTest {
    @Test
    public void test1(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        List<User> list = mapper.getList();
        for (User user : list) {
            System.out.println(user);
        }
         sqlSession.close();
    }
}
用我们写好的返回sqlSession的方法获取工厂对象

带入我们的接口类就能直接运行接口中的方法

最后记得释放资源

9、现在我们要加使用别的方法就只要在接口中添加方法名,mapper配置文件中配置对应的sql标签就可以直接使用了,奉上代码

mapper配置文件

<?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="dao.UserDao">
    <select id="getList" resultType="entity.User">
        select * from user
    </select>
    <insert id="add" parameterType="entity.User">
        insert into user
        values (#{id},#{name},#{pwd});
    </insert>
</mapper>
  • 加了一个添加的方法
  • parameterType:参数类型,我们调用添加方法的时候是不是要带一个对象过来才能添加,所以我们这里添加的对象是什么,带对应的类进去就行了
  • sql语句values这里注意一下,之前我们数据库中有多少个列名我们就带多少个问号,我现在我们用#{对象里面的某个属性}代替要添加的每一个列名,我们现在数据库有3个字段就把每一个对应的填充进去就行了
UserDao接口中添加接口,我这里把最基本的增删改查都写进去了,后面我就省略这段
package dao;

import entity.User;

import java.util.List;

public interface UserDao {
    List<User>getList();
    int add(User user);
    int delete(int id);
    int update(User user);
}
10、测试添加方法
    @Test
    public void test2() {
//        获取sqlSession对象
        SqlSession sqlSession = MybatisUtils.getSqlSession();
//        获取映射对象
        UserDao mapper = sqlSession.getMapper(UserDao.class);
//        初始化一个用户对象
        User user = new User(20, "天启", "123");
        int add = mapper.add(user);
//        返回影响的行数
        System.out.println(add);
//      提交事务
        sqlSession.commit();
//        释放资源
        sqlSession.close();
    }
  • 这里注意,因为我们原始的JDBC操作我们执行excuteQuery()或者excuteUpdate()操作之后我们的数据就添加成功了,是因为我们的原始的JDBC帮我们自动提交了事务
  • 在MyBatis中他是没有给我们自动提交事务的,所以我们要自己提交事务,不然你们会发现你们的数据库并没有多出一条数据
  • 这里就有人问了,为什么做查询语句的时候不用提交事务,解:百度
mapper配置文件增加delete方法以及update方法
    <delete id="delete" parameterType="int" >
        delete
        from user
        where id=#{id};
    </delete>
    <update id="update" parameterType="entity.User">
        update user
        set name = #{name},pwd=#{pwd}
        where id=#{id};
    </update>

这里我们就不多解释了,举一反三,没看懂的从头看一遍

11、测试删除和修改方法
    @Test
    public void test3() {
//        获取sqlSession对象
        SqlSession sqlSession = MybatisUtils.getSqlSession();
//        获取映射对象
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        int delete = mapper.delete(20);
//        返回影响的行数
        System.out.println(delete);
//      提交事务
        sqlSession.commit();
//        释放资源
        sqlSession.close();
    }
    @Test
    public void test4() {
//        获取sqlSession对象
        SqlSession sqlSession = MybatisUtils.getSqlSession();
//        获取映射对象
        UserDao mapper = sqlSession.getMapper(UserDao.class);
//        初始化一个用户对象
        User user = new User(2, "王九人", "987654321");
        int update = mapper.update(user);
//        返回影响的行数
        System.out.println(update);
//      提交事务
        sqlSession.commit();
//        释放资源
        sqlSession.close();
    }
12、至此结束。当然这是最简单到mybatis操作。
附上本章学习MyBatis项目
最后修改:2023 年 01 月 31 日
如果觉得我的文章对你有用,请随意赞赏