架构分析


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

该图引用于51CTO

借助于该架构图我们可以发现,Mybatis的功能架构分为三层:

(1)API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。

(2)数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。

(3) 基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。

作为持久层框架,mybatis可以将程序中的大量sql语句剥离出来,配置在配置文件中,实现sql的灵活配置。可以将sql语句和代码分离,无需修改代码,在配置文件中修改配置文件即可到达修改sql的目的。

开发人员面对的是纯粹的java对象,和hibernate的orm思想一致。但对于具体的数据操作,hibernate会自动生成sql语句,而mybatis使用的时候,需要开发人员编写配置文件,将sql所需要的参数和返回的结果字段映射到具体的pojo。


maven依赖

为了方便,构建的是maven项目,需要的依赖分别有:

  1. junit     (java单元测试依赖)
  2. mybatis(mybatis依赖)
  3. mysql   (mysql数据库依赖)
  4. log4j    (日志信息依赖)
  1. <dependencies>
  2. <dependency>
  3. <groupId>junit</groupId>
  4. <artifactId>junit</artifactId>
  5. <version>3.8.1</version>
  6. <scope>test</scope>
  7. </dependency>
  8.  
  9. <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
  10. <dependency>
  11. <groupId>org.mybatis</groupId>
  12. <artifactId>mybatis</artifactId>
  13. <version>3.4.1</version>
  14. </dependency>
  15.  
  16. <dependency>
  17. <groupId>mysql</groupId>
  18. <artifactId>mysql-connector-java</artifactId>
  19. <version>5.1.1</version>
  20. </dependency>
  21.  
  22. <!-- https://mvnrepository.com/artifact/log4j/log4j -->
  23. <dependency>
  24. <groupId>log4j</groupId>
  25. <artifactId>log4j</artifactId>
  26. <version>1.2.17</version>
  27. </dependency>
  28.  
  29. </dependencies>

建立数据库

为了测试mybatis的功能,首先建立一个简单的数据库,比较简单,数据库字段含义不再赘述。

  1. create database mybatis;
  2.  
  3. use mybatis;
  4.  
  5. CREATE TABLE `tb_user` (
  6. `id` int(11) NOT NULL AUTO_INCREMENT,
  7. `name` varchar(18) DEFAULT NULL,
  8. `sex` char(2) DEFAULT NULL,
  9. `age` int(11) DEFAULT NULL,
  10. PRIMARY KEY (`id`)
  11. )

建立pojo对象

在这里建立了一个非常简单的pojo类,用于测试mybatis的功能。

  1. /**
  2. * fayuan.com Inc.
  3. * Copyright (c) 2017-2018 All Rights Reserved.
  4. */
  5. package com.fayuan.domain;
  6.  
  7. /**
  8. * 用户类
  9. *
  10. * @author fayuan.fzw
  11. * @version $Id: User.java, v 0.1 2018年02月18日 上午11:05 fayuan.fzw Exp $
  12. */
  13. public class User {
  14.  
  15. /** id */
  16. private int id;
  17.  
  18. /** 姓名 */
  19. private String name;
  20.  
  21. /** 性别 */
  22. private String sex;
  23.  
  24. /** 年龄 */
  25. private int age;
  26.  
  27. public User(String name, String sex, int age) {
  28. this.name = name;
  29. this.sex = sex;
  30. this.age = age;
  31. }
  32.  
  33. public int getId() {
  34. return id;
  35. }
  36.  
  37. public void setId(int id) {
  38. this.id = id;
  39. }
  40.  
  41. public String getName() {
  42. return name;
  43. }
  44.  
  45. public void setName(String name) {
  46. this.name = name;
  47. }
  48.  
  49. public String getSex() {
  50. return sex;
  51. }
  52.  
  53. public void setSex(String sex) {
  54. this.sex = sex;
  55. }
  56.  
  57. public int getAge() {
  58. return age;
  59. }
  60.  
  61. public void setAge(int age) {
  62. this.age = age;
  63. }
  64. }

  这个类其实就是一个普通的javaBean,mybatis使用pojo类作为持久化类,这也是mybatis低侵入设计的关键。mybatis不需要持久化类继承任何父类,或者实现接口,可以保证代码的无侵入无污染。


