【MyBatis_01】第一个MyBatis程序

62 阅读6分钟

无论我们在使用什么软件的时候,我们首先都会进行一个步骤就是安装这个程序,同样的对于我们使用MyBatis框架而言,我们也需要安装此框架,创建一个Maven项目、在pom.xml引入相关依赖即可:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.32</version>
</dependency>

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.16</version>
</dependency>
<!-- 单元测试依赖 -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.9</version>
    <scope>test</scope>
</dependency>

除此之外,为了优化我们的开发体验,使用Idea的可以安装此插件MyBatisX,此插件可以快速帮助我们从接口到对应的mapper.xml文件。

00_mybatis_idea_plugin.png

如上的准备都做好之后,就可以进行第一个MyBatis程序的编写了。

建表

首先准备如下的一张表:

create table sys_user
(
    id               int auto_increment
        primary key,
    username         varchar(50)  null comment '登录用户名',
    password         varchar(50)  not null comment '密码',
    nickname         varchar(50)  null comment '昵称',
    head_img_url     varchar(255) null comment '头像地址',
    phone            varchar(11)  null comment '手机号码',
    address          varchar(50)  null comment '地址',
    creation_time    datetime     not null comment '创建时间',
    last_modify_time datetime     null comment '最后修改时间',
    is_deleted       mediumtext   null comment '逻辑删除字段',
    gender           varchar(3)   null comment '性别'
)
    comment '用户表';

对应的实体类、gettersetter方法省略。

public class SysUser {
​
    private Long id;
    private String username;
    private String password;
    private String nickname;
    private String headImgUrl;
    private String phone;
    private String gender;
    private String address;
    private Long isDeleted;
    private Date creationTime;
    private Date lastModifyTime;
}

配置文件

MyBatis的配置文件是我们学习MyBatis的入口,这个配置文件包含了我们对这个框架使用的所有配置,比如数据库连接信息,是否启用缓存、Mapper映射文件的配置等。Mybatis会把这个xml文件加载装配为一个Java对象。所有的信息都会在这个对象里面。

<?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>
    <!-- 属性:定义配置外在化 -->
    <properties></properties>
    <!-- 设置:定义mybatis的一些全局性设置 -->
    <settings>
       <!-- 具体的参数名和参数值 -->
       <setting name="" value=""/> 
    </settings>
    <!-- 类型名称:为一些类定义别名 -->
    <typeAliases></typeAliases>
    <!-- 类型处理器:定义Java类型与数据库中的数据类型之间的转换关系 -->
    <typeHandlers></typeHandlers>
    <!-- 对象工厂 -->
    <objectFactory type=""></objectFactory>
    <!-- 插件:mybatis的插件,插件可以修改mybatis的内部运行规则 -->
    <plugins>
       <plugin interceptor=""></plugin>
    </plugins>
    <!-- 环境:配置mybatis的环境 -->
    <environments default="">
       <!-- 环境变量:可以配置多个环境变量,比如使用多数据源时,就需要配置多个环境变量 -->
       <environment id="">
          <!-- 事务管理器 -->
          <transactionManager type=""></transactionManager>
          <!-- 数据源 -->
          <dataSource type=""></dataSource>
       </environment> 
    </environments>
    <!-- 数据库厂商标识 -->
    <databaseIdProvider type=""></databaseIdProvider>
    <!-- 映射器:指定映射文件或者映射类 -->
    <mappers>
    </mappers>
</configuration>

上述的标签可以缺少、不一定都得编写,但是相对顺序一定不能变。否则将会抛出异常,且插件也会提示配置出现错误。

当前阶段我们只需要关注这四个标签properties,typeAliases,environments,mappers

properties: 可以通过子标签的方式设置值,不过当配置项过多的时候、会造成配置文件过大,除此之外也可以通过配置文件的方式,新加一个properties文件。

db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://127.0.0.1:3306/mybatis_blog?useUnicode=true&characterEncoding=utf8
db.username=root
db.password=root123!

typeAliases: 取别名,当我们在mapper映射文件里面填写参数类型或者返回类型等情况时,由于类名很长、我们可以给实体类设置一个别名。也可以在实体类上通过@Alias指定。

    <typeAliases>
        <typeAlias alias="SysUser" type="com.supersist.mybatis.tutorial.pojo.SysUser"/>
        <typeAlias alias="Order" type="com.supersist.mybatis.tutorial.pojo.Order"/>
    </typeAliases>
    <!-- 指定包下下的所有类 默认就是的别名就是 首字母小写的类名 xxx.SysUser   sysUser -->
    <typeAliases>
        <package name="com.supersist.mybatis.tutorial.pojo"/>
    </typeAliases>

environments: 环境标签、用于配置数据库连接信息的。可以配置多个environmentz子标签,用于区分不同的数据库信息,通过default指定运行的环境。

      <environments default="development">
          <environment id="development">
              <transactionManager type="JDBC"/>
              <dataSource type="POOLED">
                  <property name="driver" value="com.mysql.jdbc.Driver"/>
                  <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis_blog?useUnicode=true&amp;characterEncoding=utf8"/>
                  <property name="username" value="root"/>
                  <property name="password" value="root123!"/>
              </dataSource>
          </environment>
      </environments>

如果通过properties文件指定则可以按照如下方式获取值:

    <properties resource="./db.properties"  />
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${db.driver}"/>
                <property name="url" value="${db.url}"/>
                <property name="username" value="${db.username}"/>
                <property name="password" value="${db.password}"/>
            </dataSource>
        </environment>
    </environments>

到这里为止,我们都还没有定如何去操作数据库的方法,我们做了如下的事情:

  • 编写配置文件。
  • 在配置文件中指定实体类的别名。
  • 在配置文件中指定数据库的连接信息。

