第一个Mybatis程序

在JDBC小结中(可以参阅本人JDBC系列文章),介绍到了ORM,其中Mybatis就是一个不错的ORM框架
MyBatis由iBatis演化而来
iBATIS一词来源于“internet”和“abatis”的组合,是一个由Clinton Begin在2001年发起的开放源代码项目。于2010年6月16号被谷歌托管,改名为MyBatis。
是一个基于SQL映射支持Java和·NET的持久层框架。
 
MyBatis是一个优秀的持久层框架,对JDBC操作数据库进行了封装,封装后的Mybatis使应用程序开发者只需要关注SQL本身
完全不需要再次花精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码(最初的Mybatis环境搭建只需要立项之初配置即可)
  • 要求通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来
  • 并通过java对象和statement中的sql进行映射生成最终执行的sql语句
  • mybatis框架执行sql并将结果映射成java对象并返回。
项目环境搭建好之后我们需要做的就是通过XML或者注解将要执行的SQL配置起来,也就是仅仅关注SQL
 
中文版文档
github地址
截止本文,最新版本为:mybatis-3.4.6
 
本文不涉及架构解析,首先演示了一个最简单的示例,然后以这个简单示例为基础,简单介绍了从外部看过去的Mybatis的呈现样子
帮助简单了解Mybatis

第一个Mybatis程序

1.新建项目

新建一个Java 项目
我取名为mybatis,并且新建了一个包 first

2.包获取与导入

基础的两个包
mybatis 和 mysql-connector(因为要用MYSQL) ,可以从官方下载  
https://dev.mysql.com/downloads/connector/j/
https://github.com/mybatis/mybatis-3/releases

3.数据库准备

本人已经有本地数据库,MYSQL,以student表为测试
  1. CREATE TABLE `student` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `name` varchar(255) NOT NULL DEFAULT '默认姓名' COMMENT '姓名',
  4. `age` int(11) DEFAULT '1',
  5. `sex` varchar(255) DEFAULT NULL,
  6. `random` int(11) DEFAULT NULL,
  7. PRIMARY KEY (`id`)
  8. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
数据库信息为:
    String user = "root";
    String password = "123456";
    String url = "jdbc:mysql://localhost:3306/sampledb?useUnicode=true&characterEncoding=utf-8";

4.配置文件设置

src下新建config,然后新建xml文件名为mybatis-config.xml
内容从官方文档中复制:  http://www.mybatis.org/mybatis-3/zh/getting-started.html 
如下图所示官方示例的配置XML

5.SQL映射文件设置

src下新建mapper文件夹,创建xml文件名为myBatis.xml
内容从官方文档复制
 

6.调整配置文件

主要任务就是将数据库链接信息设置准确,并且将SQL映射文件的位置设置准确
 
对于url的设置需要注意“&”符号,在xml的配置文件中 要用  &   代替&
这是XML的语法本身的问题与mybatis没关系
 
五个在XML文档中预定义好的实体:
&lt; < 小于号
&gt; > 大于号
&amp; & 和
&apos; ' 单引号
&quot; " 双引号
实体必须以符号"&"开头,以符号";"结尾

7.创建实体类Student

8.修改myMapper.xml文件

需要调整namespace 设置resultType类型,需要设置使用的sql

9.测试

每一次的业务开发时,其实需要的仅仅是编写myMapper.xml文件,然后对其调用
环境配置等工作环境搭建之初就已经完成了

初识Mybatis

在第一个Mybatis程序示例中的代码几乎都是官方文档中的,根据官方的提示一步一步操作即可建立
 
不管是Mybatis还是JDBC还是其他,终归是需要连接数据库的,不管以何种形式,连接以后就是需要执行SQL,所以你还得准备好你想要执行的SQL
在Mybatis中,SQL以XML文件的形式设置 ,也就是上例中的myMapper.xml文件
所以在上例中的主配置文件mybatis-config.xml中我们配置了数据库的连接信息以及SQL XML文件的位置
每个基于Mybatis的应用都是以一个SqlSessionFactory的实例为中心的,这一部分核心的配置文件就是提供给SqlSessionFactory实例的。
 
