MyBatis一款后起之秀的持久层框架ORM,支持自定义SQL、存储过程和高级映射,相对于Hibernate算是半自动化的框架,在国内行业内非常流行。

常规的JDBC操作,配置相应的数据库连接的信息,比如账户密码等,应用加载数据库驱动并手动创建数据库连接,编写业务sql并设置其入参生成Statement对象用于执行,获取结果数据集,及时释放持有资源,再对结果集进行数据处理。

加载驱动、创建连接、返回结果、释放资源等等都是重复的体力活,为了不把自己忙碌成代码的搬运工,这些都可以封装由框架去做,而自己关注最核心的业务层,也就是sql相关的逻辑。

把业务相关的sql逻辑配置在mapper.xml文件中,包括入参和返回的结果集,这其中会涉及到数据库中的字段和Java对象的字段之间的映射,一般如果字段名和类型相同可以通过MyBatis的自动映射即可,如果差别较大,则需要手动映射,甚至自定义类型处理typeHandlers。

每个MyBatis的应用都会以一个SqlSessionFacotry的实例为核心的,SqlSessionFacotryBuilder通过build加载核心配置文件mybatis-config.xml,从而创建SqlSessionFacotry,再由SqlSessionFacotry创建SqlSession。

核心配置文件mybatis-config.xml包含mapper.xml文件,在SqlSessionFacotryBuilder加载核心配置文件时一同加载进来,形成Configuration实例,其中mapper.xml的每个select/update/insert/delete节点都会最终生成MappedStatement对象,简单理解就是对应的完整sql语句,类似JDBC的Statement角色。

实际上核心配置文件除了包含mapper.xml,还包含数据库连接、事务、类型别名、类型处理器、插件、环境配置等等。

1准备工作:创建数据库和项目

创建数据库脚本

CREATE DATABASE `mybatisdemo`;USE mybatisdemo;CREATE TABLE `user` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(20) DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 

创建maven项目,并在pom中添加mybatis和mysql驱动依赖包

<dependency>  <groupId>org.mybatisgroupId>  <artifactId>mybatisartifactId>  <version>3.5.5version>dependency><dependency>  <groupId>MySQLgroupId>  <artifactId>mysql-connector-javaartifactId>  <version>5.1.40version>dependency>

2添加核心配置文件mybatis-config.xml

<?xml  version="1.0" encoding="UTF-8" ?>configuration        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"        "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration>  <environments default="development">    <environment id="development">

      <transactionManager type="JDBC"/>      <dataSource type="POOLED">          <property name="driver" value="com.mysql.jdbc.Driver"/>          <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatisdemo"/>          <property name="username" value="root"/>          <property name="password" value="123456"/>      dataSource>    environment>  environments>

  <mappers>    <mapper resource="UserMapper.xml">mapper>  mappers>configuration>

3UserMapper.xml的配置

包含了插入数据的insert和查询数据的select,其中插入式通过设置useGeneratedKeys为true,返回自增id。

<?xml  version="1.0" encoding="UTF-8" ?>mapper        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"        "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.zhaiqianfeng.user.UserMapper">

  <insert id="insertUser" useGeneratedKeys="true" keyProperty="id">    insert into user(name) values(#{name})  insert>

  <select id="getUserById" resultMap="userMap">    select * from user where id = #{id}  select>

  <resultMap id="userMap" type="com.zhaiqianfeng.user.User">    <result property="id" column="id">result>    <result property="name" column="name">result>  resultMap>mapper>

4UserMapper.xml相对应Dao

UserMapper.java的代码如下,包含了相应插入和查询接口

package com.zhaiqianfeng.user;

public interface UserMapper {    User getUserById(int id);    int insertUser(User user);}

5创建SqlSession并验证

一切都准备好之后,开始创建SqlSession并执行

public static void main( String[] args ) throws IOException {  String config= "mybatis-config.xml";  InputStream inputStream= Resources.getResourceAsStream(config);  //SqlSessionFactoryBuilder加载核心(+mapper)配置文件并创建SqlSessionFactory  SqlSessionFactory sqlSessionFactory=     new SqlSessionFactoryBuilder().build(inputStream);

  //创建SqlSession  try(SqlSession sqlSession=sqlSessionFactory.openSession()) {    //获取mapper    UserMapper mapper = sqlSession.getMapper(UserMapper.class);

    User user = new User();    user.setName("chris");

    //执行操作    mapper.insertUser(user);    sqlSession.commit(); //flush    System.out.println("获取自增id:" + user.getId());

    user = mapper.getUserById(user.getId());    System.out.println("刚刚入库的user对象" + user);  }}

此时的项目结构是这样的

运行main之后打印

获取自增id:1

刚刚入库的user对象User(id=1, name=chris)

查看数据库

6优化

由于本例中的数据库表字段和Java对象的字段名一致,所以在UserMapper.xml中的resultMap可以省略,直接用resultType,mybatis会悄悄自动映射生成resultMap,省略后如

<?xml  version="1.0" encoding="UTF-8" ?>mapper        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"        "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.zhaiqianfeng.user.UserMapper">  <insert id="insertUser" useGeneratedKeys="true" keyProperty="id">    insert into user(name) values(#{name})  insert>  <select id="getUserById" resultType="com.zhaiqianfeng.user.User">    select * from user where id = #{id}  select>mapper>

还可以再简化,比如使用别名替换权限定名(com.zhaiqianfeng.user.User)等。

