原创

mybatis入门

温馨提示:
本文最后更新于 2022年06月23日,已超过 4 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

mybatis入门

快速入门

mybatis使用需要依赖的框架

<dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.29</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.10</version>
        </dependency>

mybatis的核心配置文件

<?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">
<!--        配置连接数据库的环境-->
        <environment id="development">
<!--            事务的管理-->
            <transactionManager type="JDBC"/>
<!--            数据源,使用数据库连接池-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
<!--    引入映射文件-->
    <mappers>
        <mapper resource="mappers/UserMapper.xml"/>
    </mappers>
</configuration>

在对核心配置文件进行命名的时候一般将其命名为mybatis-config.xml

因为mybatis是中需要引入映射文件,这里的映射文件也是一个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="cn.rlfit.mybatis.userMapper.UserMapper">
    <insert id="insertUser">
        insert into mybatis values(3,"sdf","sdjf")
    </insert>
    <update id="updateUser">
        update mybatis set name='张三' where id=2
    </update>
    <select id="queryUser" resultType="cn.rlfit.mybatis.User">
        select * FROM mybatis where id = 2;
    </select>
<!--        List<User> queryUserAll();
-->
    <select id="queryUserAll" resultType="cn.rlfit.mybatis.User">
        SELECT * FROM mybatis
    </select>
</mapper>

可以发现映射文件里面定义了SQL语句,但是这些SQL语句将交由谁进行执行呢,查看官方文档可以知道,mybatis是面向接口开发的,这就意味着我们必须使用接口的方式来进行开发,所以我们就需要创建一个接口类,因为这个接口类是用来代替我们执行SQL语句的,不难联想到dao对象,它也是用来执行SQL语句的,没错,当我们创建接口的时候,也可以将其创建在dao包下面

观察配置文件可以发现,有一个叫做namespace的属性,没错这个就是用来找到你当定义的那一个接口的,id就是用来对应里面创建的未实现的接口的,这两个属性的值一个要写对,因为每一条SQL语句都对应接中的一个方法,这样我们才能使用接口的方式执行sql语句

执行SQL语句

要执行SQL语句就需要创建一个主类或者测试类来进行,我们来看看是如何进行SQL语句执行的

package cn.rlfit.test.mybatis;
import cn.rlfit.mybatis.User;
import cn.rlfit.mybatis.userMapper.UserMapper;
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;
import java.sql.SQLException;
import java.util.List;

public class MybatisTest {
    @Test
    public void test_mybatis() throws IOException, SQLException {
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory build = sqlSessionFactoryBuilder.build(is);
        //获取session操作数据库里面的数据
        SqlSession sqlSession = build.openSession();
        //获取mapper接口对象,返回接口对应的实现类
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        int i = mapper.insertUser();
        sqlSession.commit();
    }
    @Test
    public void test_update() throws IOException {
        //加载配置文件
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        //获取操作session的对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory build = sqlSessionFactoryBuilder.build(is);
        SqlSession sqlSession = build.openSession(true);
        //获取mapper对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        mapper.updateUser();
    }
    @Test
    public void test_query() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory build = sqlSessionFactoryBuilder.build(resourceAsStream);
        SqlSession sqlSession = build.openSession(true);
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.queryUser();
        System.out.println(user.toString());
    }

    /**
     *
     * @throws IOException 查询所有结果集
     */
    @Test
    public void test_queryAll() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory build = sqlSessionFactoryBuilder.build(resourceAsStream);
        SqlSession sqlSession = build.openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> users = mapper.queryUserAll();
        for (User user : users) {
            System.out.println(user);
        }
    }
}

这里面测试了相关的一些主要方法,可以发现都存在相同的代码,主要的功能已经写在上面了,这里需要注意的就是opensession里面的true对应是自动提交事务,如果不设置的话就需要我们在执行完SQL语句之后手动的进行SQL语句的提交,对于查询,我们需要提前定义一个实体类,实体类当中包含了表中的所有字段,属性以及名称,并且一一对应,在查询的时候mybatis自动的将SQL中的数据封装到实体类对象当中,有一点需要注意的是,我们在映射文件中定义SQL的时候并没有指明对应的是哪一个实体类,mybatis不能自动的去匹配,需要我们手动进行指定,在select中有几个属性就是来设置这个的,其中当我们的SQL与实体类只存在一对一或者实体类只存在唯一的时候我们就需要使用resultType="cn.rlfit.mybatis.User"来指定对应的实体类,当不存在的时候,就需要使用resultMap来指定.

image-20220623085542562

正文到此结束