既然是操作数据库,很重要的一部分自然是SQL语句
mapper文件的格式是什么?对于一个SQL到底是查询还是delete?返回类型是什么?如下图所示,我们的类型是first.Student,SQL的内容又是什么?
此处不深入,但是很显然,对于Mybatis mapper映射文件的编写是很重要的一部分学习内容
 
有了核心配置文件就可以构建SqlSessionFactory实例,通过SqlSessionFactory实例就可以获取到SqlSession对象
SqlSession是Mybatis最重要的构建之一,可以简单的认为Mybatis一系列的配置目的是生成类似 JDBC生成的Connection对象的SqlSession对象
有了这个“Connection”对象之后才能进一步与数据库进行交流
这个“Connection”对象就可以根据我们mapper xml配置文件中设置的标识符,比如上例中的selectStudent的全名,以及参数执行SQL
如上图所示,我们从头简单的理一下Mybatis的基本流程
需要两个重要信息:数据库配置以及mapper文件位置
通过这两个核心信息可以生成SqlSessionFactory,通过SqlSessionFactory就可以创建SqlSession
SqlSession就可以根据名称标识符识别需要执行哪个文件里面的哪个SQL,比如上面就是执行mapper/myMapper.xml文件中,标识符为selectStudent的那一条
而执行该SQL以及周边的信息,都在文件中指定了,比如SQL内容是什么?返回类型又是什么?
 
通过配置文件到SqlSessionFactory实例的创建,完成了宏观上Mybatis的配置,两个主要任务:
  • 要从哪个数据库进行操作?
  • 要操作的SQL在哪里?
通过SqlSession完成了具体一次执行的任务
  • 执行哪个SQL?通过层级的命名标识符定位
  • 执行SQL的细节信息有哪些?SQL内容,参数内容,返回类型等
 
比如现在的中国好声音,形式变化了
所有的参赛选手在等待大厅内坐等,所有的人的姓名和演唱曲目形成了歌单,导师点歌的形式选择选手表演。
这个过程很类似Mybatis的处理
 
所有的选手形成了一个等待集合,这就相当于是一系列的mapper.xml文件,每个选手都有一个名字,这就相当于是一个文件(一个文件名,或者说一个命名空间)
但是重名的有很多,当导师叫名字 xxx 的时候,其实是在说“本次参加中国好声音,等待大厅的xxx”,但是不说大家也都知道,说王伟的时候,肯定不会是你身边坐着那个同事
但是程序不知道,这个“本次参加中国好声音,等待大厅的xxx”就相当于上例中namespace="mapper.myMapper"
 
整个节目组,导师,时间,场地等这些环境信息因素构成了整个的节目核心,这些零散的数据就是配置项目
构成的整体就相当于一个运行的机器,这就相当于SqlSessionFactory 
他作为核心知道整个节目组所有的信息,导师的信息等等,学员以及学员表演曲目也呈现在了导师面前
 
当一个导师进行点歌时,就类似SqlSession执行一次数据库操作
导师通过姓名,也就是我们上面说的“一个隐含的命名空间”,进行点歌,选择选手进行表演
这就相当于从等候大厅定位了一个Mapper文件,而他表演的那个曲目就好像是mapper文件中的ID,因为你唱了《止战之殇》,别人也可以再唱一次。
而针对于歌曲自身的更多信息,自然要看你接下来的表演了,是不是改变了?变化了哪些内容等等,这都属于某一个id对应的mapper文件中的具体内容信息。
 
Mybatis核心为配置以及映射
  • 配置信息搭建了Mybatis应用框架
  • 映射设置了一次执行的所需信息
