欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MyBatis快速入门之环境搭建和单表映射

程序员文章站 2024-03-04 11:56:35
一.mybatis简介     一说起对象关系映射框架,大家第一时间想到的肯定是hibernate。hibernate作为一个著名的框架,功...

一.mybatis简介

    一说起对象关系映射框架,大家第一时间想到的肯定是hibernate。hibernate作为一个著名的框架,功能十分强大。我们只需要配置好实体类和数据表之间的关系,hibernate就会自动帮我们完成生成并执行sql语句,映射结果集这样的工作。但是也正是由于hibernate如此强大的功能,导致了它的缺点:一是非常笨重,启动hibernate的sessionfactory非常耗时,开销巨大;二是配置复杂,学习成本较高,系统调优也不容易;三是自定义查询功能较弱,查询结果如果不是映射的实体类,查询起来就比较麻烦。因此另一个orm框架mybatis,越来越流行。

    前面说到的几个hibernate的缺点,反过来正好就是mybatis的优点:一是非常轻量,系统开销小;二是配置简单,易于学习,官方文档我直觉上感觉比log4j2的文档还少;三正好就是mybatis的特点,映射查询结果非常灵活。另外mybatis还有一个优点就是自带中文文档,可能有些地方感觉不太通顺,但是完全足够我们学习和使用了。

二.配置环境

1.依赖引入

    添加mybatis最简单的办法就是使用maven或gradle这样的构建工具。在这里我使用gradle。在项目中添加如下几行即可。如果确定不使用新的java 8 时间api,那么第二行的依赖还可以去掉。这里我用的数据库是mysql,因此还需要添加mysql的jdbc驱动。

compile group: 'org.mybatis', name: 'mybatis', version: '3.4.2'
  compile group: 'org.mybatis', name: 'mybatis-typehandlers-jsr310', version: '1.0.2'
  compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.40'

2.配置文件

    然后我们需要编写mybatis的配置和映射文件。所有这些配置文件最好放在类路径上,对于gradle项目来说就是src/main/resources文件夹下。我们先来编写一个配置文件。配置文件每个部分的详细作用请参见官方文档,这里只简单说明一下。

        属性部分。在这里定义mybatis需要的属性,可以用在下面的多个地方。另外属性也可以从外部properties文件中导入。

        系统设置。在这里指定mybatis的全局配置。详细的配置参加文档。

        简写名。在映射文件中需要指定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>
      <property name="driver" value="com.mysql.jdbc.driver"/>
      <property name="url" value="jdbc:mysql://localhost:3306/test"/>
      <property name="username" value="root"/>
      <property name="password" value="12345678"/>
      <property name="driver.usessl" value="false"/>
    </properties>
    <!--系统设置-->
    <settings>
      <setting name="cacheenabled" value="true"/>
      <setting name="lazyloadingenabled" value="true"/>
    </settings>
    <!--指定简写名-->
    <typealiases>
      <package name="yitian.study.entity"/>
    </typealiases>
    <!--配置环境,可以配置多个环境用于测试、调试和生产-->
    <environments default="development">
      <environment id="development">
        <transactionmanager type="jdbc"/>
        <datasource type="pooled">
          <property name="driver" value="${driver}"/>
          <property name="url" value="${url}"/>
          <property name="username" value="${username}"/>
          <property name="password" value="${password}"/>
        </datasource>
      </environment>
    </environments>
    <!--配置映射文件-->
    <mappers>
      <mapper resource="baseentitymapper.xml"/>
    </mappers>
  </configuration>

3.创建sqlsessionfactory

    有了配置文件,我们就可以开始使用mybatis了。首先要做的事情是创建mybatis的sqlsessionfactory,它和hibernate的sessionfactory类似,是主要的工厂类,一个应用程序中只需要创建一个即可。
    下面是一个工具类,用双检锁简单的实现了一个线程安全的工具类。核心代码在最内层的if判断中。由于配置文件在类路径上,所以我们只需要指定文件名即可。这里用到了mybatis提供的resources工具类,创建一个输入流,然后交给sqlsessionfactorybuilder来创建一个sqlsessionfactory。

 public abstract class mybatisutils {
    private static volatile sqlsessionfactory sqlsessionfactory;
    public static final string mybatisconfiglocation = "configuration.xml";
    public static sqlsessionfactory getsqlsessionfactory() throws ioexception {
      if (sqlsessionfactory == null) {
        synchronized (mybatisutils.class) {
          if (sqlsessionfactory == null) {
            inputstream input = resources.getresourceasstream(mybatisconfiglocation);
            sqlsessionfactory = new sqlsessionfactorybuilder().build(input);
            input.close();
          }
        }
      }
      return sqlsessionfactory;
    }
  }

    创建好sqlsessionfactory之后,我们就可以开始使用mybatis了。这里先回过头看看如何创建mybatis映射文件。然后我们在继续使用mybatis。

三.单表映射

1.数据表和实体类

    在配置文件最后的mapper部分定义的就是映射文件。映射文件也是我们需要重点学习的地方。在映射文件中我们需要定义各种sql语句,并建立它们和java实体类之间的关系。这里我们使用最简单的单表映射:数据表和实体类之间属性名相同,一一对应。

    首先先来添加一个实体类。

 public class person {
    private int id;
    private string username;
    private localdate birthday;
  }

    对应的数据库表如下。

 create table person (
   id    int auto_increment primary key,
   username varchar(255) not null unique,
   birthday date
  );

