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

一.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快速入门之环境搭建和单表映射,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Mybatis 开发注解快速入门

    快速普及 1.mybatis是什么 mybatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架. MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录. Mybatis实现了接口绑定,使用更加方便. 对象关系映射的改进,效率更高 MyBatis采用功能强大的基于OGNL的表达式来

  • Windows下Java+MyBatis框架+MySQL的开发环境搭建教程

    MyBatis是一个Java持久化框架,它通过XML描述符或注解把对象与存储过程或SQL语句关联起来. MyBatis是在Apache许可证 2.0下分发的自由软件,是iBATIS 3.0的分支版本.其维护团队也包含iBATIS的初创成员. 与其他的对象关系映射框架不同,MyBatis并没有将Java对象与数据库表关联起来,而是将Java方法与SQL语句关联.MyBatis允许用户充分利用数据库的各种功能,例如存储过程.视图.各种复杂的查询以及某数据库的专有特性.如果要对遗留数据库.不规范的数据

  • mybatis3.3+struts2.3.24+mysql5.1.22开发环境搭建图文教程

    一.新建Web工程,并在lib目录下添加jar包  主要jar包:struts2相关包,mybatis3.3相关包,mysql-connector-java-5.1.22-bin.jar, gson-2.1.jar 二.配置web.xml,添加一个过滤器StrutsPrepareAndExecuteFilter,处理所有*.action请求: <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns

  • mybatis快速入门学习教程新手注意问题小结

    什么是mybatis MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录. orm工具的基本思想 无论是用过的hibernate,mybatis,你都可以法相他们有一个共同点: 1. 从配置文件(通常是XML配置文件中)得到 ses

  • Java+MyBatis+MySQL开发环境搭建流程详解

    主要搭建过程 1. pom.xml文件中加入mybatis和数据库依赖,这里使用mysql: <properties> <mybatis.version>3.2.3</mybatis.version> <mysql.version>5.1.26</mysql.version> <slf4j.api.version>1.7.5</slf4j.api.version> <testng.version>6.8.7&l

  • MyBatis快速入门

    一.MyBatis背景介绍 MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录. 二.MyBatis开发环境搭建 2.1准备开发环境 1.在eclipse中新建一个javaweb项目MyBatis_Study 2.添加相应的ja

  • MyBatis入门学习教程(一)-MyBatis快速入门

    MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis .2013年11月迁移到Github. iBATIS一词来源于"internet"和"abatis"的组合,是一个基于Java的持久层框架.iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO) 首先给大家介绍MyBatis的含义

  • MyBatis快速入门(简明浅析易懂)

    一.MyBatis简介 MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架. MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装. MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录. JDBC -> dbutils(自动封装) -> MyBatis -> Hibernate mybatis是将sql写在xml中,然

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

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

  • MyBatis入门学习教程-MyBatis快速入门

    目录 Mybatis 一.快速开始 1.创建 Maven 项目 2.导入 Maven 依赖 3.配置 Maven 插件 4.新建数据库,导入表格 5.编写 Mybatis 配置文件 6.编写实体类 7.编写 mapper 接口 8.编写 mapper 实现 9.Mybatis 配置文件中,添加 mapper 映射 10.编写 Mybatis 工具类 11.测试 二.日志添加 1.添加 Maven 依赖 2.添加 log4j 配置 3.Mybatis 中配置 LOG 4.执行测试 三.Mybati

  • SpringCloud入门实验环境搭建

    微服务 个人理解: 所谓微服务是指每个模块都可以独立完成自己的核心业务,某一个模块的崩溃不影响其他模块的运行, 每个微服务有自己单独的一个数据库 每一个微小的服务组成了一个复杂的软件系统 微服务架构 微服务指的是服务的大小,关注的是完成一个具体的服务(医院的科室) 微服务架构是一种架构模式 ,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相 配合,为用户提供最终价值.一种将一个单一应用程序开发为一组小型服务的方法,每个服务都在其运行 的进程中.(整个医院) 优点: 针对特定服务发布

  • ASP.NET Core快速入门之环境篇

    前言 ASP.NET Core 是一个开源和跨平台的框架,用于构建如 Web 应用.物联网(IoT)应用和移动后端应用等连接到互联网的基于云的现代应用程序.ASP.NET Core 应用可运行于 .NET Core 和完整的 .NET Framework 之上.它整合了原来ASP.NET中的MVC和WebApi框架,你可以在 Windows.Mac 和 Linux 上跨平台的开发和运行你的 ASP.NET Core 应用. vmware虚拟机安装 vmware哪里下载?360软件管家就可以下载.

  • python框架flask入门之环境搭建及开启调试

    传说中的python web开发有2大宝器,一个是倚天剑,一个就是屠龙刀.django作为倚天剑已经被大众所熟知,今天我们就来看看flask这把屠龙宝刀. 简介 Flask 是依赖Jinja模板引擎和 WerkzeugWSGI 套件的一套web微框架. 它是小巧的,它是符合wsgi标准的,它是优雅的,也是容易上手的框架,可以说谁掌握了flask这把屠龙刀,谁就可以号令python的web江湖. 安装 包管理工具的出现使得软件安装变得异常简单和容易.python中的包管理工具是pip.一般这个工具

  • Mybatis示例讲解注解开发中的单表操作

    目录 Mybatis注解开发单表操作 MyBatis的常用注解 MyBatis的增删改查 注解开发总结 常用注解 配置映射关系 练习项目代码 Mybatis注解开发单表操作 MyBatis的常用注解 Mybatis也可以使用注解开发方式,这样我们就可以减少编写Mapper映射文件了.我们先围绕一些基本的CRUD来学习,再学习复杂映射多表操作. 注解 说明 @Insert 实现新增 @Update 实现更新 @Delete 实现删除 @Select 实现查询 @Result 实现结果集封装 @Re

  • Fluent Mybatis快速入门详细教程

    使用fluent mybatis可以不用写具体的xml文件,通过java api可以构造出比较复杂的业务sql语句,做到代码逻辑和sql逻辑的合一. 不再需要在Dao中组装查询或更新操作,在xml或mapper中再组装参数.喜欢的朋友可以阅读这篇文章   http://www.jb51.net/article/218884.htm 对底层数据表关联关系的处理,我们总是绕不开什么一对一,一对多,多对多这里比较烦人的关系. 业界优秀的ORM框架也都给出了自己的答案,简单来说就以下几种方式: hibe

随机推荐