Mybatis细化实现为核心的协调组装
核心信息包含了将要执行的目标数据库信息以及需要执行的SQL映射,有了这两部分信息如果是在Navicat等客户端的话就足够了,使用数据库信息连接,然后执行SQL
对于Mybatis也是足够了,不过代码中毕竟不是可以手动连接数据库,手动输入SQL,肉眼查看结果这么简单
所以还有很多的周边业务需要处理,比如配置文件如何表示?都有哪些属性需要配置?另外MyBatis是一个功能强大的工具,所以还提供了更多的细节调优参数以供设置
对于mapper文件的位置如何描述?
前面示例中使用了上面的形式,另外你也可以指定一个包,比如 下面的形式,那么这个包下面所有的xml都会被扫描,相当于你全部都罗列了出来
  1. <mappers>
  2. <package name="org.mybatis.builder"/>
  3. </mappers>
对于映射如何表述?可以使用XML也还可以使用注解的形式
他们又有哪些语法?每种形式的利弊是什么?字段属性都有哪些?
参数如何设置? 返回结果又是如何设置呢?等等
尽管这一系列的实现都很复杂,但是,仍旧是围绕着核心信息来的
 
所以对于Mybatis的学习,最开始应该了解整体的处理过程,了解各块
然后就是深入学习配置文件以及映射的设置配置
最后就是了解源码的架构
如果还有精力,最好的文档就是源码了
 

附录:完整代码

数据库
  1. CREATE TABLE `student` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `name` varchar(255) NOT NULL DEFAULT '默认姓名' COMMENT '姓名',
  4. `age` int(11) DEFAULT '1',
  5. `sex` varchar(255) DEFAULT NULL,
  6. `random` int(11) DEFAULT NULL,
  7. PRIMARY KEY (`id`)
  8. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

项目结构

mybatis-config.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <environments default="development">
  7. <environment id="development">
  8. <transactionManager type="JDBC"/>
  9. <dataSource type="POOLED">
  10. <property name="driver" value="com.mysql.jdbc.Driver"/>
  11. <property name="url" value="jdbc:mysql://localhost:3306/sampledb?useUnicode=true&amp;characterEncoding=utf-8"/>
  12. <property name="username" value="root"/>
  13. <property name="password" value="123456"/>
  14. </dataSource>
  15. </environment>
  16. </environments>
  17. <mappers>
  18. <mapper resource="mapper/myMapper.xml"/>
  19. </mappers>
  20. </configuration>

myMapper.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="mapper.myMapper">
  6. <select id="selectStudent" resultType="first.Student">
  7. select * from student where id = #{id}
  8. </select>
  9. </mapper>

Student

  1. package first;
  2.  
  3. public class Student {
  4.  
  5. private Long id;
  6.  
  7. private String name;
  8.  
  9. private Integer age;
  10.  
  11. private String sex;
  12.  
  13. public Long getId() {
  14. return id;
  15. }
  16.  
  17. public void setId(Long id) {
  18. this.id = id;
  19. }
  20.  
  21. public String getName() {
  22. return name;
  23. }
  24.  
  25. public void setName(String name) {
  26. this.name = name;
  27. }
  28.  
  29. public Integer getAge() {
  30. return age;
  31. }
  32.  
  33. public void setAge(Integer age) {
  34. this.age = age;
  35. }
  36.  
  37. public String getSex() {
  38. return sex;
  39. }
  40.  
  41. public void setSex(String sex) {
  42. this.sex = sex;
  43. }
  44.  
  45. @Override
  46. public String toString() {
  47. final StringBuilder sb = new StringBuilder("Student{");
  48. sb.append("id=").append(id);
  49. sb.append(", name='").append(name).append('\'');
  50. sb.append(", age=").append(age);
  51. sb.append(", sex='").append(sex).append('\'');
  52. sb.append('}');
  53. return sb.toString();
  54. }
  55. }