PS:本篇文章主要是通过漫画和图并结合对比常规JDBC来讲解MyBatis的原理和设计目标,比较适合新手阅读,感谢阅读。

源码地址:https://github.com/zhaiqianfeng/codeceo-demo/tree/master/mybatis/mybatis-demo-1

End

版权归@码农神说所有,转载须经授权,翻版必究

转载可联系助手,微信号:codeceo-01

往期精彩


 辟谣:程序员不配谈恋爱?你错的可以!真相来了 面试官:CAP都搞不清楚,别跟我说你懂微服务! 互联网人的娱乐精神之28岁退休 & P8和生活助理的故事 千万不能让程序员给娃娃取名字 漫画 | 啊哈,给我一碗孟婆汤 人工智能之机械基 WC,接到一个阎王的需求

jdbc 自增id 原理_给“小白”漫画+图示讲解MyBatis原理,就问香不香!相关推荐

  1. jdbc 自增id 原理_面试被问分布式ID怎么办? 滴滴(Tinyid)甩给他

    点击" 程序员内点事 "关注,选择" 设置星标 " 坚持学习,好文每日送达! 引言 接着<一口气说出 9种 分布式ID生成方式,面试官有点懵了>来继 ...

  2. java断点续传原理_很简单的Java断点续传实现原理

    原理解析 在开发当中,"断点续传"这种功能很实用和常见,听上去也是比较有"逼格"的感觉.所以通常我们都有兴趣去研究研究这种功能是如何实现的? 以Java来说,网 ...

  3. jsp jdbc mysql增删改查_使用JSP+SERVLET+JDBC实现对数据库的增删改查(详细)

    专业 response.setCharacterEncoding("UTF-8"); request.setCharacterEncoding("UTF-8") ...

  4. jdbc mysql增删改查_使用JDBC连接MySQL数据库操作增删改查

    更多精彩内容欢迎访问我的个人博客皮皮家园:http://www.zhsh666.xyz或者http

  5. rocketmq原理_彻底看懂RocketMQ事务实现原理

    面试中经常会问到比如RocketMQ的事务是如何实现的呢?学习框架,我们不仅要熟练使用,更要掌握设计及原理,才算熟悉一个框架. 1 RocketMQ 事务使用案例 public class Creat ...

  6. mysql工具分页原理_高效的mysql分页方法及原理

    首先看一下分页的基本原理: 复制代码 代码如下: mysql> explain SELECT * FROM message ORDER BY id DESC LIMIT 10000, 20G * ...

  7. ai人工智能换脸原理_他们如何看待AI监视内部工作原理

    ai人工智能换脸原理 Large scale intelligent surveillance systems used by governments and corporates have attr ...

  8. mysql安装原理_全面解读MySQL主从复制,从原理到安装配置

    为什么需要主从复制? 1.在业务复杂的系统中,有这么一个情景,有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了 ...

  9. nacis服务注册原理_服务注册和发现之Eureka原理篇

    概念 在传统应用组件间调用,通过接口规范约束来实现的,从而实现不同模块间良好协作:但是被拆分成微服务后,每个微服务实例的数量和网络地址都可能动态变化,使得原来硬编码的地址极不方便,故需要一个中心化的组 ...

最新文章

  1. win10 rabbitMQ的安装与测试
  2. linux 通知链,Linux内核通知链notifier
  3. 内核中设置文件结束符_Linux 日志文件系统原来是这样工作的
  4. 650 storm 铃木v_铃木公升级V缸拉力V-strom 1050国内公布!高配版预售价14.98万
  5. python软件是免费的吗-python属于软件吗
  6. bitMap保存图片
  7. cross join 一张表没有值关联不出来数据_你是否还在对left join、right join和join有困扰呢?...
  8. IDEA Git更新
  9. python随机颜色代码_python绘制随机颜色太阳花
  10. 如何在JavaWeb程序中使用tld文件
  11. 每日涉猎技术点存档(2018年6月)
  12. React-CRON表达式生成器
  13. 百度换肤怎么实现的html,JavaScript 实现百度换肤功能
  14. 如何删除远程桌面计算机ip,远程桌面连接IP地址清除方法
  15. 2022年CPU天梯图(7月更新)
  16. pytorch训练Class-Balanced Loss
  17. linux docker启动指定字符集,【字符集】解决docker 容器中中文乱码问题
  18. 转载出不明了。太恐怖了!什么都能查!!(转)
  19. 08第3周回顾:Sun成开源梦幻企业 甲骨文结束并购长征
  20. Android 简单几步实现手机号码归属地查询,可监听文本框的变化自动查询

热门文章

  1. python 简单图像处理(13) 二值图腐蚀和膨胀,开运算、闭运算
  2. 青龙羊毛——小虎饿了(偷的)
  3. 75 Zabbix中文乱码问题
  4. 三、神兽变变变(下)
  5. php和java的语法区别_PHP 和 Java 的主要区别有哪些?
  6. 计算机音乐作曲排名2019,2019金曲排行榜_2019《全球华人歌曲排行榜》年度五强名单公布...
  7. matlab求xk符号解,matlab符号运算习题
  8. ++库 照片风格转换风格_怦然心动的小清新风格照片拍摄,这四点很关键
  9. admui3字体无法删除_被微信好友删除、拉黑还不知?这3个方法可以自查,看完涨知识了...
  10. C++11学习之share_ptr和weak_ptr