MyBatis 简介

MyBatis 是一个开源、轻量级的数据持久化框架,是 JDBC 和 Hibernate 的替代方案。MyBatis 内部封装了 JDBC,简化了加载驱动、创建连接、创建 statement 等繁杂的过程,开发者只需要关注 SQL 语句本身。

  • 持久层: 可以将业务数据存储到磁盘,具备长期存储能力,只要磁盘不损坏,在断电或者其他情况下,重新开启系统仍然可以读取到这些数据。
  • 优点: 可以使用巨大的磁盘空间存储相当量的数据,并且很廉价
  • 缺点:慢(相对于内存而言)

为什么使用 MyBatis

在我们传统的 JDBC 中,我们除了需要自己提供 SQL 外,还必须操作 Connection、Statment、ResultSet,不仅如此,为了访问不同的表,不同字段的数据,我们需要些很多雷同模板化的代码,闲的繁琐又枯燥

而我们在使用了 MyBatis 之后,只需要提供 SQL 语句就好了,其余的诸如:建立连接、操作 Statment、ResultSet,处理 JDBC 相关异常等等都可以交给 MyBatis 去处理,我们的关注点于是可以就此集中在 SQL 语句上,关注在增删改查这些操作层面上。

并且 MyBatis 支持使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

搭建 MyBatis 环境

在实际开发之前,我们必须为 MyBatis 搭建适当的环境。下面介绍 MyBatis 的下载以及目录结构。

MyBatis下载

在 MyBatis 的官方网站 http://mybatis.org,可以下载到最新版本的 MyBatis,本教程使用版本为 MyBatis 3.5.5。

如果您打不开网站或下载进度较慢,可以通过 https://github.com/mybatis/mybatis-3/releases 网址下载。

官方还提供了文档: 戳这里,虽然感觉写得一般,但还是有一些参考价值…唉,别当教程看,当字典看!

下载好 MyBatis 的包解压后,可以得到以下的文件目录:

其中 mybatis-3.5.9.jar 包就是 MyBatis 的项目工程包,【lib】文件夹下就是 MyBatis 项目需要依赖的第三方包,pdf 文件是它英文版的说明,不要英文也可以戳上面的链接。

之后在使用 MyBatis 框架时,需要把它的核心包和依赖包引入到应用程序中。如果是 Web 应用,只需将核心包和依赖包复制到 /WEB-INF/lib 目录中。

如果您使用的 Maven,那么 pom.xml 文件内容如下(根据自己的版本修改相应的内容)。

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.mybatis</groupId>
  4. <artifactId>mybatis</artifactId>
  5. <version>3.5.6</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>mysql</groupId>
  9. <artifactId>mysql-connector-java</artifactId>
  10. <version>5.1.46</version>
  11. </dependency>
  12. </dependencies>

第一个MyBatis程序

在创建 MyBatis 项目之前,首先创建 t_user 数据表,SQL 语句如下。

  1. DROP TABLE IF EXISTS `t_user`;
  2. CREATE TABLE `t_user` (
  3. `id` int(11) NOT NULL AUTO_INCREMENT,
  4. `username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  5. `password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  6. PRIMARY KEY (`id`) USING BTREE
  7. ) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

创建 MyBatis 程序的步骤为:

  1. 配置 MyBatis 环境
  2. 编写MyBatis核心配置文件
  3. 创建实体类
  4. 创建DAO接口
  5. 创建SQL映射文件
  6. 编写测试类