2.映射文件

    然后我们来编写映射文件。映射文件包含5条sql语句,分别是增删查改以及按名称查找。每一条语句都需要一个标识符,将会在后面再代码中用到。如果是查询语句还需要resulttype,指定返回类型。mybatis会将数据表列明和这里指定的类型属性按名称自动映射起来。如果需要在语句中传入参数,可以使用 parametertype属性,指定java实体类的全名或简写,然后就可以在sql语句中使用#{}来访问参数的属性了。如果是简单的映射,那么parametertype属性还可以省略,mybatis会自动从传入的java对象中获取相应的属性。对于某些数据库(例如mysql),还可以在插入的时候指定usegeneratedkeys="true",让数据库自动生成主键。

 <?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="yitian.study.dao.mapper">
    <select id="selectperson"
        resulttype="person" parametertype="person">
      select *
      from person
      where id = #{id}
    </select>
    <select id="selectpersonbyname"
        resulttype="person">
      select *
      from person
      where username = #{username}
    </select>
    <insert id="insertperson"
        usegeneratedkeys="true">
      insert into person (username, birthday) values (#{username}, #{birthday})
    </insert>
    <update id="updateperson">
      update person
      set birthday = #{birthday}
      where id = #{id}
    </update>
    <delete id="deleteperson">
      delete from person
      where id = #{id}
    </delete>
  </mapper>

四.使用mybatis

    以上这些都配置好之后,我们就可以来使用mybatis了。这里我们使用一个单元测试来查看mybatis的功能。在创建sqlsessionfactory之后,我们需要获取mybatis最核心的对象sqlsession,所有操作都需要sqlsession来进行。另外它是非线程安全的对象,不能放在类的静态字段上,最好也不要作为实例字段。我们要在需要的时候创建它,不用的时候及时释放。
    常用的方法有增删查改这几个方法。这些方法的第一个参数是前面我们在映射文件中定义的语句id,第二个参数是要传入的参数。对于查询来说有selectone和selectlist方法,它们的区别主要在于返回个数,如果确定只返回一个对象就使用selectone方法。

 import static org.assertj.core.api.assertions.*;
  public class mybatistest {
    private static sqlsessionfactory sqlsessionfactory;
    private sqlsession sqlsession;
    @beforeclass
    public static void init() throws ioexception {
      sqlsessionfactory = mybatisutils.getsqlsessionfactory();
    }
    @before
    public void before() {
      sqlsession = sqlsessionfactory.opensession(true);//自动提交
    }
    @after
    public void after() {
      sqlsession.close();
    }
    @test
    public void testmybatisutils() {
      assertthat(sqlsessionfactory).isnotnull();
    }
    @test
    public void testinsert() {
      person p = new person(0, "yitian", localdate.of(1993, 5, 6));
      sqlsession.insert("insertperson", p);
      person s = sqlsession.selectone("selectpersonbyname", p.getusername());
      assertthat(s).isnotnull();
      system.out.println(s);
      sqlsession.delete("deleteperson", s);
    }
    @test
    public void testupdate() {
      person p = new person(1, "leo", localdate.of(1993, 5, 6));
      sqlsession.insert("insertperson", p);
      p = sqlsession.selectone("selectpersonbyname", p.getusername());
      localdate b = localdate.of(1987, 7, 8);
      p.setbirthday(b);
      sqlsession.update("updateperson", p);
      person s = sqlsession.selectone("selectpersonbyname", p.getusername());
      assertthat(s.getbirthday()).isequalto(b);
      system.out.println(s);
      sqlsession.delete("deleteperson", s);
    }
  }

    另外默认情况下mybatis的事务管理是开启的,意味着我们必须显式使用commit()方法才能提交事务。这里在打开sqlsession的时候指定了自动提交,这样我们的所有更改都会立即反映到数据库中。

五.使用映射类

    在前面的例子中,使用的都是字符串来指定要使用的查询。但是这样做非常不方便,字符串容易发生错误,而且无法获得ide的智能补全。所以mybatis提供了另一种方式来执行sql语句,这就是使用映射类。
    映射类其实就是一个简单的接口。该接口中的方法和映射文件中定义的语句一一对应。接口方法的名称必须和语句id完全相同,接口方法的返回值和参数和相应的语句相对应。

public interface personmapper {
    person selectperson(int id);
    person selectpersonbyname(string name);
    void insertperson(person person);
    void updateperson(person person);
    void deleteperson(person person);
  }

       仅仅增加映射类还不够,我们需要修改映射文件,以便让mybatis能找到这个映射类。做法就是将映射文件的命名空间改为对应的映射文件的类名。

<mapper namespace="yitian.study.mapper.personmapper">

    映射类定义和配置好之后,我们就可以使用了。使用方法很简单,在sqlsession上调用getmapper方法,并传入要获取的mapper类即可。

 personmapper mapper = sqlsession.getmapper(personmapper.class);
  person p = new person(0, "yitian", localdate.of(1993, 5, 6));
  mapper.insertperson(p);
  person s = mapper.selectpersonbyname(p.getusername());
  assertthat(s).isnotnull();
  system.out.println(s);
  mapper.deleteperson(p);

    有了映射对象,我们就可以以类型安全的方式来存取对象了,同时还可以获得ide的补全功能。

以上所述是小编给大家介绍的mybatis快速入门之环境搭建和单表映射,希望对大家有所帮助