pojo和数据库表字段映射

为了实现pojo和数据表中字段的映射,需要通过配置文件来配置具体的映射。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  4. <!-- namespace指用户自定义的命名空间。 -->
  5. <mapper namespace="com.fayuan.mapper.UserMapper">
  6.  
  7. <!--
  8. id="save"是唯一的标示符
  9. parameterType属性指明插入时使用的参数类型
  10. useGeneratedKeys="true"表示使用数据库的自动增长策略
  11. -->
  12. <insert id="save" parameterType="com.fayuan.domain.User" useGeneratedKeys="true">
  13. insert into tb_user (name,sex,age) VALUES (#{name},#{sex},#{age})
  14. </insert>
  15.  
  16. <!-- select操作
  17. parameterType="int"表示该查询语句需要一个int类型的参数
  18. resultType="user"表示返回的是一个user对象 -->
  19. <select id="select" parameterType="int" resultType="User">
  20. select * from tb_user where id=#{id}
  21. </select>
  22.  
  23. <!-- update操作
  24. parameterType="user"表示该更新语句需要一个user对象作为参数-->
  25. <update id="update" parameterType="User">
  26. update tb_user set name= #{name},sex= #{sex},age=#{age} where id= #{id}
  27. </update>
  28.  
  29. <!-- delete操作
  30. parameterType="int"表示该查询语句需要一个int类型的参数-->
  31. <delete id="delete" parameterType="int">
  32. delete from tb_user where id=#{id}
  33. </delete>
  34.  
  35. </mapper>

在这里一次性添加了增、删、查、改的映射关系,为了实现每一部分的功能,对于每一部分单独写一个测试类。

插入

  1. /**
  2. * Alipay.com Inc.
  3. * Copyright (c) 2004-2018 All Rights Reserved.
  4. */
  5. package com.fayuan.test;
  6.  
  7. import java.io.InputStream;
  8.  
  9. import com.fayuan.domain.User;
  10. import org.apache.ibatis.io.Resources;
  11. import org.apache.ibatis.session.SqlSession;
  12. import org.apache.ibatis.session.SqlSessionFactory;
  13. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  14.  
  15. /**
  16. * 测试插入功能
  17. *
  18. * @author fayuan.fzw
  19. * @version $Id: InsertTest.java, v 0.1 2018年02月19日 下午4:02 fayuan.fzw Exp $
  20. */
  21. public class InsertTest {
  22. public static void main(String[] args) throws Exception {
  23.  
  24. //读取mybatis-config.xml文件
  25. InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
  26.  
  27. //初始化mybatis,创建SqlSessionFactory类的实例
  28. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  29.  
  30. //创建Session实例
  31. SqlSession sqlSession = sqlSessionFactory.openSession();
  32.  
  33. //创建User对象
  34. User user = new User ("fayuan","男",24);
  35.  
  36. //插入数据
  37. sqlSession.insert("com.fayuan.mapper.UserMapper.save", user);
  38.  
  39. //提交事务
  40. sqlSession.commit();
  41.  
  42. //关闭session
  43. sqlSession.close();
  44. }
  45. }

打印出来的日志:

  1. DEBUG [main] - ==> Preparing: insert into tb_user (name,sex,age) VALUES (?,?,?)
  2. DEBUG [main] - ==> Parameters: fayuan(String), 男(String), 24(Integer)
  3. DEBUG [main] - <== Updates: 1

查找

  1. /**
  2. * fayuan.com Inc.
  3. * Copyright (c) 2017-2018 All Rights Reserved.
  4. */
  5. package com.fayuan.test;
  6.  
  7. import com.fayuan.domain.User;
  8. import com.fayuan.factory.SqlSessionFactoryClass;
  9. import org.apache.ibatis.session.SqlSession;
  10.  
  11. /**
  12. * 测试查找功能
  13. *
  14. * @author fayuan.fzw
  15. * @version $Id: SelectTest.java, v 0.1 2018年02月24日 下午11:19 fayuan.fzw Exp $
  16. */
  17. public class SelectTest {
  18. public static void main(String[] args) {
  19.  
  20. //获取Session实例
  21. SqlSession sqlSession = SqlSessionFactoryClass.getSqlSession();
  22.  
  23. // 创建User对象
  24. User user = sqlSession.selectOne("com.fayuan.mapper.UserMapper.select", 1);
  25.  
  26. System.out.println("name = " + user.getName() + ", sex = " + user.getSex() +", age = " + user.getAge());
  27.  
  28. //提交事务
  29. sqlSession.commit();
  30.  
  31. //关闭Session
  32. sqlSession.close();
  33. }
  34. }

打印出来的日志:

  1. DEBUG [main] - ==> Preparing: select * from tb_user where id=?
  2. DEBUG [main] - ==> Parameters: 1(Integer)
  3. DEBUG [main] - <== Total: 1

修改

  1. /**
  2. * fayuan.com Inc.
  3. * Copyright (c) 2017-2018 All Rights Reserved.
  4. */
  5. package com.fayuan.test;
  6.  
  7. import com.fayuan.domain.User;
  8. import com.fayuan.factory.SqlSessionFactoryClass;
  9. import org.apache.ibatis.session.SqlSession;
  10.  
  11. /**
  12. * 测试修改功能
  13. * @author fayuan.fzw
  14. * @version $Id: UpdateTest.java, v 0.1 2018年02月24日 下午11:03 fayuan.fzw Exp $
  15. */
  16. public class UpdateTest {
  17. public static void main(String[] args) {
  18.  
  19. //获取Session实例
  20. SqlSession sqlSession = SqlSessionFactoryClass.getSqlSession();
  21.  
  22. // 根据id查询User对象
  23. User user = sqlSession.selectOne("com.fayuan.mapper.UserMapper.select",1);
  24. // 修改User对象的属性值
  25. user.setName("tom");
  26. user.setAge(25);
  27. // 修改User对象
  28. sqlSession.update("update", user);
  29. // 提交事务
  30. sqlSession.commit();
  31. // 关闭Session
  32. sqlSession.close();
  33. }
  34. }

打印出来的日志:

  1. DEBUG [main] - ==> Preparing: select * from tb_user where id=?
  2. DEBUG [main] - ==> Parameters: 1(Integer)
  3. DEBUG [main] - <== Total: 1
  4. DEBUG [main] - ==> Preparing: update tb_user set name= ?,sex= ?,age=? where id= ?
  5. DEBUG [main] - ==> Parameters: tom(String), ?(String), 25(Integer), 1(Integer)
  6. DEBUG [main] - <== Updates: 1

删除

  1. /**
  2. * fayuan.com Inc.
  3. * Copyright (c) 2017-2018 All Rights Reserved.
  4. */
  5. package com.fayuan.test;
  6.  
  7. import com.fayuan.factory.SqlSessionFactoryClass;
  8. import org.apache.ibatis.session.SqlSession;
  9.  
  10. /**
  11. * 测试删除功能
  12. *
  13. * @author fayuan.fzw
  14. * @version $Id: DeleteTest.java, v 0.1 2018年02月24日 下午11:55 fayuan.fzw Exp $
  15. */
  16. public class DeleteTest {
  17. public static void main(String[] args) throws Exception {
  18.  
  19. // 获得Session实例
  20. SqlSession session = SqlSessionFactoryClass.getSqlSession();
  21. // 删除id为1的User对象
  22. session.delete("com.fayuan.mapper.UserMapper.delete", 1);
  23. // 提交事务
  24. session.commit();
  25. // 关闭Session
  26. session.close();
  27. }
  28.  
  29. }

打印出来的日志:

  1. DEBUG [main] - ==> Preparing: delete from tb_user where id=?
  2. DEBUG [main] - ==> Parameters: 1(Integer)
  3. DEBUG [main] - <== Updates: 1 

问题总结:

  • 配置文件位置声明
  • pojo需要加上无参构造,否则在内部的反射机制是无法获得pojo对象的
  • 使用log4j观察执行状况
  • aliases的使用
  • 其他配置(pool、别名......)

关于mybatis的思考(1)——mybatis的使用实例的更多相关文章

  1. MyBatis学习(一)、MyBatis简介与配置MyBatis+Spring+MySql

    一.MyBatis简介与配置MyBatis+Spring+MySql 1.1MyBatis简介 MyBatis 是一个可以自定义SQL.存储过程和高级映射的持久层框架.MyBatis 摒除了大部分的J ...

  2. MyBatis学习总结(七)——Mybatis缓存(转载)

      孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(七)--Mybatis缓存 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的 ...

  3. MyBatis学习 之 一、MyBatis简介与配置MyBatis+Spring+MySql

    目录(?)[-] 一MyBatis简介与配置MyBatisSpringMySql MyBatis简介 MyBatisSpringMySql简单配置 搭建Spring环境 建立MySql数据库 搭建My ...

  4. MyBatis简介与配置MyBatis+Spring+MySql

    MyBatis学习 之 一.MyBatis简介与配置MyBatis+Spring+MySql MyBatis学习 之 二.SQL语句映射文件(1)resultMap MyBatis学习 之 二.SQL ...

  5. 【转】MyBatis学习总结(七)——Mybatis缓存

    [转]MyBatis学习总结(七)——Mybatis缓存 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualC ...

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

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

  7. 使用Mybatis Generator自动生成Mybatis相关代码

    本文将简要介绍怎样利用Mybatis Generator自动生成Mybatis的相关代码: 一.构建一个环境: 1. 首先创建一个表: CREATE TABLE pet (name VARCHAR(2 ...

  8. Mybatis特殊字符处理,Mybatis中xml文件特殊字符的处理

    Mybatis特殊字符处理,Mybatis中xml文件特殊字符的处理 >>>>>>>>>>>>>>>>& ...

  9. mybatis系列笔记(1)---mybatis入门

    mybatis入门   MyBatis是什么? MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了goog ...

随机推荐

  1. Symbol 实现属性私有化的方式

    //一般通过私有变量来保存私有属性 通过原型方法(getSex)来访问该属性 实现该属性只能被访问无法直接改变属性值 const Person = (function(){ let _sex = &q ...

  2. python 3.x 实现简单用户登录

    import os import sys import getpass login_username = 'admin' login_password = ' u = 0 while u < 3 ...

  3. [收藏转]由于CredSSP加密Oracle修正 导致远程桌面报错处理

    原文:https://blog.csdn.net/lanwilliam/article/details/80346792 由于win103月份的一个更新,导致mstsc突然无法连接服务器了,报错如标题 ...

  4. 20155238 2016-2017-2 《Java程序设计》第六周学习总结

    教材学习内容总结 第十章 串流设计 输入串流:将数据从来源取出. 输出串流:将数据写入目的地. 输入串流代表对象为java.io.InputStream实例 输出串流代表对象为java.io.Outp ...

  5. 【转载】CString、BSTR和LPCTSTR之间的区别

    原文:http://www.cnblogs.com/GT_Andy/archive/2011/01/18/1938605.html 一.定义 1.CString:动态的TCHAR数组.它是一个完全独立 ...

  6. Kubernetes学习之路(二)之ETCD集群二进制部署

    ETCD集群部署 所有持久化的状态信息以KV的形式存储在ETCD中.类似zookeeper,提供分布式协调服务.之所以说kubenetes各个组件是无状态的,就是因为其中把数据都存放在ETCD中.由于 ...

  7. imu标定 imu_tk

    1. 首先标定加速度计,这是imu加速度计xyz三个轴在标定过程中的读数: 标定结果: 2. 利用加速度计的标定结果,标定陀螺仪,结果: 也可以使用港科大开源的一个工具: https://github ...

  8. Codeforces 914 C 数位DP+暴力打表+思维

    题意 给出一个二进制数\(n\),每次操作可以将一个整数\(x\)简化为\(x\)的二进制表示中\(1\)的个数,如果一个数简化为\(1\)所需的最小次数为\(k\),将这个数叫做特殊的数, 问从\( ...

  9. sublime常用方法

    1.如何打开一个文件夹? project----->Add Folder to Project 2.如何同一个窗口下进行分屏操作? 使用快捷键:shift+Alt+2 3.如何使html代码进行 ...

  10. css快速入门-引入方式

    一.概述 HTML是骨架.框架CSS是外表.衣服JS是动作.肌肉 css的主要作用是对元素进行渲染.1.找到要操作的标签(选择器)2.对定位的标签进行操作(属性) 二.CSS引入方式 1.行内式 &l ...