下面介绍如何使用 IDEA 创建一个简单的 MyBatis 程序。

  1. 创建 Web 应用,部署 jar 包(建议 Maven导入,使用 Maven 创建 Web 项目的方法:Click Here

    在 IDEA 中创建 Web 项目 MyBatis-quick,并将下载的 MyBatis 的核心 jar 包、依赖 jar 包以及 MySQL 数据库的驱动 jar 包复制到 /WEB-INF/lib 目录中。

  2. 创建日志文件

    MyBatis 默认使用 log4j 输出日志信息,如果开发者需要查看控制台输出的 SQL 语句,可以在 classpath 路径下配置其日志文件。在 MyBatis-quick 的 src 目录下创建 log4j.properties 文件,其内容如下:

    1. ### direct log messages to stdout ###
    2. log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    3. log4j.appender.stdout.Target=System.out
    4. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    5. log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
    6. ### direct messages to file mylog.log ###
    7. log4j.appender.file=org.apache.log4j.FileAppender
    8. log4j.appender.file.File=c:/mylog.log
    9. log4j.appender.file.layout=org.apache.log4j.PatternLayout
    10. log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
    11. ### set log levels - for more verbose logging change 'info' to 'debug' ###
    12. log4j.rootLogger=debug, stdout

    在日志文件中配置了全局的日志配置、MyBatis 的日志配置和控制台输出,其中 MyBatis 的日志配置用于将 com.riotian 包下所有类的日志记录级别设置为 DEBUG。该配置文件内容不需要开发者全部手写,可以从 MyBatis 使用手册中的 Logging 小节复制,然后进行简单修改。

  3. 创建持久化类

    在 src 目录下创建一个名为 com.riotian.domainn 的包,在该包中创建持久化类 User。注意,在类中声明的属性与数据表 User 的字段一致。

    1. package com.riotian.domain;
    2. public class User {
    3. private int id;
    4. private String username;
    5. private String password;
    6. /* get and set */
    7. @Override
    8. public String toString() {
    9. return "User{" +
    10. "id=" + id +
    11. ", username='" + username + '\'' +
    12. ", password='" + password + '\'' +
    13. '}';
    14. }
    15. }
  4. 创建映射文件

    在 resources 目录下创建 【com/riotian/mapper】包,在该包下创建映射文件 UserMapper.xml

    UserMapper.xml 文件内容如下:

    1. <?xml version="1.0" encoding="UTF-8" ?>
    2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    3. <mapper namespace="userMapper">
    4. <!--删除操作-->
    5. <delete id="delete" parameterType="int">
    6. delete from user where id=#{abc}
    7. </delete>
    8. <!--修改操作-->
    9. <update id="update" parameterType="com.riotian.domain.User">
    10. update user set username=#{username},password=#{password} where id=#{id}
    11. </update>
    12. <!--插入操作-->
    13. <insert id="save" parameterType="com.riotian.domain.User">
    14. insert into user values(#{id},#{username},#{password})
    15. </insert>
    16. <!--查询操作-->
    17. <select id="findAll" resultType="user">
    18. select * from user
    19. </select>
    20. <!--根据id进行查询-->
    21. <select id="findById" resultType="user" parameterType="int">
    22. select * from user where id=#{id}
    23. </select>
    24. </mapper>

    上述代码中,<mapper> 元素是配置文件的根元素,它包含了 namespace 属性,该属性值通常设置为“包名+SQL映射文件名”,用于指定唯一的命名空间。

    子元素 <select>、<insert> 中的信息用于执行查询、添加操作。在定义的 SQL 语句中,“#{}”表示一个占位符,相当于“?”,而“#{name}”表示该占位符待接收参数的名称为 name。

  5. 创建配置文件

    MyBatis 核心配置文件主要用于配置数据库连接和 MyBatis 运行时所需的各种特性,包含了设置和影响 MyBatis 行为的属性。

    在 src 目录下创建 MyBatis 的核心配置文件 mybatis-config.xml,在该文件中配置了数据库环境和映射文件的位置,具体内容如下:

    1. <?xml version="1.0" encoding="UTF-8" ?>
    2. <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
    3. <configuration>
    4. <!--通过properties标签加载外部properties文件-->
    5. <properties resource="jdbc.properties"></properties>
    6. <!--自定义别名-->
    7. <typeAliases>
    8. <typeAlias type="com.riotian.domain.User" alias="user"></typeAlias>
    9. </typeAliases>
    10. <!--数据源环境-->
    11. <environments default="developement">
    12. <environment id="developement">
    13. <transactionManager type="JDBC"></transactionManager>
    14. <dataSource type="POOLED">
    15. <property name="driver" value="${jdbc.driver}"/>
    16. <property name="url" value="${jdbc.url}"/>
    17. <property name="username" value="${jdbc.username}"/>
    18. <property name="password" value="${jdbc.password}"/>
    19. </dataSource>
    20. </environment>
    21. </environments>
    22. <!--加载映射文件-->
    23. <mappers>
    24. <mapper resource="com/riotian/mapper/UserMapper.xml"></mapper>
    25. </mappers>
    26. </configuration>

    上述映射文件和配置文件都不需要读者完全手动编写,都可以从 MyBatis 使用手册中复制,然后做简单修改。

    为了方便管理以后各框架集成所需的配置文件,可以在项目工程下新建 Source Folder 类型的 resources 目录,并在此目录下添加 MyBatis 的核心配置文件,默认文件名为 " configuration.xml"。但需要注意的是,为了方便在框架集成时更好地区分各个配置文件,我们一般将此文件名命名“mybatis-config.xml”,该文件用于配置数据库连接信息和 MyBatis 的参数。

  6. 创建测试类

    在 test 目录下创建一个名为 Test 的包,在该包中创建 MyBatisTest 测试类。在测试类中首先使用输入流读取配置文件,然后根据配置信息构建 SqlSessionFactory 对象。

    接下来通过 SqlSessionFactory 对象创建 SqlSession 对象,并使用 SqlSession 对象的方法执行数据库操作。 MyBatisTest 测试类的代码如下:

    1. package Test;
    2. import com.riotian.domain.User;
    3. import org.apache.ibatis.io.Resources;
    4. import org.apache.ibatis.session.SqlSession;
    5. import org.apache.ibatis.session.SqlSessionFactory;
    6. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    7. import org.junit.Test;
    8. import java.io.IOException;
    9. import java.io.InputStream;
    10. import java.util.List;
    11. public class test {
    12. @Test
    13. //查询一个对象
    14. public void test5() throws IOException {
    15. //获得核心配置文件
    16. InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
    17. //获得session工厂对象
    18. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
    19. //获得session回话对象
    20. SqlSession sqlSession = sqlSessionFactory.openSession();
    21. //执行操作 参数:namespace+id
    22. User user = sqlSession.selectOne("userMapper.findById", 1);
    23. //打印数据
    24. System.out.println(user);
    25. //释放资源
    26. sqlSession.close();
    27. }
    28. @Test
    29. //删除操作
    30. public void test4() throws IOException {
    31. //获得核心配置文件
    32. InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
    33. //获得session工厂对象
    34. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
    35. //获得session回话对象
    36. SqlSession sqlSession = sqlSessionFactory.openSession();
    37. //执行操作 参数:namespace+id
    38. sqlSession.delete("userMapper.delete",2);
    39. //mybatis执行更新操作 提交事务
    40. sqlSession.commit();
    41. //释放资源
    42. sqlSession.close();
    43. }
    44. @Test
    45. //修改操作
    46. public void test3() throws IOException {
    47. //模拟user对象
    48. User user = new User();
    49. user.setId(2);
    50. user.setUsername("lucy");
    51. user.setPassword("123");
    52. //获得核心配置文件
    53. InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
    54. //获得session工厂对象
    55. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
    56. //获得session回话对象
    57. SqlSession sqlSession = sqlSessionFactory.openSession();
    58. //执行操作 参数:namespace+id
    59. sqlSession.update("userMapper.update",user);
    60. //mybatis执行更新操作 提交事务
    61. sqlSession.commit();
    62. //释放资源
    63. sqlSession.close();
    64. }
    65. @Test
    66. //插入操作
    67. public void test2() throws IOException {
    68. //模拟user对象
    69. User user = new User();
    70. user.setUsername("xxx");
    71. user.setPassword("abc");
    72. //获得核心配置文件
    73. InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
    74. //获得session工厂对象
    75. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
    76. //获得session回话对象
    77. SqlSession sqlSession = sqlSessionFactory.openSession(true);
    78. //执行操作 参数:namespace+id
    79. sqlSession.insert("userMapper.save",user);
    80. //mybatis执行更新操作 提交事务
    81. //sqlSession.commit();
    82. //释放资源
    83. sqlSession.close();
    84. }
    85. @Test
    86. //查询操作
    87. public void testFindId() throws IOException {
    88. //获得核心配置文件
    89. InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
    90. //获得session工厂对象
    91. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
    92. //获得session回话对象
    93. SqlSession sqlSession = sqlSessionFactory.openSession();
    94. // 执行操作 参数 namespace + id
    95. List<User> userList = sqlSession.selectList("userMapper.findAll");
    96. // 打印数据
    97. System.out.println(userList);
    98. // 释放资源
    99. sqlSession.close();
    100. }
    101. }

MyBatis CRUD 操作小结

增删改查映射配置与API

  1. // 查询数据
  2. List<User> userList = sqlSession.selectList("userMapper.findAll");
  1. <select id="findAll" resultType="com.itheima.domain.User">
  2. select * from User
  3. </select>
  1. // 添加数据
  2. sqlSession.insert("userMapper.add", user)
  1. <insert id="add" parameterType="com.itheima.domain.User">
  2. insert into user values(#{id},#{username},#{password})
  3. </insert>
  1. // 修改数据
  2. sqlSession.update("userMapper.update", user);
  1. <update id="update" parameterType="com.itheima.domain.User">
  2. update user set username=#{username},password=#{password} where id=#{id}
  3. </update>
  1. // 删除数据
  2. sqlSession.delete("userMapper.delete",3);
  1. <delete id="delete" parameterType="java.lang.Integer">
  2. delete from user where id=#{id}
  3. </delete>

此外还有一些常用的总结:

  • 关于 parameterType: 就是用来在 SQL 映射文件中指定输入参数类型的,可以指定为基本数据类型(如 int、float 等)、包装数据类型(如 String、Interger 等)以及用户自己编写的 JavaBean 封装类
  • 关于 resultType: 在加载 SQL 配置,并绑定指定输入参数和运行 SQL 之后,会得到数据库返回的响应结果,此时使用 resultType 就是用来指定数据库返回的信息对应的 Java 的数据类型。
  • 关于 “#{}” : 在传统的 JDBC 的编程中,占位符用 “?” 来表示,然后再加载 SQL 之前按照 “?” 的位置设置参数。而 “#{}” 在 MyBatis 中也代表一种占位符,该符号接受输入参数,在大括号中编写参数名称来接受对应参数。当 “#{}” 接受简单类型时可以用 value 或者其他任意名称来获取。
  • **关于 “\({}” :** 在 SQL 配置中,有时候需要拼接 SQL 语句(例如模糊查询时),用 “#{}” 是无法达到目的的。在 MyBatis 中,“\${}” 代表一个 “拼接符号” ,可以在原有 SQL 语句上拼接新的符合 SQL 语法的语句。使用 “\${}” 拼接符号拼接 SQL ,会引起 SQL 注入,所以一般不建议使用 “\){}”。
  • MyBatis 使用场景: 通过上面的入门程序,不难看出在进行 MyBatis 开发时,我们的大部分精力都放在了 SQL 映射文件上。 MyBatis 的特点就是以 SQL 语句为核心的不完全的 ORM(关系型映射)框架。与 Hibernate 相比,Hibernate 的学习成本比较高,而 SQL 语句并不需要开发人员完成,只需要调用相关 API 即可。这对于开发效率是一个优势,但是缺点是没办法对 SQL 语句进行优化和修改。而 MyBatis 虽然需要开发人员自己配置 SQL 语句,MyBatis 来实现映射关系,但是这样的项目可以适应经常变化的项目需求。所以使用 MyBatis 的场景是:对 SQL 优化要求比较高,或是项目需求或业务经常变动。

MyBatis核心配置文件概述

MyBatis 的配置文件用于配置数据库相关的设置,比如读取哪个数据库,事物管理方式,映射等。

以下的代码是MaBatis的XML配置文件的层次结构,需要注意的是这些层次结构不能够出现颠倒,否则在解析时会出现异常。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <configuration> <!--配置-->
  3. <porperties/><!--属性-->
  4. <settings/><!--设置 -->
  5. <typeAliases/><!--类型命名 -->
  6. <TypeHandlers/><!-- 类型处理器-->
  7. <objectFactory/><!--对象工厂-->
  8. <plugins/><!--插件-->
  9. <environments><!--配置环境-->
  10. <environment><!--环境变量-->
  11. <transactionManager/><!--事物管理器-->
  12. <datasource><!--数据源-->
  13. </environment><!--环境变量-->
  14. </environments><!--配置环境-->
  15. <databaseIdProcider><!--数据库厂商标识-->
  16. <mappers/><!--映射器-->
  17. </configuration> <!--配置-->

参考文章

MyBatis:快速入门的更多相关文章

  1. MyBatis学习总结(一)——MyBatis快速入门

    一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以 ...

  2. MyBatis快速入门

    一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以 ...

  3. MyBatis学习总结(一)——MyBatis快速入门(转载)

    本文转载自http://www.cnblogs.com/jpf-java/p/6013537.html MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了 ...

  4. MyBatis入门学习教程-MyBatis快速入门

    一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以 ...

  5. MyBatis学习总结(一)——MyBatis快速入门

    一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以 ...

  6. 【转】MyBatis学习总结(一)——MyBatis快速入门

    [转]MyBatis学习总结(一)——MyBatis快速入门 一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC ...

  7. MyBatis学习总结-MyBatis快速入门的系列教程

    MyBatis学习总结-MyBatis快速入门的系列教程 [MyBatis]MyBatis 使用教程 [MyBatis]MyBatis XML配置 [MyBatis]MyBatis XML映射文件 [ ...

  8. MyBatis学习笔记(一)——MyBatis快速入门

    转自孤傲苍狼的博客:http://www.cnblogs.com/xdp-gacl/p/4261895.html 一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优 ...

  9. Java基础-SSM之mybatis快速入门篇

    Java基础-SSM之mybatis快速入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 其实你可能会问什么是SSM,简单的说就是spring mvc + Spring + m ...

  10. MyBatis学习总结(1)——MyBatis快速入门

    一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以 ...

随机推荐

  1. Util应用框架基础(七) - 缓存

    本节介绍Util应用框架如何操作缓存. 概述 缓存是提升性能的关键手段之一. 除了提升性能,缓存对系统健壮性和安全性也有影响. 不同类型的系统对缓存的依赖程度不同. 对于后台管理系统,由于是给管理人员 ...

  2. HTML5实战—canvas绘图之贝塞尔曲线

    1.二次贝塞尔曲线 quadraticCurveTo(cpx,cpy,x,y) //cpx,cpy表示控制点的坐标, x,y表示终点坐标: 数学公式表示如下: 二次方贝兹曲线的路径由给定点P0.P1. ...

  3. MAUI Blazor 如何通过url使用本地文件

    前言 上一篇文章 MAUI Blazor 显示本地图片的新思路 中, 提出了通过webview拦截,从而在前端中显示本地图片的思路.不过当时还不完善,随后也发现了很多问题.比如, 不同平台上的url不 ...

  4. 如何利用Excel/WPS表格制作智能成绩查询系统?

    要利用Excel或WPS表格制作智能成绩查询系统,可以按照以下步骤进行: 1. 设计数据库结构:确定需要存储的学生信息和成绩数据,包括姓名.学号.科目.分数等字段. 2. 创建数据表:在Excel或W ...

  5. MySQL8.0 安装教程

    一.下载 1.官网地址 MySQL :: Download MySQL Community Server 2.选择安装包安装方式 3.选择安装版本 4.开始下载 5.下载成功 二.安装 1.双击安装包 ...

  6. 前端异步编程——async/await

    async 从字面上看就是"异步",它放在函数定义之前,是使该函数在调用时开一个子线程,以不影响主线程的运行. 而 await 经常和 async 组合使用,在 async 定义的 ...

  7. 37. 干货系列从零用Rust编写负载均衡及代理,负载均衡中try_files实现

    wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,七层负载均衡,内网穿透,后续将实现websocket代 ...

  8. Linux的一些的常用命令

    小杰笔记: 记录一下Linux的一些常见命令: 1:Linux关机与重启的命令: shutdown:关机 shutdown -h 30 30秒后关机 reboot 重启 sync:将数据由内存同步到硬 ...

  9. javascript中的标识符(JS)

    1.在javascript(JS)中所有的可以由我们自主命名的都可以称为是标识符. 例如:变量名.函数名.属性名都属于标识符. 2.标识符命名一个标识符时需要遵守如下的规则: 1.标识符中可以含有字母 ...

  10. Java 并发编程(六)并发容器和框架

    传统 Map 的局限性 HashMap JDK 1.7 的 HashMap JDK 1.7 中 HashMap 的实现只是单纯的 "数组 + 链表 " 的组合方式,具体的组成如下: ...