测试代码

  1. package first;
  2. import java.io.InputStream;
  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.  
  8. public class Test {
  9.  
  10. public static void main(String[] args) throws Exception {
  11.  
  12. /*
  13. * 每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的。
  14. * SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。
  15. * 而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先定制的 Configuration 的实例构建出 SqlSessionFactory 的实例。
  16. * */
  17. String resource = "config/mybatis-config.xml";
  18. InputStream inputStream = Resources.getResourceAsStream(resource);
  19. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  20. /*
  21. * 从 SqlSessionFactory 中获取 SqlSession
  22. * */
  23. SqlSession session = sqlSessionFactory.openSession();
  24. try {
  25. Student student = (Student) session.selectOne("mapper.myMapper.selectStudent", 2);
  26. System.out.println(student);
  27. } finally {
  28. session.close();
  29. }
  30. }
  31. }

接口应用

而对于SQL的执行更好的一种方式是使用接口,而不是直接通过字符串去定位需要执行的目标资源
借助于接口不是基于字符串常量的,就会更安全,而且使用接口逻辑概念更加清晰
 
在原有结构上增加一个接口和一个映射文件
 
MyMapper.java
  1. package first;
  2. public interface MyMapper {
  3. Student selectStudent(Integer id);
  4. }
myMapper2.xml
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="first.MyMapper">
  6. <select id="selectStudent" resultType="first.Student">
  7. select * from student where id = #{id}
  8. </select>
  9. </mapper>
从下图可以看得出来接口与XML映射的数据对照关系,XML映射文件的namespace需要与接口的全限定名对应
接口的方法名对应XML映射的id
接口方法返回类型为XML映射的ResultMap(resultType)
接口方法的参数对应XML映射的入参
新增加了一个XML映射文件,需要将路径添加到配置中
增加一个测试类
  1. package first;
  2.  
  3. import java.io.InputStream;
  4. import org.apache.ibatis.io.Resources;
  5. import org.apache.ibatis.session.SqlSession;
  6. import org.apache.ibatis.session.SqlSessionFactory;
  7. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  8.  
  9. public class Test2 {
  10.  
  11. public static void main(String[] args) throws Exception {
  12. /*
  13. * 每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的。
  14. * SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。
  15. * 而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先定制的 Configuration 的实例构建出 SqlSessionFactory 的实例。
  16. * */
  17. String resource = "config/mybatis-config.xml";
  18. InputStream inputStream = Resources.getResourceAsStream(resource);
  19. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream,"development");
  20.  
  21. /*
  22. * 从 SqlSessionFactory 中获取 SqlSession
  23. * */
  24. SqlSession session = sqlSessionFactory.openSession();
  25. try {
  26. MyMapper mapper = session.getMapper(MyMapper.class);
  27. Student student = mapper.selectStudent(2);
  28. System.out.println(student);
  29. } finally {
  30. session.close();
  31. }
  32. }
  33.  
  34. }
关键代码为
  1. MyMapper mapper = session.getMapper(MyMapper.class);
  2. Student student = mapper.selectStudent(2);
结果与前面一致