接下来就去定义方法进行数据的操作。新建一个接口IUserMapper

    public interface IUserMapper {
        
        void addUser(SysUser sysUser);
        
        SysUser getUserById(Long id);
        
    }

Resource目录下,新建mapper/UserMapper.xml文件。

03_mybatis_resource.png

文件内容如下:

    <?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.supersist.mybatis.tutorial.mapper.IUserMapper">
    </mapper>
  • namespace:指向了接口的全限定名称。即包名+接口名。

如果此时安装了MyBatisX这个插件,就可以看到类似于下面的界面。点击这个小鸟就可以找到我们的mapper映射文件。红色的波浪线是在提示我们xml中该方法还没有对应的实现。

01_mybatis_mapper.png

接着编写mapper.xml文件如下:

    <mapper namespace="com.supersist.mybatis.tutorial.mapper.IUserMapper">
        <insert id="addUser" parameterType="SysUser">
            insert into 
                sys_user(username,
                         password,
                         nickname,
                         gender,
                         phone,
                         address,
                         head_img_url,
                         creation_time,
                         last_modify_time,
                         is_deleted)
            values(#{username},
                   #{password},
                   #{nickname},
                   #{gender},
                   #{phone},
                   #{address},
                   #{headImgUrl},now(),now(),0})
        </insert>
        <select id="getUserById" resultType="com.supersist.mybatis.tutorial.pojo.SysUser">
            select * from sys_user where id = #{id}
        </select>
    </mapper>
  • insertselect 标签的id要和接口中定义的方法名称保持一致,这样才能正常运行。 到这里我们所有的功能就已经开发完毕了。
  • 这里的parameterType的取值就是配置的别名。

回到主配置文件中,配置mappers标签。用于配置多个上述的mapper,有如下几种配置方式:

  • 使用 XML 文件指定 Mapper 配置文件路径
      <mappers>
          <!-- XML 配置 -->
          <mapper resource="mapper/UserMapper.xml"/>
      </mappers>
  • 指定 Mapper 接口的类路径
    <mappers>
        <mapper class="com.supersist.mybatis.tutorial.mapper.IUserMapper"/>
    </mappers>
  • 指定 Mapper 所在的包路径
    <mappers>
        <package name="com.supersist.mybatis.tutorial.mapper"/>
    </mappers>

通过包名的方式指定时需要保证如下:Mapper文件的名称和接口名称保持一致、且包的层级要一致

02_mapper_package.png

如上图,否则程序无法正常运行。目前为止所有功能就已经开发完毕、接下来就可以使用了。主配置文件的配置如下:

<?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>
    <properties resource="./db.properties"  />
    <settings>
        <!-- 全局缓存:true/false -->
        <setting name="cacheEnabled" value="true"/>
        <!--缓存级别:SESSION/STATEMENT-->
        <setting name="localCacheScope" value="STATEMENT"/>
    </settings>

    <typeAliases>
        <typeAlias type="com.supersist.mybatis.tutorial.pojo.SysUser" alias="SysUser"/>
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${db.driver}"/>
                <property name="url" value="${db.url}"/>
                <property name="username" value="${db.username}"/>
                <property name="password" value="${db.password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!-- XML 配置 -->
        <mapper resource="mapper/IUserMapper.xml"/>
<!--        <mapper class="com.supersist.mybatis.tutorial.mapper.IUserMapper"/>-->
<!--        <package name="com.supersist.mybatis.tutorial.mapper"/>-->
    </mappers>
</configuration>

接着便可以编写测试代码了。

    @Before
    public void init() throws IOException {
        // 1. 创建SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // 2. 创建SqlSessionFactory对象 mybatis-config-dataSource.xml 改名为 mybatis-config.xml
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder
                .build(Resources.getResourceAsStream("mybatis-config.xml"));
    ​
        // 3. 创建SqlSession对象
        sqlSession = sqlSessionFactory.openSession();
        // 4. 创建mapper代理对象
        userMapper = sqlSession.getMapper(IUserMapper.class);
    }
    @Test
    public void testAddUser() {
        SysUser sysUser = new SysUser();
        sysUser.setUsername("test");
        sysUser.setPassword("test");
        sysUser.setNickname("test");
        sysUser.setPhone("123456789");
        sysUser.setAddress("test");
        sysUser.setGender("男");
        sysUser.setHeadImgUrl("test");
        sysUser.setIsDeleted(0L);
        userMapper.addUser(sysUser);
        // 提交事务
        sqlSession.commit();
    }
    ​
    @Test
    public void testFindUserById() {
        SysUser sysUser = userMapper.getUserById(1L);
        System.out.println(sysUser);
    }
    ​
  • @Before 表示在每一个测试运行方法之前都先运行此方法。

目前所有的信息都是以文件的方式存储在磁盘上。因此我们要首先加载文件:Resources.getResourceAsStream("mybatis-config.xml"), 这一句代码就已经将所有信息加载到内存了。 SqlSessionFactoryBuilder用于创建SqlSessionFactory对象。SqlSessionFactory创造SqlSession对象。SqlSession接口定义了基本的SQL操作,事务管理、以及Mapper对象的获取!

The primary Java interface for working with MyBatis. Through this interface you can execute commands, get mappers and manage transactions.

我们需要通过此接口获取对应的mapper对象或者执行操作数据的方法。这里有两种方式

  • 第一种就是上述代码这样、获取mapper对象,通过mapper对象操作数据库。
  • 第二种的写法SysUser user = (SysUser) sqlSession.selectOne("com.supersist.mybatis.tutorial.mapper.IUserMapper.getUserById", 1l); 很明显第一种写法更优。

分别运行上述两个测试方法,就可以看到运行数据库中插入了数据且查询出来的数据和插入的数据一致。到此第一个mybatis程序的内容就结束了。