初识mybatis

     2022-03-28     791

关键词:

MyBatis简介

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。SqlSessionFactoryBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得。

用xml文件构建SqlSessionFactory实例是非常简单的事情。推荐在这个配置中使用类路径资源(classpath resource),但你可以使用任何Reader实例,包括用文件路径或file://开头的url创建的实例。MyBatis有一个实用类----Resources,它有很多方法,可以方便地从类路径及其它位置加载资源。

MyBatis 最强大的特性之一就是它的动态语句功能。如果您以前有使用JDBC或者类似框架的经历,您就会明白把SQL语句条件连接在一起是多么的痛苦,要确保不能忘记空格或者不要在columns列后面省略一个逗号等。动态语句能够完全解决掉这些痛苦。尽管与动态SQL一起工作不是在开一个party,但是MyBatis确实能通过在任何映射SQL语句中使用强大的动态SQL来改进这些状况。

动态SQL元素对于任何使用过JSTL或者类似于XML之类的文本处理器的人来说,都是非常熟悉的。在上一版本中,需要了解和学习非常多的元素,但在MyBatis 3 中有了许多的改进,现在只剩下差不多二分之一的元素。MyBatis使用了基于强大的OGNL表达式来消除了大部分元素。

特点:

  • 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
  • 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql基本上可以实现我们不使用数据访问框架可以实现的所有功能,或许更多。
  • 解除sql与程序代码的耦合:通过提供DAL层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
  • 提供映射标签,支持对象与数据库的orm字段关系映射
  • 提供对象关系映射标签,支持对象关系组建维护
  • 提供xml标签配置方式,支持编写动态sql。

MyBatis3.x官方文档地址如下:

http://www.mybatis.org/mybatis-3/zh/index.html

GitHub地址如下:

https://github.com/mybatis/mybatis-3

MyBatis相关工具地址如下:

http://mybatis.tk/

MyBatis和Hibernate相比,优势在哪里?

https://www.zhihu.com/question/21104468

在工程中配置MyBatis

要使用 MyBatis, 只需将 mybatis-x.x.x.jar 包置于 classpath 中即可。如果使用 Maven 来构建项目,则需在pom.xml文件中,配置依赖如下:

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
    <!-- mysql的包 -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.44</version>
    </dependency>
    <!-- Mybatis的包 -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.4.5</version>
    </dependency>
  </dependencies>

然后在工程的resource目录下,创建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">
        <!-- 可配置多个数据库连接池,id的值为default的值则表示该数据库为默认的 -->
        <environment id="development">
            <!-- 事务管理器 -->
            <transactionManager type="JDBC"/>
            <!-- 配置数据源,POOLED表示使用数据库连接池 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql:///school"/>
                <property name="username" value="root"/>
                <property name="password" value="your_password"/>
            </dataSource>
        </environment>
    </environments>
    <!-- 映射文件路径配置 -->
    <mappers>
        <mapper resource="org/zero01/student/StudentMapper.xml"/>
    </mappers>
</configuration>

我这里有一个student表格,内容如下:
技术分享图片

然后编写一个student表格字段的封装类:

package org.zero01.student;

public class Student {

    private int sid;
    private String sname;
    private int age;
    private String sex;
    private String address;

    ... getter setter 略 ...
}

下面我们将用一个简单的demo来演示如何使用MyBatis完成增、删、查、改这项工作。所以接着我们就需要创建相应的映射文件,以及编写sql语句,如下示例:

<?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">
<!-- Student类的包名 -->
<mapper namespace="org.zero01.Student">
    <!-- 插入;id的值可以自定义,但是必须是唯一的。parameterType的值为该sql语句所需的参数对象 -->
    <insert id="insertStudent" parameterType="org.zero01.student.Student">
        insert into student(sname,age,sex,address) values(#{sname},#{age},#{sex},#{address})
    </insert>
    <!-- 删除;parameterType的值可以是pojo也可以是基本数据类型 -->
    <delete id="deleteStu" parameterType="int">
        delete from student where sid=#{0}
    </delete>
    <!-- 查询;resultType的值为该sql语句返回的数据的封装类型 -->
    <select id="selectAll" resultType="org.zero01.student.Student">
        select * from student
    </select>
    <!-- 更新; -->
    <update id="updateStu" parameterType="org.zero01.student.Student" >
        update student set sname=#{sname}, age=#{age}, address=#{address} where sid=#{sid}
    </update>
</mapper>

以上我们的基本配置以及sql语句都已经完成了,接下来在工程的test目录下创建一个测试类来进行单元测试。如下示例:

package org.zero01.test;

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.After;
import org.junit.Before;
import org.junit.Test;
import org.zero01.student.Student;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class TestMyBatis {

    private SqlSession sqlSession;

    // 加载资源
    @Before
    public void testStart() throws IOException {
        // 配置文件路径
        String confPath = "mybatis-config.xml";
        // 读取配置文件得到输入流
        InputStream inputStream = Resources.getResourceAsStream(confPath);
        // 创建sql Session工厂对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 建立与数据库的会话,我们的基本操作都是通过该对象完成
        sqlSession = sqlSessionFactory.openSession();
    }

    // 关闭资源
    @After
    public void testEnd() {
        if (sqlSession != null) {
            // 结束与数据库的会话
            sqlSession.close();
        }
    }
}

在类中新增一个测试方法,该方法用于查询表格中的所有数据并在控制台中打印出来,代码如下:

@Test
public void testSelect() {
    // 通过sqlSession对象,我们可以调用增、删、查、改等方法。而selectList方法用于查询多条记录,所以返回的是一个List对象,该方法参数的值就是我们在映射文件里配置的id,前面要加上Student类的全名
    List<Student> students = sqlSession.selectList("org.zero01.Student.selectAll");
    System.out.println("id	sname	age	sex	address");
    for (Student student : students) {
        System.out.print(student.getSid() + "	");
        System.out.print(student.getSname() + "	");
        System.out.print(student.getAge() + "	");
        System.out.println(student.getSex() + "	");
        System.out.print(student.getAddress() + "
");
    }
}

执行该测试方法后,控制台打印结果:

id  sname   age sex address
1   Mark    26  男   香港
2   Joen    18  男   上海
4   Jack    20  男   北京
5   Kila    20  男   广州
6   Aimi    19  女   广州
7   Miax    16  女   深圳
10  Ailen   20  女   安徽

然后我们再来新增一个测试方法,用来测试update语句,示例:

@Test
public void testUpdate() {
    Student student = new Student();
    student.setSid(10);
    student.setSname("Zero");
    student.setAge(22);
    student.setAddress("杭州");

    // 直接把pojo对象传递过去就可以了
    int result = sqlSession.update("org.zero01.Student.updateStu", student);
    Assert.assertNotEquals(result, 0);

    // 除查询以外的语句都需要提交事务
    sqlSession.commit();
    System.out.println("影响的行数为:" + result);
}

执行该测试方法后,更新字段成功:
技术分享图片

控制台打印结果:

影响的行数为:1

再来新增一个测试方法,用来测试insert语句,示例:

@Test
public void insert() {
    Student student = new Student();
    student.setSname("Liron");
    student.setAge(21);
    student.setSex("男");
    student.setAddress("天津");

    int result = sqlSession.insert("org.zero01.Student.insertStudent", student);
    Assert.assertNotEquals(result, 0);

    sqlSession.commit();
    System.out.println("插入数据成功,影响的行数为:" + result);
}

执行该测试方法后,插入数据成功:
技术分享图片

控制台打印结果:

插入数据成功,影响的行数为:1

最后就是新增一个测试delete语句的方法了,如下示例:

@Test
public void delete() {
    int result = sqlSession.delete("org.zero01.Student.deleteStu", 1);
    Assert.assertNotEquals(result, 0);

    sqlSession.commit();
    System.out.println("删除数据成功,影响的行数为:" + result);
}

执行该测试方法后,删除数据成功:
技术分享图片

控制台打印结果:

删除数据成功,影响的行数为:1

小结:

从以上简单的示例,我们可以看到,当我们在工程中使用了MyBatis之后,只需要关注业务代码以及自定义的sql语句即可。不需要再去关心类似于数据库连接对象的开启关闭或者逐个将字段数据封装到对象里的这些繁琐的操作,这也是使用框架的好处,能简化我们的开发,提高开发的效率,也大大降低了代码的冗余。当然,这也是其中一个最浅显的好处而已,每个框架都有自己的特点,都有我们值得学习的地方。

初识mybatis

MyBatis简介MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apachesoftwarefoundation迁移到了googlecode,并且改名为MyBatis。2013年11月迁移到Github。iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供... 查看详情

mybatis基础学习—初识mybatis

一、MyBatis是什么?    MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apachesoftwarefoundation迁移到了googlecode,并且改名为MyBatis,实质上Mybatis对ibatis进行一些改进。    MyBatis是一个优秀的持久层框架... 查看详情

初识mybatis之入门案例

我也是自学了一下,在idea中基于maven的mybatis的配置。有什么不对的地方,请指正,谢谢。 1.1咋们先来配置测试一下,配置mybatis的图解: 1.2pom.xml需要mybatis的依赖节点,节点如下:1<dependencies>2<dependency>3<groupId&... 查看详情

初识mybatis

Mybatis1.持久化持久化,就是内存数据和硬盘数据状态的转换2.ORM思想ObjectRelationMapping对象关系映射3.MyBatis入门案例3.1导入jar包依赖 <!--MySQL配置--><dependency><groupId>MySQL</groupId><artifactId>mysql-connector-j 查看详情

mybatis解读系列-初识

mybaits简单介绍    MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。   MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射... 查看详情

mybatis之旅第一篇-初识mybatis

一、JDBC的问题为什么我们要使用mybatis,是因为JDBC存在以下问题1、数据库连接创建、释放频繁造成系统资源浪费,从而影响系统性能。如果使用数据库连接池可解决此问题。2、Sql语句在代码中硬编码,造成代码不易维护,实际... 查看详情

初识mybatis(代码片段)

初识MyBatis什么是MyBatisMyBatis是一个支持普通SQL查询、储存过程以及高级映射的持久层框架,它消除了几乎所有的JDBC代码和参数的手动设置以及结果集的检索,并使用简单的XML或注解进行配置和原始映射,用以将接口... 查看详情

初识mybatis

框架技术  使用框架构建项目,当确定使用哪个技术框架后,就已经有了一个“半成品”,然后在这个半成品上填上内容,完成任务需求。  框架技术的优点:     (1)不用再考虑公共问题,框架已经帮我们... 查看详情

初识mybatis及第一个mybatis程序(基于maven创建)(代码片段)

MyBatis简介1、什么是MyBatisMyBatis是一款优秀的持久层矿建它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或者注解来配置和映射原生类型、接口... 查看详情

初识mybatis-generator(代码片段)

详细请见: http://www.mybatis.org/generator/quickstart.html使用mybatis-generator-core-x.x.x.jar加上配置文件来生成1.建立配置文件D:\temp\test.xml (详细配置见官网)说明:connectionURL中jdbc:sqlserver://192.168.xx.xx:端口;database 查看详情

初识mybatis,第一个简单的mybatis项目(代码片段)

 声明:I‘m 初学者,这是我对mybytis的初步认识这是一个简单的不能再简单的初级Mybatis项目,它可以使我们连接数据库更加容易,思路更加清晰。我这里用一个图来解释一下: 开始创建这个项目:  这是我项... 查看详情

初识框架之mybatis

一、什么是框架  1)传统的JDBC编程    JDBC作为Java语言连接数据库的一个重要的技能点,不可否认的是在一个程序中,如果我们需要多次进行与数据库的交互,那我们所需要的重复操作就就会有很多:      1.加载... 查看详情

初识mybatis框架,实现增删改查等操作

此第一次接触Mybatis框架确实是有点不适应,特别是刚从Hibernate框架转转型过来,那么为什么要使用Mybatis框架,Mybatis框架和Hibernate框架又有什么异同呢?这个问题在我的另一篇blogs中有专门的讲解,今天我主要是带着大家来探讨... 查看详情

第6章初识mybatis(代码片段)

6.1什么是MyBatisMybatis(前身是iBatis)是一个支持普通SQL查询、存储过程以及高级映射的持久层框架。MyBatis框架也被称为ORM(Object/RelationalMapping,即对象关系映射)框架,所谓的ORM就是一种为了解决面向对象与关系型数据库中数据... 查看详情

mybatis-plus——初识mybatis的增强框架mp(代码片段)

文章目录:1.写在前面2.MP的第一个案例1.1insert1.2update1.3delete1.4select1.写在前面在持久层框架中,MyBatis的应用还是比较多的,而且比重在逐渐的上升。通常项目的组合框架是SSM。那么MyBatis之所以火,是因为它的灵活... 查看详情

初识springmvc

SpringMVC简介ssm:mybatis+Spring+SpringMVCMVC三层架构javaSE:基础需要认真学习javaWeb:也是基础需要认真学习SSM框架:研究官方文档,锻炼自学能力,锻炼笔记能力,锻炼项目能力SpringMVC+VUE+SpringBoot+SpringCloud+LinuxSSM整合的一个项目=javaWeb做项... 查看详情

mybatis框架入门

初识mybatis对原生jdbc程序(单独使用jdbc开发)问题总结mybatis框架原理mybatis入门程序用户的增删查改mybatis开发dao两种方法原始dao开发方法(程序需要编写dao接口和dao实现类)mybatis的mapper接口(相当于dao接口)代理开发方法mybatis... 查看详情

mybatis学习初始mybatis

本文借鉴:MyBatis【快速入门】(特此感谢!)初识MyBatis一、MyBatis简介  MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apachesoftwarefoundation迁移到了googlecode,并且改名为MyBatis,是一个基于Java的持久层框架。持久层:可以... 查看详情