Mybatis入门

2019/02/01 Mybatis

Mybatis入门

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

MyBatis is a first class persistence framework with support for custom SQL, stored procedures and advanced mappings. MyBatis eliminates almost all of the JDBC code and manual setting of parameters and retrieval of results. MyBatis can use simple XML or Annotations for configuration and map primitives, Map interfaces and Java POJOs (Plain Old Java Objects) to database records.

简介

MyBatis的前身是iBATIS,是Clinton Begin在2001年发起的一个开源项目,最初侧重于密码软件的开发,后来发展成为一款基于 Java的持久层框架。2004年,Clinton将iBATIS的名字和源码捐赠给了Apache软件基金会,接下来的6年中,开源软件世界发生了巨大的变化,一切开发实践、基础设施、许可,甚至数据库技术都彻底改变了。2010年,核心开发团队决定离开Apache软件基金会,并且将iBATIS改名为MyBatis。2013年11月迁移到Github。

iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)。 MyBatis是一款优秀的支持自定义SQL查询、存储过程和高级映射的持久层框架,消除了几乎所有的JDBC代码和参数的手动设置以及结果集的检索。MyBatis可以使用XML或注解进行配置和映射,MyBatis通过将参数映射到配置的SQL形成最终执行的SQL语句,最后将执行SQL的结果映射成Java对象返回。 与其他的ORM(对象关系映射)框架不同,MyBatis并没有将Java对象与数据库表关联起来,而是将Java方法与SQL语句关联。MyBatis允许用户充分利用数据库的各种功能,例如存储过程、视图、各种复杂的查询以及某数据库的专有特性。如果要对遗留数据库、不规范的数据库进行操作,或者要完全控制SQL的执行,MyBatis将会是一个不错的选择。

与JDBC相比,MyBatis简化了相关代码,SQL语句在一行代码中就能执行。MyBatis提供了一个映射引擎,声明式地将SQL语句的执行结果与对象树映射起来。通过使用一种内建的类XML表达式语言,SQL语句可以被动态生成。 MyBatis支持声明式数据缓存(declarative data caching)。当一条SQL语句被标记为“可缓存”后,首次执行它时从数据库获取的所有数据会被存储在高速缓存中,后面再执行这条语句时就会从高速缓存中读取结果,而不是再次命中数据库。MyBatis 提供了默认情况下基于 Java HashMap的缓存实现,以及用于与OSCache、Ehcache、Hazelcast和Memcached连接的默认连接器,同时还提供了API供其他缓存实现使用。

什么是Mybatis

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

mybatis是一个基于Java的持久层框架(半自动)。持久层框架就是操作数据库的框架,对之前使用的JDBC代码进行了封装。

ORM(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术(将Java中的对象和数据库中的表关联对应起来)。理解为:Java对象与数据库表的映射管理框架。

Mybatis相当于将mapper中的入参和出参结果集封装到java的POJoQ类中,实际上Mybatis是半ORM,它鼓励开发人员自己去写sql,也正是因为sql语句要自己写,所以Mybatis是将java方法与SQL句关联起来,而没有将java对象与数据库关联起来。

Mybatis优势

  • 通过参数映射方式,可以将参数灵活的配置在SQL语句中的配置文件中,避免在Java类中配置参数。
  • 通过输出映射机制,将结果集的检索自动映射成相应的Java对象,避免对结果集手工检索。
  • Mybatis可以通过Xml配置文件对数据库连接进行管理。
  • 实现了sql和java代码的分离,通过配置文件实现sql语句查询。

JDBC编程

java数据库连接。它是java API 提供了一种规范,目的是用这套规范实现不同数据库之间的统一访问 。

JDBC,即 Java Database Connectivity,Java 数据库连接。是一种用于执行 SQL 语句的 Java API,它是 Java 中的数据库连接规范。这个 API 由 java.sql.,javax.sql. 包中的一些类和接口组成,它为 Java 开发人员操作数据库提供了一个标准的 API,可以为多种关系数据库提供统一访问。

简单来说,使用了 JDBC 之后,不管是什么数据库与什么数据库驱动,我们只需要使用一套标准代码就可以实现对不同数据库进行统一操作(添加、修改、删除、查询),也就解决了我们上面说的那些问题了。

简单jdbc编程步骤

  1. 加载数据库驱动
  2. 创建并获取数据库链接
  3. 创建jdbc statement对象
  4. 设置sql语句
  5. 设置sql语句中的参数(使用preparedStatement)
  6. 通过statement执行sql并获取结果
  7. 对sql执行结果进行解析处理
  8. 释放资源(resultSet、preparedstatement、connection)

JDBC驱动Maven依赖

<dependencies>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.21</version>
      <scope>runtime</scope>
    </dependency>
  </dependencies>

数据库的创建

数据库的创建(MySQL)

CREATE DATABASE db1;
 
USE db1;
 
CREATE TABLE `user`(
	`id` INT,
	`name` VARCHAR(30)
);
 
INSERT INTO `user` VALUES (1,'张一'),(2,'张二'),(3,'张三'),(4,'张四'),(5,'张五');

参考代码


import java.sql.*;

public class JDBCTest {

    public static void main(String[] args) throws Exception {
        String url = "jdbc:mysql://localhost:3306/db1";
        String user = "";
        String password = "";
        Class.forName("com.mysql.cj.jdbc.Driver");
        Connection connection = DriverManager.getConnection(url, user, password);
        Statement statement = connection.createStatement();
        String sql = "SELECT * FROM user";
        ResultSet rs = statement.executeQuery(sql);

        while (rs.next()) {
            System.out.println(rs.getInt("id") + "\t" + rs.getString("name"));
        }

        connection.close();
        statement.close();
        connection.close();

    }
}

问题总结

1.数据库连接,使用时就创建,不使用立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响数据库性能。

设想:使用数据库连接池管理数据库连接。

2.将sql语句硬编码到java代码中,如果sql语句修改,需要重新编译java代码,不利于系统维护。

设想:将sql语句配置在xml配置文件中,即使sql变化,不需要对java代码进行重新编译。

3.向preparedStatement中设置参数,对占位符号位置和设置参数值,硬编码在java代码中,不利于系统维护。

设想:将sql语句及占位符号和参数全部配置在xml中。

4.从resultSet中遍历结果集数据时,存在硬编码,将获取表的字段进行硬编码,不利于系统维护。

设想:将查询的结果集,自动映射成java对象。

参考资料

mybatis-3 GitHub地址:https://github.com/mybatis/mybatis-3

mybatis-3 官网地址https://mybatis.org/mybatis-3

MyBatis官方GitHub地址为https://github.com/mybatis。在官方GitHub中可以看到MyBatis的多个子项目。在本书中,我们将学习以下内容。

· mybatis-3(https://github.com/mybatis/mybatis-3):MyBatis 源码,也是本书中主要讲解和使用的内容。

· generator(https://github.com/mybatis/generator):代码生成器,可以生成一些常见的基本方法,提高工作效率。

· ehcache-cache(https://github.com/mybatis/ehcache-cache):默认集成Ehcache的缓存实现。

· redis-cache(https://github.com/mybatis/redis-cache):默认集成Redis的缓存实现。

· spring(https://github.com/mybatis/spring):方便和Spring集成的工具类。

· mybatis-spring-boot(https://github.com/mybatis/mybatis-spring-boot):方便和Spring Boot集成的工具类。

除此之外还有大量和其他项目集成的子项目,如果有需要,学习本书内容之余可以自学其他相关的技术。

Search

    微信好友

    博士的沙漏

    Table of Contents