我的第一个Mybatis程序的更多相关文章

  1. 第一个Mybatis程序示例 Mybatis简介(一)

    在JDBC小结中(可以参阅本人JDBC系列文章),介绍到了ORM,其中Mybatis就是一个不错的ORM框架 MyBatis由iBatis演化而来 iBATIS一词来源于“internet”和“aba ...

  2. 第一个MyBatis程序(博客初写者)

    第一个Mybatis程序 一.环境: 1.JDK1.8 2.MYSQL5.7 3.IDEA 4.MAVEN 3.63 二.Mybatis认识: 1.查看官方文档 https://mybatis.org ...

  3. MyBatis-02-第一个Mybatis程序

    2.第一个Mybatis程序 思路:搭建环境-->导入Mybatis-->编写代码-->测试! 2.1.搭建环境 搭建数据库 CREATE DATABASE `mybatis`; u ...

  4. Mybatis入门及第一个Mybatis程序

    Mybatis笔记整理 所需要的基础知识 JDBC Mysql Java基础 Maven Junit 框架:是有配置文件的.最好的方式:看官网文档 1.简介 1.1.什么是MyBatis 简介 什么是 ...

  5. 由浅入深--第一个MyBatis程序

    话不多说,马上开始我们的第一个Mybatis程序: 第一个程序,当然要参考MyBatis的官网文档来搞,地址如下:https://mybatis.org/mybatis-3/zh/getting-st ...

  6. 使用idea创建第一个Mybatis程序及可能遇到的问题

    第一个Mybatis程序 思路:搭建环境->导入Mybatis->编写代码->执行 搭建环境 创建数据库 CREATE DATABASE `mybatis` USE `mybatis ...

  7. Mybatis【1】-- 第一个Mybatis程序

    1.框架是什么 框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种定义认为,框架是可被应用开发者定制的应用骨架.前者是从应用方面而后者是从目的方面 ...

  8. 第一个MyBatis程序

    最近研究了一些MyBatis技术,虽然工作中还未用到,但是觉得了解一下也是不错的.这里记录了第一个简单的Demo程序,防止自己忘记. 第一步需要配置Mybatis-config.xml文件.注意:这里 ...

  9. MyBatis(一):第一个MyBatis程序

    本文是按照狂神说的教学视频学习的笔记,强力推荐,教学深入浅出1便就懂!b站搜索狂神说即可 https://space.bilibili.com/95256449?spm_id_from=333.788 ...

随机推荐

  1. 30分钟了解如何使用Kafka

    Kafka是当下对海量数据提供了最佳支持的MQ中间件,无论是高并发的处理,还是依托zookeeper的水平拓展都有不俗的特性.由于公司最近也在尝试如何将它应用到开发中以对业务更好的支撑,因此特地分享一 ...

  2. RabbitMQ入门_07_Fanout 与 Topic

    A. 用广播的方式实现发布订阅 参考资料:https://www.rabbitmq.com/tutorials/tutorial-three-java.html Fanout 类型的 Exchange ...

  3. bcompare Linux版 无限试用

    需要root权限.   # mv /usr/bin/bcompare /usr/bin/bcompare.real # cat /usr/bin/bcompare #!/bin/sh rm " ...

  4. 链表排序 Sort List

    2018-08-11 23:50:30 问题描述: 问题求解: 解法一.归并排序 public ListNode sortList(ListNode head) { if (head == null ...

  5. 雷林鹏分享:Ruby 变量

    Ruby 变量 变量是持有可被任何程序使用的任何数据的存储位置. Ruby 支持五种类型的变量.您已经在前面的章节中大概了解了这些变量,本章节将为您详细讲解这五种类型的变量. Ruby 全局变量 全局 ...

  6. Tips for Sync Vimtex and PDF

    vimtex synctex: \lv. skim synctex: to display the TeX source line corresponding to a point in the PD ...

  7. nyoj38

    布线问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 南阳理工学院要进行用电线路改造,现在校长要求设计师设计出一种布线方式,该布线方式需要满足以下条件:1.把所有 ...

  8. UVA-701 The Archeologists' Dilemma (数论)

    题目大意:给了一个2^E的前缀n,已知前缀n的位数不到2^E的位数的一半,找出满足条件的最小E. 题目解析:设2^E为i位数,则有n*10^i<2^E<(n+1)*10^i.解不等式得到i ...

  9. After reading a picture than out a picture

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletExcepti ...

  10. 小程序数组型图片自适应效果的实现(交流QQ群:604788754)

    //本例代码如有问题,请加群,下载今日日期文件,测试.(如对本例有疑问,也可加群咨询群主) WXML: <view class="imgbox"> <block ...